2011-05-24 47 views
1

使用OpenGL 1.1和Matrix Palette扩展。我遇到的问题是,并非每个加载的模型都需要动画,所以我认为我不需要启用这些客户端状态,也不需要提供权重或权重索引数组。例如,我在绘图代码中尝试类似这样的东西...MatrixView Palette,ModelView Matrix时的绘图问题

glMatrixMode(GL_MATRIX_PALETTE_OES); 

glBindBuffer(GL_ARRAY_BUFFER, dataBuffers[0]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dataBuffers[1]); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_WEIGHT_ARRAY_OES); 
glEnableClientState(GL_MATRIX_INDEX_ARRAY_OES); 

//Code to modify the palettes... works fine... 
for(i = 0; i < mech.boneCount; ++i){ 
    glCurrentPaletteMatrixOES(i); 
    glLoadPaletteFromModelViewMatrixOES(); 

    GenerateBoneMatrixPalette(bones, i); 
} 

glVertexPointer(3, GL_FLOAT, sizeof(VertexData), (char*)(NULL + 0)); 
glNormalPointer(GL_FLOAT, sizeof(VertexData), (char*)(NULL + 12)); 
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(VertexData), (char*)(NULL + 24)); 
glWeightPointerOES(1, GL_FLOAT, sizeof(VertexData), (char*)(NULL + 28)); 
glMatrixIndexPointerOES(1, GL_UNSIGNED_BYTE, sizeof(VertexData), (char*)(NULL + 32)); 
glDrawElements(GL_TRIANGLES, mech.indexsize, GL_UNSIGNED_SHORT, (char*)(NULL + 0)); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_WEIGHT_ARRAY_OES); 
glDisableClientState(GL_MATRIX_INDEX_ARRAY_OES); 

glBindBuffer(GL_ARRAY_BUFFER, dataBuffers[2]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dataBuffers[3]); 

glMatrixMode(GL_MODELVIEW); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 

//pardon the hard 28 value here, it's the correct offset for this test 
glVertexPointer(3, GL_FLOAT, 28, (char*)(NULL + 0)); 
glNormalPointer(GL_FLOAT, 28, (char*)(NULL + 12)); 
glColorPointer(4, GL_UNSIGNED_BYTE, 28, (char*)(NULL + 24)); 
glDrawElements(GL_TRIANGLES, indexsize, GL_UNSIGNED_SHORT, (char*)(NULL + 0)); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

但它不工作。第一部分正确显示,但第二部分完全不显示。如果我添加一个,感觉是什么,不必要的重量和重量索引元素到第二部分根据需要修改步幅,而不是将矩阵设置到模型视图...然后它显示我期望的。

感觉最奇怪的测试是,如果我根本不启用Matrix调色板扩展并只绘制第二部分,它工作得很好。但是,只是启用Matrix Palette扩展会导致第二部分根本无法工作,这使得我无法简单地在模式设置为ModelView矩阵时绘制...虽然这看起来有点不寻常,因为ModelView仍然是绝对的受转型影响。

因此......使用此扩展名时,是否可以切换到并绘制ModelView是当前矩阵?或者我必须使用/重复使用一个调色板才能使其工作。

回答

1

我还没有在扩展注册表中找到OES矩阵调色板扩展,但是有一个ARB扩展,并且假设它的工作原理类似。在此扩展中,您必须启用GL_MATRIX_PALETTE和或GL_VERTEX_BLEND(与glEnable)才能使用矩阵调色板蒙皮并禁用它以不使用它。

但glMatrixMode与启用或禁用它无关。它只是选择适用矩阵修改功能的矩阵(如glLoadIdentity,glTranslate,...)。

编辑:谷歌搜索这个扩展(我没有ES经验)我发现,你一定要能够GL_MATRIX_PALETTE_OES使用它(通过glEnable),然后你的第二个部分再次关闭不使用后它。正如我上面写的,glMatrixMode不会做你认为的事情。

+0

ARB扩展的OES实现非常相似,但并没有完全相同的功能(例如,您无法获取当前矩阵)。不过,如果这是一个启用和禁用的问题,我会试一试。您是否知道在启用/禁用此功能时是否存在大量开销? – Maximus 2011-05-25 03:11:41

+0

跟进...是的,这确实奏效。我将不得不最终运行一些性能测试,以查看哪些更具问题,更多的权重/重量指数或额外的gl调用的内存。再次感谢。 – Maximus 2011-05-25 03:50:41

+0

@Maximus我怀疑,只是禁用矩阵调色板蒙皮比为每个对象传递未使用的蒙皮数据更昂贵,而不是使用启用蒙皮的重点顶点处理。所以只是禁用它应该是选择的方法。你也可以按状态排序你的对象。 – 2011-05-25 11:38:04