본문 바로가기

Game/Graphics

OpenGL-Tutorial 9 : VBO Indexing

link : http://www.opengl-tutorial.org/kr/intermediate-tutorials/tutorial-9-vbo-indexing/


9번째 튜토리얼이다. 이제 Basic tutorial이 끝나고 Intermediate tutorial이 시작했다! 화이팅!



The principle of indexing (Index 생성 원칙)


지금까지 VBO를 만들 때 우리는 항상 2개의 삼각형 가장자리를 공유할 때마다 정점을 복사했다.


이 튜토리얼에서는 동일한 꼭지점을 반복해서 사용하는 인덱싱을 소개한다. 인덱스 버퍼를 사용해 이 작업을 수행한다.



인덱스 버퍼는 다양한 속성 버퍼(위치, 색상, UV 좌표, 다른 UV 좌표, 법선, ..)를 참조하는 메쉬의 각 삼각형에 대해 3개의 정수가 포함된다.


이것은 OBJ 파일 형식과 약간 닮았다. 하나의 큰 차이점은 단 하나의 인덱스 버퍼만 있다는 것이다.


즉, 두 개의 삼각형간에 꼭지점을 공유하려면 모든 속성이 동일해야한다.


Shared vs Separate

법선의 예를 들어보자. 이 그림에서 두 삼각형을 만든 예술가는 아마 매끄러운 표면을 표현하기를 원했을 것이다.

따라서 두 삼각형의 법선을 단일 꼭지점 법선으로 표현할 수 있다.시각화를 위해 매끄러운 표면의 모습을 나타내는 빨간색 선을 추가했다.



그러나 두 번째 그림에서 예술가는 눈에 띄게 "seam", 거친 가장자리를 원했다. 그러나 법선을 병합하면 셰이더가 평소와 같이

부드럽게 보간되고, 이전과 같이 부드러운면을 만든다.



따라서 이 경우 두 개의 다른 법선 (각 꼭지점마다 하나씩)을 갖는 것이 실제로 더 좋다.

OpenGL에서 이 작업을 수행하는 유일한 방법은 전체 속성 세트를 사용해 전체 정점을 복사하는 것이다.



Indexed VBO in OpenGL

indexing을 이용하는 것은 매우 간단하다. 먼저, 올바른 색인을 채우는 추가 버퍼를 생성해야한다.

코드는 이전과 동일하지만 지금은 ARRAY_BUFFER가 아닌 ELEMENT_ARRAY_BUFFER이다.

std::vector<unsigned int> indices;

// fill "indices" as needed

// Generate a buffer for the indices
 GLuint elementbuffer;
 glGenBuffers(1, &elementbuffer);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);


// Index buffer
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer);

 // Draw the triangles !
 glDrawElements(
     GL_TRIANGLES,      // mode
     indices.size(),    // count
     GL_UNSIGNED_INT,   // type
     (void*)0           // element array buffer offset
 );

(note : "unsigned int"보다 "unsigned short"를 사용하는 것이 메모리가 적게 걸려서 더 빨리 처리 할 수 있다)


Filling the index buffer

이제 우리는 문제가 있다. 앞서 말한것처럼 OpenGL은 오직 하나의 index 버퍼만을 사용할수 있는 반면에,

OBJ(그리고 몇몇의 다른 3D format들)는 속성별로 하나의 index 버퍼를 사용할 수 있다.

이것은 우리가 어떻게든 N개의 인덱스 버퍼를 1개의 인덱스 버퍼로 변환해야한다는 것을 의미한다.


For each input vertex
    Try to find a similar ( = same for all attributes ) vertex between all those we already output
    If found :
        A similar vertex is already in the VBO, use it instead !
    If not found :
        No similar vertex found, add it to the VBO

이 튜토리얼은 실행이 없다. 끝!

'Game > Graphics' 카테고리의 다른 글

OpenGL-Tutorial 11 : 2D Text  (0) 2018.06.28
OpenGL-Tutorial 10 : Transparency  (0) 2018.06.28
OpenGL-Tutorial 8 : Basic shading  (0) 2018.06.26
OpenGL-Tutorial 7 : Model loading  (0) 2018.06.22
OpenGL-Tutorial 6 : Keyboard and Mouse  (0) 2018.06.21