2014-11-05 6 views
2

만들어지면 VAO는 VBO 인덱스 (glBindVertexBuffer 경유) 만 추적합니까? 아니면 VBO 이름이 해당 인덱스에 바인딩되어 있습니까? VAO 생성 중에 glVertexAttribBinding을 사용하여 0의 바인딩 인덱스를 지정하면 다른 VBO를 그리기 호출 직전의 인덱스 0에 바인드하고 해당 VBO의 내용을 사용하게하거나 항상 VBO를 사용하게됩니다 VAO가 생성되었을 때 인덱스 0에 바인드 되었습니까? 예를 많이 내가 (결합 인덱스가 glVertexAttribBinding에 제시되어 있기 때문에)를 VAO는 인덱스를 추적하는 경우 필요는 없습니다 glBindVertexBuffer에 전화로 glVertexAttribFormatglVertexAttribBinding에 전화를 앞에 찾을 수 있기 때문에OpenGL Vertex Array Objects는 꼭지점 버퍼 이름과 인덱스 또는 인덱스 만 저장합니까?

내가 부탁드립니다.

답변

-1

정답은 정점 이름 만 저장하고 인덱스 만 저장한다는 것입니다. 다른 VBO의 다른 색인을 동일한 색인에 바인드하는 경우, 첫 번째 VAO를 사용하는 glDraw 호출보다 먼저 첫 번째 VBO를 다시 바인드해야합니다.

적어도 내 맥북 프로와의 :

이 렌더러 : 엔비디아 지포스 GT 650M의 OpenGL 엔진

가 버전 : 4.1 NVIDIA - 10.0.43 310.41.05f01

+2

귀하의 질문은 OpenGL 4.3 이상에서만 사용 가능한 기능에 관한 것입니다. OpenGL 4.1 만 지원하는 구성에서 어떻게 테스트 했습니까? –

+0

맞습니다. 4시에 시험하지 않았습니다.3+ 그리고 정점 버퍼를 0이 아닌 인덱스에 바인딩 할 수는 없습니다. 그러나 VAO가 4.1에서 VBO 이름을 추적하지 않으면 4.3+에서도 VAO를 추적하지 않을 것이라고 가정합니다. 그러나 그것이 내 시스템에 대한 사양을 포함하는 이유입니다. YMMV. – jorgander

3

아마 알고 있겠지만, 이것은 OpenGL 4.3에서 소개 된 상당히 새로운 기능입니다. 사양을 읽는 방식에 따라 속성과 버퍼 간의 매핑이 간접적 인 수준을 갖습니다.

  1. 각 속성에는 사용하는 바인딩 인덱스를 지정하는 속성이 있습니다.
  2. 버퍼는 바인딩 인덱스에 바인딩됩니다.

두 테이블, 하나는 인덱스 이름을 버퍼 인덱스를 바인딩에서 다른 하나를 바인딩 속성 인덱스에서 매핑을 정의로이 볼 수 있습니다. 이 두 표는 모두 VAO 상태의 일부입니다.

나는 이것이 완전히 독립적으로, 그리고 어떤 순서로든 지정 될 수 있다고 생각한다. glVertexAttribBinding()은 속성 색인과 바인딩 색인 사이에 첫 번째 연관을 설정합니다. glBindVertexBuffer()은 바인딩 인덱스와 버퍼 이름 간의 연결을 설정합니다.

이 이해는 상태 표에서 사양으로 확인됩니다. GL의 4.4 스펙 표 23.4, 자막 "버텍스 어레이 오브젝트 상태", 목록 : glGetVertexAttribiv()으로 조회 할 수 있습니다

  • VERTEX_ATTRIB_BINDING는, 지정된 속성 지수의 결합 인덱스의 값입니다.
  • VERTEX_BINDING_BUFFERglGetIntegeri_v()으로 쿼리 할 수 ​​있으며 지정된 바인딩 인덱스의 버퍼 이름 값입니다.

는이를 바탕으로 특정 질문에 주소 : VBO 이름은 그 인덱스에 바인딩 또한

만들어

은 (glBindVertexBuffer를 통해) 단지 VBO 지수 VAOs 트랙을, 또는?

두 가지를 모두 추적합니다.

나는 인덱스 0 직전 무승부 호출에 다른 VBO를 결합하고 그 VBO의 내용을 사용하게

예, 인덱스 0 바인딩에 다른 VBO를 결합하는 경우, 모든 수 바인딩 색인 0의 속성은 해당 VBO의 내용을 사용합니다.

나는 VAO 트랙 만있는 경우 필요는 없습니다 glBindVertexBuffer에 전화로 glVertexAttribFormatglVertexAttribBinding에 대한 호출을 앞에 찾을 수 많은 예제

VAO이 모든 설정 상태를 추적와 indices 따라서 VAO를 설정하는 과정에서이 모든 것을 사용하는 것이 합리적입니다. VAO에서 전체 버텍스 셋업 상태를 추적하는 것이 우선 VAO를 갖는 주요 목적입니다. 초기화하는 동안 한 번 상태를 설정할 수있게하고 전체 상태를 다시 설정하기 위해 draw를 호출하기 전에 glBindVertexArray()에 한 번만 호출하면됩니다.

+0

VAO가 VBO 이름을 추적하면 할당 인덱스에 추가하면 인덱스를 추적 할 필요가 없습니다. VAO를 생성 한 후, 버퍼 인덱스를 참조하는 모든 정점 속성은 이제 버퍼 인덱스 값을 잊어 버리고 버퍼 인덱스 이름 만 기억할 수 있습니다. 실제로는 'glVertexAttribBinding'을 호출하면 인덱스 값을 잊어 버릴 수 있습니다. 어느 쪽이든, 내 혼란은 '공식'opengl 문서의이 섹션에서 발생했습니다 : https://www.opengl.org/wiki/Vertex_Specification#Multibind_and_separation. "... 동일한 형식을 유지하면서 여러 버퍼를 빠르게 전환하는 중 ..." – jorgander

+0

어떻게 더 명확하게 설명 할 수 있는지 잘 모르겠습니다. "인덱스를 추적 할 필요가 없다"고 말하는 것입니다. 글쎄, 당신은 그것이 필요하지 않다고 생각 할지도 모르겠지만 그것은 그것이 명시된 방식이고, 그렇게 그렇게 작동합니다. 설명 된 기능을 사용할 수 있습니다. 간접 지정을 사용하면 여러 속성에 동일한 버퍼 색인을 할당 한 다음이 속성 모두가 다른 버퍼를이 색인에 바인드하는 단일 호출에서 사용하는 버퍼를 변경할 수 있습니다. –

+0

내가 사용하는 용어가 불분명하고 튜토리얼/문서 중 일부가 충돌하는 것 같습니다. 귀하의 답변 : "버퍼는 바인딩 인덱스에 바인딩되어 있습니다." - 여기에 '구속력이있는'과 '구속력있는'이라는 단어가 중복되어 있습니까? 그렇지 않다면 VBO가 바인딩 된 것 이외의 '바인딩 인덱스'바인딩을 만드는 것은 무엇입니까? "버퍼는 인덱스에 바인딩되어 있습니다"라는 문구는 말하고 싶은 것과 같습니다. – jorgander