Index Buffer

정민용·2025년 3월 29일

OpenGL

목록 보기
4/5

연습문제

1. 화면에 오각형이 그려지도록 코드를 수정해 보세요.

// 수정 코드
float position[] = {
	-0.5f, -1.0f, 0.0f,	//0
    0.5f, -1.0f, 0.0f,	//1
    -1.0f, 0.0f, 0.0f,	//2
    0.0f, 0.0f, 0.0f, 	//3
    1.0f, 0.0f, 0.0f,	//4
    0.0f, 1.0f, 0.0f,	//5
};
unsigned int indices[] = {
	0, 1, 3,
    2, 0, 3,
    3, 1, 4,
    3, 4, 5,
    2, 3, 5
};
...
glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(float), position, GL_STATIC_DRAW);
...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 15 * sizeof(unsigned int), indices, GL_STATIC_DRAW);
...
while (!glfwWindowShouldClose(window))
{
	...
    GLCall(glDrawElements(GL_TRIANGLES, 15, GL_UNSIGNED_INT, nullptr);
    ...
}
  1. 삼각형의 세 vertex를 갖는 배열 position
  2. 삼각형을 이루는 vertex 정보를 갖는 배열 indices
  3. 바뀐 position, indices 크기에 맞춰 작업 상태 버퍼에 전달할 데이터 수정

2. GL_TRIANGLES 대신 사용할 수 있는 다른 옵션들을 사용해 한 번 그리기를 수행해 보세요.

  • GLEnum mode : 렌더링할 기본 유형 종류 지정
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, GL_TRIANGLES_ADJACENCY, GL_PATCHES 
GL_POINTS: 각 정점을 독립적인 점으로 렌더링
GL_LINES: 정점 2개를 하나의 선분으로 연결
GL_LINE_STRIP: 첫 번째 정점부터 순차적으로 선분을 이어서 그림
GL_LINE_LOOP: GL_LINE_STRIP과 유사하지만, 마지막 정점과 첫 번째 정점을 연결함
GL_LINES_ADJACENCY: GL_LINES와 유사하지만, 추가적인 인접 정점 정보를 포함
GL_LINE_STRIP_ADJACENCY: GL_LINE_STRIP과 유사하지만, 추가적인 인접 정점 정보를 포함
GL_TRIANGLES: 3개의 정점마다 독립적인 삼각형을 그림
GL_TRIANGLE_STRIP: 연속된 정점들로 삼각형을 그림
GL_TRIANGLE_FAN: 첫 번째 정점을 기준으로 부채꼴 모양의 삼각형을 그림
GL_TRIANGLES_ADJACENCY: GL_TRIANGLES과 유사하지만, 추가적인 인접 정점 정보를 포함
GL_TRIANGLE_STRIP_ADJACENCY: GL_TRIANGLE_STRIP과 유사하지만, 추가적인 인접 정점 정보를 포함
GL_PATCHES: 테셀레이션 셰이더에서 사용되는 패치 도형

3. glDrawElements()의 두 번째 인자를 3으로 바꾸면 오른쪽 아래 삼각형만 그려지게 됩니다. 다른 부분의 코드를 건드리지 않고, 해당 함수만 수정해서 왼쪽 위 삼각형"만" 그려지도록 해 보세요.

void glDrawElements(GLenum mode,
					GLsizei count,
                    GLenum type,
					const GLvoid * indices);
  • indices: 인덱스 읽기를 시작할 버퍼에 바인딩된 바이트 오프셋(포인터 유형으로 캐스팅)을 지정
// 수정코드
...
while (!glfwWindowShouldClose(window))
{
	...
    GLCall(glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (void *)(12 * sizeof(unsigned int)));
    ...
}
  • Index Buffer Object를 사용하지 않는 경우 indices 부분을 indices + n * sizeof(unsigned int)
  • Index Buffer Object를 사용하는 경우 indices 부분을 (void )(n sizeof(unsigned int))
  • Index Buffer Object가 바인딩된 상태에서 indices를 직접 사용하면, 렌더링 되는 것은 없음

0개의 댓글