2011-09-17 3 views
6
내가 사양 및 OpenGL 포럼을 통해 미끄러 져했지만 정말 이해 할 수없는

:* BaseVertex 및 gl_VertexID

가 GLSL 변수 gl_VertexID에 추가되어 드로잉 명령의 *BaseVertex 버전인가를? 작동으로 gl_VertexID가 추가됩니다 basevertex 전에 바운드 ELEMENT_ARRAY_BUFFER에서 가져온 인덱스가 포함되어 있습니다.

그래서, 내 질문은 : 이 올바른 행동인가?gl_VertexID에는 꼭지점을 가져 오는 데 사용되는 인덱스가 있어야한다고 가정합니다.

답변

4

예이 올바른 bahviour입니다. BaseVertex의 사용 시나리오는 gl*Pointer 함수를 사용하여 버텍스 배열로 버퍼 오프셋을 조정하는 대신이 하나의 값만 전환해야한다는 것입니다.

아이디어는 인덱스를 조정할 필요없이, 하나의 VBO에 여러 메시 (모델 파일)에서 데이터를로드 할 수있다.

+0

예, 의미가 있습니다. 최종적으로 계산 된 인덱스를 포함하는 "''gl_Element'"같은 것이 - 미래의 OpenGL/GLSL 버전에서 gl_VertexID를 잘 보완 할 것이라고 생각합니다. 고맙습니다. – palle8x

+0

@ palle8x 요소 배열의 인덱스가 개념적으로 중요하므로 그렇게 생각하지 않습니다. 그리고 정말로 필요한 경우 baseVertex에 유니폼을 추가하고 이것을'gl_VertexID'에 추가 할 수 있습니다. –

+0

나는 동의하며, 당신이 설명하는 것은 현재 나의 코드에서 무엇을하고 있는지를 설명한다. 하지만 여전히 "gl_Element'"와 같은 유용한 유스 케이스가 있다고 생각합니다. (나는 믿습니다.) 드라이버에 구현하는 것이 그리 어렵지는 않을 것입니다. – palle8x

0

당신의 가정은 권리입니다. gl_VertexID는 BaseVertex 오프셋을 포함해야합니다.

opengl wiki about GLSL built-in vars:

참고 : gl_VertexID베이스 정점이 적용됩니다.

about glDrawElementsBaseVertex:

는 gl_VertexID는 basevertex하여 버퍼로부터 페치하지 인덱스 오프셋 후의 인덱스 될 정점 셰이더에 전달.

불행하게도, 오래된 드라이버가 제대로 구현하지 않았다.