BLOG main image
FunnyPR (32)
OpenGL (20)
PatternRecognition (7)
Tips (2)
XML (1)
DataMining (1)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2014. 5. 4. 17:03

■ OpenGL: Geometric and Vertex


지오메트릭은 머 도형이라고 이해하면 좋다. 그리고 버텍스는 꼭지점이다. 즉 꼭지점을 알고 있으면 선으로 연결하여 도형을 만들 수 있는 관계가 성립된다. 


OpenGL에서 도형을 만들기 위한 방법으로 

 - 지원되는 함수 사용

 - glBegin - glEnd를 통해 그리기 

가 있는 것 같다. 하지만 이 함수보다 효율적으로 빠르게 도형을 만들기 위해서 버텍스 배열을 사용한다고 한다. 한번 알아 보자 어떻게 하는지


1. OpenGL에서 Vertex 사용 방법

step 1: 디스크 파일 또는 알고리즘을 통해 지오메트리 데이터를 읽어 배열에 저장

    - 위치 또는 도형에 대한 vertex 정보를 담은 vertex 배열을 선언한다. 


step 2: Vertex 배열 사용 설정 

    - OpenGL은 클라이언트(CPU)와 서버(그래픽 하드웨어)등 두가지 방법으로 동작함.

    - 클라이언드 모드에서 Vertex 배열 사용 설정 함수 

          - glEnableClientState(GL_VERTEX_ARRAY) / glDisableClientState(GL_VERTEX_ARRAY) : 활성함수와 비활설 함수 짝을 이룬다.

void glEnableClientState(GLenum  cap);

Specifies the capability to enable. Symbolic constants GL_COLOR_ARRAY, GL_EDGE_FLAG_ARRAY, GL_FOG_COORD_ARRAY, GL_INDEX_ARRAY, GL_NORMAL_ARRAY, GL_SECONDARY_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY, and GL_VERTEX_ARRAY are accepted.

http://www.opengl.org/sdk/docs/man2/xhtml/glEnableClientState.xml

step 3: 배열의 형태 지정(vertex, color, normal vector, etc.)

vertex 배열을 선언하고 사용하겠다라고 예기했으니 데이터를 얻을라면 어디 버텍스 정보를 가져다 써라라고 해줘야 함. 아래와 같은 여러 함수가 있는데 입맛에 따라서 골라서 써야 함. 복잡하지만 정리하면 다음과 같음

================================================================================================

- GLint size: 좌표 타입을 구성하는 요소(두개 -x,y 세개-x,y,z 내게-x,y,z,w) 

- CLenum Type: 실수 인지 정수인지 데이터 포멧(GLfloat)

- GLsizei stride: stride is the byte offset between consecutive vertexes. If stride is 0, the vertices are understood to be tightly packed in the array.(배열에서 가져올때 간격을 말하는듯, 0이면 배열 0,1,2..,N 이렇게 순차적으로 가져오고 만약 1이면 0, 2, 4, ...,N 요렇게? 가져 올듯)

- GLvoid *pointer: 데이터를 가져올 Vertex 배열 

================================================================================================

void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

void glIndexPointer(GLenum type, GLsizei  stride, const GLvoid *pointer);

void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);

void glTexCoordPointer(GLint size, GLenum type, GLsizei stride,  const GLvoid *pointer);

void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);

void glVertexPointer(GLint size, GLenumtype, GLsizei stride, const GLvoid *pointer); //버텍스 위치 정보

Command

Sizes

Values for type Argument

glVertexPointer

2, 3, 4

GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE

glNormalPointer

3

GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE

glColorPointer

3, 4

GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, GL_DOUBLE

glIndexPointer

1

GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE

glTexCoordPointer

1, 2, 3, 4

GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE

glEdgeFlagPointer

1

no type argument (type of data must be GLboolean)

http://www.felixgers.de/teaching/jogl/vertexArrayData.html


 glVertexPointer(2, GL_FLOAT, 0, Vertex);//좌표 타입 x,y로 구성, 데이터 포멧은 GLfloat, 데이터 간격은 0으로 Vertex 배열에 위치 지정 


step 4: 배열 정보 랜더링 

이제 마지막으로 꼭지점들의 정보를 받았으니 이 정보들을 랜덩링해서 보여주면 된다. 

glDrawArrays(GL_POINTS, 0, 10); // POINT 형식으로 처음 0 번째 부터 10개를 그려라 

glDrawArrays(CLenum 모드, GLint 처음, GLint 개수); 

GLenum 모드: OpenGL 의 Basic Model 중 하나가 되고

GLint 처음: 이전 지정한 vertex 배열에서 시작 주소

GLint 개수: 시작 지점으로 부터 읽을 vertex 의 개수가 됨


2. 예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void C3DScatterPlot::RenderScene(void)
{
   // Clear the window with current clearing color
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glTranslatef(0.0f, 0.0f, -350.0f); //원근 투영을 사용하고 있으므로 z좌표를 뒤로 350 이동하여 보기 
 
    GLfloat Vertex[10][2]; //꼭지점 정보 저장을 위한 2차원 배열 설정
 
    for(int i=0; i<10; i++){ //10개의 x, y 좌표를 랜덤하게 Vertex 배열에 저장
        Vertex[i][0]=(GLfloat)(rand()%50); // y 
        Vertex[i][1]=(GLfloat)(rand()%50); // x
    }
 
    //Vertex 배열 사용 활성화- 클라이언트 모드
    glEnableClientState(GL_VERTEX_ARRAY);
 
    //포인트를 그릴때 크기 지정
    glPointSize(10.0f);
 
  //색상 지정 
    glColor3f(0.0f, 1.0f, 0.0f);
 
    //Vertex 배열 위치 지정 
    glVertexPointer(2, GL_FLOAT, 0, Vertex);
    
    //드로잉
    glDrawArrays(GL_POINTS, 0, 10);
 
}


void glDrawArrays(

GLenum   mode,

GLint   first,

GLsizei   count

);

mode

Specifies what kind of primitives to render. Symbolic constants GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_LINE_STRIP_ADJACENCY, GL_LINES_ADJACENCY, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_TRIANGLE_STRIP_ADJACENCY and GL_TRIANGLES_ADJACENCY are accepted.


first

Specifies the starting index in the enabled arrays.


count

Specifies the number of indices to be rendered.




위에 보면 랜덤으로 x,y 를 저장하고 있는 꼭지점 배열의 정보를 가져와 10의 사이즈를 갖는 Point들이 드로잉 된것을 볼 수 있다. 


http://www.felixgers.de/teaching/jogl/vertexArrayData.html

'OpenGL' 카테고리의 다른 글

OpenGL: Normal Vector  (0) 2014.05.04
OpenGL: Index of Vertex Array  (0) 2014.05.04
OpenGL: gluPerspective, glFrustum  (0) 2014.04.20
OpenGL: Setting Viewport  (0) 2014.04.19
OpenGL: Setting Clipping region  (0) 2014.04.19