2011-10-03 5 views
0

glBegin()을 사용하여 GL_QUADS를 표시하지 않고 VBO로 표시하려고합니다. 불행히도 프로그램을 변경 한 후에는 더 이상 쿼드가 표시되지 않습니다. 내가 보는 모든 것이 검은 색 화면입니다. 그것이 내가하는 일입니다.OpenGl - 버텍스 버퍼 객체가 화면에 그려지지 않음

두 개의 VBO를 정의합니다. 정점 데이터에 대한 하나의, 인덱스 하나와 그 가운데 일부 공간 할당 : 내가 그들을 표시하려고,

float *ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); 
int *ptrind = (int*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); 
int nVertexCount=0; 
for (...){ 
    *ptr=vertX; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
    *ptr=vertY; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
    *ptr=vertZ; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
} 
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); 
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); 

을 마지막으로 :

glGenBuffersARB(2, pboIds); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, pboIds[0]); 
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 50000*sizeof(GLfloat), 0, GL_STREAM_DRAW_ARB); 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, pboIds[1]); 
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 50000*sizeof(GLint), 0, GL_STREAM_DRAW_ARB); 

그럼 내가 그들을지도하고 그들에게 정보를 기록

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glDrawElements(GL_QUADS, nVertexCount, GL_INT, (pboIds+1)); 
glDisableClientState(GL_VERTEX_ARRAY); 

내 프로그램이 잘 컴파일됩니다. 나는 그것을 실행할 때 어떤 충돌도받지 않는다. 하지만 내가 보는 모든 것은 검은 화면입니다. glBegin (GL_QUADS)을 사용했을 때와 마찬가지로 동일한 루틴을 사용하여 정점 좌표를 결정합니다. 그때 나는 화면에 하얀 사각형을 볼 수있었습니다. 어쩌면 내 VBO 코드에서 잘못된 일을하고 있습니까?

편집 : 불행히도 나는 창문 아래 있습니다. ARB 확장 프로그램을 사용하지 않으려면 이러한 작업을 수행해야합니까? I는이 그 예시적인 코드에서 :

#ifdef _WIN32 
PFNGLGENBUFFERSARBPROC pglGenBuffersARB = 0; 
PFNGLBINDBUFFERARBPROC pglBindBufferARB = 0; 
PFNGLBUFFERDATAARBPROC pglBufferDataARB = 0; 
PFNGLBUFFERSUBDATAARBPROC pglBufferSubDataARB = 0; 
PFNGLDELETEBUFFERSARBPROC pglDeleteBuffersARB = 0; 
PFNGLGETBUFFERPARAMETERIVARBPROC pglGetBufferParameterivARB = 0; 
PFNGLMAPBUFFERARBPROC pglMapBufferARB = 0; 
PFNGLUNMAPBUFFERARBPROC pglUnmapBufferARB = 0; 
#define glGenBuffersARB   pglGenBuffersARB 
#define glBindBufferARB   pglBindBufferARB 
#define glBufferDataARB   pglBufferDataARB 
#define glBufferSubDataARB  pglBufferSubDataARB 
#define glDeleteBuffersARB  pglDeleteBuffersARB 
#define glGetBufferParameterivARB pglGetBufferParameterivARB 
#define glMapBufferARB   pglMapBufferARB 
#define glUnmapBufferARB   pglUnmapBufferARB 
#endif 
+0

새로운 VBO 코드로 여전히 'glColor()'를 통해 현재 색상을 설정합니까? – genpfault

+0

@genpfault : 나는 어떤 색깔도 설정하지 않는다고 생각합니다. 해야합니까? 편집 : glColor3f (1.0f, 1.0f, 1.0f)로 시도해 보았습니다. 여전히 모든 것은 검은 색이고, GL_QUAD의 흔적은 없습니다. – Fejwin

+0

'for (...) {'여기서'...'는 무엇입니까? –

답변

2

glDrawElements (GL_QUADS, nVertexCount, GL_INT (pboIds + 1));

버퍼 개체 이름을이 함수에 전달하지 마십시오. 그것은 어떤 버퍼 객체가 그 시점에 GL_ELEMENT_ARRAY_BUFFER에 바인드 되더라도 사용합니다. 이 값은 버퍼의 처음부터의 오프셋입니다. 첫 x 째 색인의 위치를 ​​지정합니다.

또한 ARB 확장 버전의 버퍼 개체 사용을 중지하십시오. 핵심 요소 만 사용하십시오.


는 불행하게도, 난 창문 아래입니다.

그게 무슨 관련이 있는지 모르겠습니다. do it yourself이 아닌 경우 OpenGL loading library을 사용하십시오.

+0

니콜 볼라스 (Nicol Bolas)의 답변에 덧붙이 기 위해, 마지막 매개 변수는'#define BUFFER_OFFSET (i) ((char *) NULL + (i))'와 같은 것을 한 후에 일반적으로'BUFFER_OFFSET (youroffset)'과 같이 보입니다. 개인적으로 C++에서 정의를 피하려고 노력하지만, 예제 코드에서 정의를 자주 보게됩니다. – luke

+0

위의 편집을 참조하십시오. – Fejwin

+0

@Fejwin : 편집을 참조하십시오. –

관련 문제