2011-07-08 151 views
1

我正在使用VBO在OpenGL中使用GLSL着色器绘制一系列多维数据集,该GLSL着色器执行多纹理(包含5个纹理)。如果我不传递纹理,它会正常工作。但是如果我尝试使用纹理,整个屏幕只会被绘制为白色(可能是最后一个清晰的颜色)。如果我使用立即模式(没有VBO)传递纹理,那么在那里也很好。我无法分辨为什么会有问题。OpenGL VBO绘图多纹理问题

代码:

// create vertex/normal/color/texcoord VBO 
glGenBuffersARB(1, &vboId); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId); 
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vert_buf)+sizeof(norm_buf)+sizeof(col_buf)+sizeof(tex_buf), 0, GL_STREAM_DRAW); 
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(vert_buf), vert_buf); 
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vert_buf), sizeof(norm_buf), norm_buf); 
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vert_buf)+sizeof(norm_buf), sizeof(col_buf), col_buf); 
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vert_buf)+sizeof(norm_buf)+sizeof(col_buf), sizeof(tex_buf), tex_buf); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

// create geometry indices VBO 
glGenBuffersARB(1, &vboId2); 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboId2); 
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(index_buf), index_buf, GL_STATIC_DRAW_ARB); 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); 

// bind vertex/normal/color/texcoord VBO 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId); 

// enable vertex arrays 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

// specify vertex and index arrays with their offsets 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glNormalPointer(GL_FLOAT, 0, (void*)sizeof(vert_buf)); 
glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(vert_buf)+sizeof(norm_buf))); 

// bind geometry indices VBO 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboId2); 
glIndexPointer(GL_UNSIGNED_INT, 0, 0); 

// set the texture units 
GLvoid* start = (void*)(sizeof(vert_buf)+sizeof(norm_buf)+sizeof(col_buf)); 
glClientActiveTexture(GL_TEXTURE0 + (GLuint)vid_regions[0].tex_id); // same as GL_TEXTURE1 
glTexCoordPointer(2, GL_FLOAT, 0, start); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + (GLuint)vid_regions[1].tex_id); // same as GL_TEXTURE2 
glTexCoordPointer(2, GL_FLOAT, 0, start); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + (GLuint)vid_regions[2].tex_id); // same as GL_TEXTURE3 
glTexCoordPointer(2, GL_FLOAT, 0, start); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + noiseTexID); // same as GL_TEXTURE4 
glTexCoordPointer(2, GL_FLOAT, 0, start); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + lutTexID); // same as GL_TEXTURE5 
glTexCoordPointer(2, GL_FLOAT, 0, start); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

// draw VBOs 
glDrawElements(GL_TRIANGLES, 36*ROWS*COLS, GL_UNSIGNED_INT, 0); 

// disable arrays 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 

// disable texture arrays 
glClientActiveTexture(GL_TEXTURE0 + (GLuint)vid_regions[0].tex_id); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + (GLuint)vid_regions[1].tex_id); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + (GLuint)vid_regions[2].tex_id); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + noiseTexID); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0 + lutTexID); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

// unbind VBOs 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); 

注:维也纳各组织的创建过程中的初始设置阶段被调用。绘图发生在绘制GLUT例程中。

+0

也许你应该发布着色器代码。而你的“设置纹理单元”似乎是非常错误的。如果所有纹理单元的坐标相同,则不必多次传递它们。 – Jonathan

回答

0

尝试重置您的纹理水平回到0:

glClientActiveTexture(GL_TEXTURE0); 

它的情况并不少见的怪事发生时有效纹理水平不复位(比方说,如果你使用宗教组织等)。

将黑色/白色/透明以外的其他颜色设置为清晰颜色也可能会有所帮助,以查看屏幕是否用清晰的颜色绘制,或者如果您以某种方式看到了纹理元素拉伸或其他内容。

+0

啊太棒了!就是这样。谢谢! –