📌 Objects
- 그래픽세계에서 컴퓨터는 가상으로 만든 3D 모델을 사용해 객체를 화면에 출력한다. (Synthetic Objects)
- 3D 모델은 정점(Vertices)과 면(Faces)로 이루어져 있다.
Rendering Way
Polygon Soup
- 정점데이터 복제하는 방식으로 3D 모델 데이터를 저장하는 모델이다.
- 각 정점들이 복제된 만큼 메모리 사용량이 증가하지만, 참조를 하지않아 빠르다.
- 각 모델의 정점은 반시계 방향 순으로 저장한다.
Vertex List & Polygons
- 정점 데이터의 정보를 List로 관리하는 방식으로 3D 모델 데이터를 저장하는 모델이다.
- 각 정점들을 사용할 때 List를 참조해서 사용해 메모리 사용량이 감소하지만, 느리다.
- 각 모델의 정점은 반시계 방향 순으로 저장한다.
Triangle Meshes
- 모든 Polygon Primitive를 삼각형으로만 저장하는 기법이다.
- 속도가 향상된다.
Rendering Architectures
Vertex Arrays
- 기존 CPU에 연결된 메모리에 Vertex 데이터를 저장하는 기법이다.
- 매 프레임마다 GPU로 Vertex 데이터를 전송하기 때문에 느리지만, 관리가 편하다.
Sample Code
GLfloat position[] = { 0,0,0, 1,0,0, 1,1,0, 1,0,0, 2,1,0, 1,1,0 };
GLfloat color[] = { 1,0,0, 0,1,0, 0,0,1, 0,1,0, 0,0,0, 0,0,1 };
GLint loc_a_position = glGetAttribLocation(program, "a_position");
GLint loc_a_color = glGetAttribLocation(program, "a_color");
glEnableVertexAttribArray (loc_a_position);
glVertexAttribPointer(loc_a_position, 3, GL_FLOAT, GL_FALSE, 0, position);
glEnableVertexAttribArray (loc_a_color);
glVertexAttribPointer(loc_a_color, 3, GL_FLOAT, GL_FALSE, 0, color);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDiableVertexAttribArray(loc_a_position);
glDisableVertexAttribArray(loc_a_color);
Vertex Buffer Objects(VBOs)
- 처음 랜더링 시 Vertex 데이터를 모두 GPU 메모리로 전송하는 기법이다.
- Vertex 데이터를 GPU가 관리하기 때문에 빠르지만, 관리가 불편하다.
Sample Code - Initialization
GLfloat position[] = { 0,0,0, 1,0,0, 1,1,0, 1,0,0, 2,1,0, 1,1,0 };
GLfloat color[] = { 1,0,0, 0,1,0, 0,0,1, 0,1,0, 0,0,0, 0,0,1 };
GLuint position_buffer;
GLuint color_buffer;
glGenBuffers(1, &position_buffer);
glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(position), position, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &color_buffer);
glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Sample Code - Rendering
glEnableVertexAttribArray(GL_ARRAY_BUFFER, loc_a_position);
glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
glVertexAttribPointer(loc_a_position, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
glEnableVertexAttribArray(GL_ARRAY_BUFFER, loc_a_color);
glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
glVertexAttribPointer(loc_a_color, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(GL_ARRAY_BUFFER, loc_a_position);
glDisableVertexAttribArray(loc_a_color);