2011-12-27 3 views
1

VBO에서이 문제가 발생합니다. 실제로 이해가되지 않습니다. 내 문제는 실수로 glVertexAttribPointer 메서드 호출 마지막 매개 변수를 변경하여 해결됩니다. 그래서 WHY이 갑자기 작동하는지 또는 이전 코드가 더 이상 작동하지 않는 이유에 대한 답변을 찾고 있습니다.glDrawElements VBO를 사용하는 EXC_BAD_ACCESS

구조체를 (단지는 OpenGL에 대한 더 나은 이해를 얻기 위해) :

typedef struct 
{ 
    float position[3]; 
    float color[4]; 
} Vertex; 

을 VBOs없이 : VBOs와

// Get pointers to the data 
GLsizei stride = sizeof(Vertex); 
const GLvoid *pCoords = &squareVertices[0].position[0]; 
const GLvoid *pColors = &squareVertices[0].color[0]; 

// Setup pointers to positions and colors 
glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, stride, pCoords); 
glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, stride, pColors); 

// Draw 
glDrawArrays(GL_TRIANGLES, 0, sizeof(squareVertices)/sizeof(Vertex)); 

(이 저에게 EXC_BAD_ACCESS를 제공)

// Stide 
GLsizei stride = sizeof(Vertex); 

// Setup pointers to positions and colors 
glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, stride, 0); 
glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, stride, (GLvoid*) (sizeof(float) * 3)); 

// Draw 
glDrawElements(GL_TRIANGLES, sizeof(squareIndices)/sizeof(squareIndices[0]), GL_UNSIGNED_BYTE, 0); 

실제적으로 유일한 차이점은 데이터에 대한 포인터가있는 glVertexAttribPointer 호출이며 현재는 고정 된 숫자입니다. 아무도 이것에 정성 들일 수 있습니까? 미리 감사드립니다.

답변

4

VBO가 활성화되면 glVertexAttribPointer의 마지막 매개 변수는 실제로 포인터가 아니지만 정점 버퍼 객체 내부의 오프셋은 포인터로 유형 변환됩니다. VBO가 작동하는 방식입니다 : 그래픽 드라이버가 관리하는 일부 메모리에 데이터가 복사되었으므로 주소를 알 수 없습니다. 실제로 그래픽 카드의 어딘가에 저장 될 때 일반 주소가 없을 수도 있습니다.

나머지는 C/C++ 유형 시스템을 속이고 있습니다. 타입 시스템은 VBOO가 활성화 될 때 glVertexAttribPointer의 마지막 인자가 포인터 크기의 정수 오프셋이어야하고 그렇지 않으면 포인터 여야한다는 것을 이해할만큼 충분히 똑똑하지 않습니다. 그래서 C++ 컴파일러에서는 언제나 포인터처럼 보입니다. 왜냐하면 원래 정의 된대로 glVertexAttribPointer (또는 오히려 전신 인 glVertexPointer 및 친구들)이기 때문입니다. 실제로 숫자 일 때 컴파일러를 속이기 위해 타입 캐스트를 사용합니다.

+0

와우! 그것은 빠른 anwser이었다. 정말 감사합니다. Cristal clear;) – polyclick

관련 문제