glEnableClientState, glDisableClientState, glVertextPointer, glDrawArrays 함수에 대해 알아 보겠습니다.
glEnableClientState, glDisableClientState
OpenGL 함수 이름을 보면 Client 가 포함된 것이 있습니다. 이는 OpenGL이 서버와 클라이언트 모델로 설계되고 구현되었기 때문입니다. 간략하게 설명하자면 서버에서 이미지를 생성하고 클라이언트에서는 생성된 이미지를 출력하는 방식입니다. 그와 관련해 함수명이 붙여진 것입니다. 더 자세한 내용은 OpenGL 도서 및 가이드를 참고하세요. 위의 두 함수는 클라이언트 측 기능을 사용가능 또는 사용하지 않음으로 설정하는 함수입니다. OpenGL|ES 는 기본으로 클라이언트 측 기능을 모두 꺼 놓기 때문에 필요한 기능은 glEnableClientState 로 켜 놓고 사용해야 합니다. 어떤 기능이 필요할 때 Enable로 켜고 기능을 사용한 다음에 Disable로 끄고 하는 패턴으로 사용합니다. 이 두 함수로 설정할 수 있는 클라이언트 측 기능은 아래와 같습니다.
GL_COLOR_ARRAY
이 기능이 활성화되면 glDrawArrays 및 glDrawElements로 폴리곤을 렌더링할 때 glColorPointer로 설정한 색상 배열을 참고하여 렌더링합니다.
GL_NORMAL_ARRAY
이 기능이 활성화되면 glDrawArray 및 glDrawElements로 폴리곤을 렌더링할 때 glNormalPointer로 설정한 법선 배열을 참고하여 렌더링합니다.
GL_POINT_SIZE_ARRAY_OES
이 기능이 활성화되면 점과 점 스프라이트를 렌더링할 때 점 크기 배열을 참고하여 렌더링합니다.
GL_TEXTURE_COORD_ARRAY
이 기능이 활성화되면 glDrawArray 및 glDrawElements로 폴리곤을 렌더링할 때 glTexCoordPointer로 설정한 텍스춰 좌표 배열을 참고하여 렌더링합니다.
GL_VERTEX_ARRAY
이 기능이 활성화되면 glDrawArray 및 glDrawElements로 폰리곤을 렌더링할 때 glVertextPointer로 설정한 정점 배열을 참고하여 렌더링합니다.
glVertextPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
glVertexPointer 는 정점 좌표 데이터를 담고 있는 배열의 메모리 위치를 설정할 때 사용합니다. 정점 당 좌표의 개수, 좌표의 데이터 종류(type) 그리고 한 정점에서 다음 정점까지의 간격(메모리 간격) 을 설정하여 정점 데이터를 담고 있는 배열의 특성을 설정합니다.
- size : 정점 당 좌표의 개수를 지정합니다. 2, 3, 4 중 하나가 되어야 합니다. (x, y, z) 로 정점이 구성되면 3이 됩니다.
- type : 정점을 구성하는 좌표의 데이터 타입을 설정합니다. GL_BYTE, GL_SHORT, GL_FIXED 그리고 GL_FLOAT으로 설정할 수 있습니다.
- stride : 한 정점에서 다음 정점까지의 간격입니다. 만약 이 값이 0이면 하나의 특성만으로 구성된 정점 배열로 인식합니다.( 점 그리기 예제는 위치만 있으므로 0 으로 설정했음)
- pointer : 정점 데이터를 담고 있는 배열에서 첫 정점의 첫 좌표가 있는 메모리 주소입니다.
glDrawArrays(GLenum mode, GLint first, GLsizei count)
glDrawArrays는 여러 원시 기하 도형을 렌더링할 때 사용합니다.
- mode : 렌더링할 원시 기하 도형을 설정합니다. GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES 를 설정할 수 있습니다.
- fist : 배열의 시작 인덱스를 설정합니다.
- count : 렌더링할 개수를 설정합니다.
위의 내용에서 stride와 pointer 내용을 예제를 통해 좀 더 살펴보겠습니다. stride 는 다음 정점까지의 간격입니다. 아래와 같이 위치 말고도 법선, 색상, 텍스춰 좌표 등의 속서을 담은 정점을 정의한 후 각 속성들을 각 배열에 설정해 봅시다.
struct vertex
{
float poisiton[3]; // 위치
float normal[3]; // 법선
float color[3]; // 색상
float texture[2]; // 텍슽춰좌표
};
vertex vlist[150];
glVertexPointer(3, GL_FLOAT, sizeof(vertex), &vlist[0] + 0);
glNormalPointer(3, GL_FLOAT, sizeof(vertex), &vlist[0] + sizeof(float)*3);
glColorPointer(3, GL_FLOAT, sizeof(vertex), &vlist[0] + sizeof(float)*6);
glTexturePointer(2, GL_FLOAT, sizeof(vertex), &vlist[0] + sizeof(float)*9);