Graphics Programming

그리기 명령(Drawing Commands) 본문

Season 1/OpenGL

그리기 명령(Drawing Commands)

minseoklee 2015. 10. 3. 11:22

다양한 그리기 명령의 구분 기준: 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) 중 하나

 

Comments