Graphics Programming
그리기 명령(Drawing Commands) 본문
다양한 그리기 명령의 구분 기준: index/non-indexed, direct/indirect
기본 명령은 glDrawArrays()와 glDrawElements()
다른 명령들
Draw Type |
Command |
direct, non-indexed |
glDrawArraysInstancedBaseInstance() |
direct, indexed |
glDrawElementsInstsancedBaseVertexBaseInstance() |
indirect, non-indexed |
glMultiDrawArraysIndirect() |
indirect, indexed |
glMultiDrawElementsIndirect() |
glDrawElements => glDrawElementsBaseVertex(mode, count, type, *indices, basevertex)
stripify: triangle soup => triangle strip (less data, better performance)
- "soup"는 glDrawArrays()나 glDrawElements()를 한 번 호출하여 렌더링 가능
- "strip의 모음"은 별개의 그리기 명령들로 렌더링해야 한다
=> 호출 횟수에 따른 오버로드가 스트리핑의 이점을 상쇄할 수 있다
Primitive Restart는 GL_TRIANGLE_STRIP, TRIANGLE_FAN, LINE_STRIP, LINE_LOOP에 적용된다
glEnable(GL_PRIMITIVE_RESTART)
glPrimitiveRestartIndex(index)
현재 스트립을 index에서 멈추고 새로운 스트립을 시작한다
기본값: 0, 추천값: 표현 가능한 최댓값(0xFFFFFF)
인스턴싱(Instancing)
같은 물체를 약간씩 변형해서 많이 그리고 싶다
glBindVertexArray(grass_vao);
for(int i=0; i<num; i++){
// i번째 풀의 매개변수를 설정
glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
}
이러면 그리는 시간 < 명령 전송 시간
해결책: instanced rendering
glDrawArrayInstanced(mode, first, count, instancecount)
glDrawElementsInstanced(mode, count, type, *indices, instancecount)
drawElements + basevertex + instancecount => glDrwaElementsInstancedBaseVertex()
direct 그리기 명령: glDrawArraysInstsancedBaseInstance()과 glDrawElementsInstancedBaseVertexInstanced()의 하위 집합
인스턴싱을 할 때 GLSL은 내장 변수 gl_InstanceID를 가진다. 이 값은 0 ~ (instancecount - 1) 중 하나