Software Development/Graphics

OpenGL IBO를 사용한 큐브 그리기

huiyu 2018. 7. 22. 10:52

먼저 아래를 먼저 이해
1. OpenGL VBO로 큐브그리기
2. OpenGL IBO를 이용한 직사각형 그리기


git : cube_ibo (https://github.com/huiyueun/GraphicsStudy/tree/master/5_sdl_cube_indexed)

사실 IBO를 이용하여 직사각형을 그렸다면,
그걸 이용하여 6면체를 모두 IBO를 통해 그려주면 된다.


먼저 DrawCall을 아래와 같이 변경한다.

기존 임의로 Index의 갯수를 6개 지정했던 코드를 사이즈를 통해 갯수를 알아와서 그리도록 수정했다.

1
2
//glDrawElements(GL_TRAINGLES, 6, GL_UNSIGNED_INT, 0);
glDrawElements(GL_TRIANGLES, (sizeof(cube_elements)/sizeof(unsigned int)), GL_UNSIGNED_INT, 0);
cs


그리고 Index를 사용하기 위해 Vertex Array의 공통된 정점은 모두 제거해준다.
정점을 다루기가 까다로운데.. 직접그려가면서 하면 정점 이해하기가 쉽다.

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
31
32
33
static const float cube_vertices[] = {
        /* front surface is blue */
        -0.5,  0.50.5,
        -0.5-0.50.5,
         0.5-0.50.5,
         0.5,  0.50.5,
        /* left surface is green */
        -0.5,  0.5,  0.5,
        -0.5,  0.5-0.5,
        -0.5-0.5-0.5,
        -0.5-0.5,  0.5,
        /* top surface is red */
        -0.50.50.5,
         0.50.50.5,
         0.50.5-0.5,
        -0.50.5-0.5,
        /* right surface is yellow */
         0.5,  0.5-0.5,
         0.5,  0.5,  0.5,
         0.5-0.5,  0.5,
         0.5-0.5-0.5,
        /* back surface is cyan */
        -0.5,  0.5-0.5,
         0.5,  0.5-0.5,
         0.5-0.5-0.5,
        -0.5-0.5-0.5,
        /* bottom surface is magenta */
        -0.5-0.5-0.5,
        -0.5-0.5,  0.5,
         0.5-0.5,  0.5,
         0.5-0.5-0.5,
};
 
cs

각 면당 6개(x3)였던 정점이 4개씩 만들어준다(6*6*3 =108 --> 4*6*3=72개의 정점으로 줄어든다.)


그 후 각 정점의 인덱스를 확인한 뒤, 
각 면의 삼각형을 그려준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static const unsigned int cube_elements[] = {
     3,1,2,
     3,0,1,
 
     4,6,7,
     4,5,6,
 
     8,9,10,
     8,10,11,
 
     12,13,14,
     12,14,15,
 
     16,17,19,
     17,18,19,
 
     20,23,21,
     21,23,22
};
 
cs


*그릴 때 뒷면, 아랫면 고려사항
현재 GL은 반시계방향(GL_CCW)을  앞면으로 그리고 있다.


뒷면의 면을 그릴때 내가 바라보는 기준으로 반시계를 그리게 된다면,
실제 정육면체의 안쪽이 앞면이 되어 화면에 그려지지 않게 된다.

뒷면의 경우엔 내가 바라보는 방향에 시계방향으로 그려야, 실제 그려지는 방향은 반시계 방향으로 그려지게 된다.

아랫면도 마찬가지니, 결국 3D 공간상에서 보여지는 면을 기준으로 반시계방향으로 그려야한다.








728x90

'Software Development > Graphics' 카테고리의 다른 글

프레임과 FPS  (0) 2018.08.04
OpenGL Texture 그리기  (0) 2018.08.04
OpenGL IBO를 사용한 직사각형 그리기  (0) 2018.07.22
OpenGL VBO로 큐브 그리기  (0) 2018.07.07
호도법(Radian)  (0) 2018.07.07