矩阵调色板,ModelView矩阵时的绘图问题

时间:2011-05-24 05:39:19

标签: android opengl-es

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

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 Palette扩展并且只绘制第二部分,它就可以正常工作。但是,只是启用Matrix Palette扩展会导致第二部分根本无法工作,这使得在模式设置为ModelView Matrix时我似乎无法简单绘制...虽然这看起来有些不寻常,因为ModelView仍然绝对是受到转变的影响。

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

1 个答案:

答案 0 :(得分:1)

我没有在扩展注册表中找到OES矩阵调色板扩展,但是ARB扩展并假设它的工作方式类似。在此扩展程序中,您必须启用GL_MATRIX_PALETTE和/ GL_VERTEX_BLEND(使用glEnable)才能使用矩阵调色板外观并禁用它以禁用它。

但是glMatrixMode与启用或禁用它没有任何关系。它只选择适用矩阵修改函数的矩阵(如glLoadIdentityglTranslate,...)。

编辑:Google搜索此扩展程序后(我没有ES经验),我发现您必须启用GL_MATRIX_PALETTE_OES才能使用它(通过glEnable),然后再次禁用,让您的第二部分不再使用它。正如我上面所写,glMatrixMode没有按照你的想法去做。