我已经失去了2天试图弄清楚这个问题,但没有用。
我使用opengles2.0为android写了一个collada动画渲染器;使用着色器进行蒙皮。代码几乎完成,它在我的HTC DesireS上运行得很好。
但是,当我尝试在带有PowerVR芯片组的tridernt SetTopBox上运行相同的操作时,我的几何图形不会显示。经过一天的调试后,我发现它正在发生,因为我得到了!= -1,因为着色器中的骨骼矩阵是唯一的。
我在手机中验证了它是== -1;但是在SetTopBox中是!= -1。
可能出现什么问题? 请救我脱离这个大麻烦。
很抱歉没有提交代码。 这是顶点着色器。我期待vec2(boneIndices)在[0]和[1]中都有-1;但是Powervr却不是这样。
attribute vec4 vPosition;
attribute vec2 vTexCoord;
attribute vec2 boneIndices;
attribute vec2 boneWeights;
uniform mat4 boneMatrices[BNCNT];
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
varying mediump vec2 fTexCoord;
varying mediump vec3 col;
void main(){
vec4 tempPosition = vPosition;
int index = int(boneIndices.x);
col = vec3(1.0, 0.0, 0.0);
if(index >= 0){
col.y = 1.0;
tempPosition = (boneMatrices[index] * vPosition) * boneWeights.x;
}
index = int(boneIndices.y);
if(index >= 0){
col.z = 1.0;
tempPosition = (boneMatrices[index] * vPosition) * boneWeights.y + tempPosition;
}
gl_Position = projectionMatrix * viewMatrix * modelMatrix * tempPosition;
fTexCoord = vTexCoord;
}
设置属性指针
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 13*sizeof(GLfloat), 0);
glVertexAttribPointer(texCoord, 2, GL_FLOAT, GL_FALSE, 13*sizeof(GLfloat), (GLvoid*)(3*sizeof(GLfloat)));
glVertexAttribPointer(boneIndices, 2, GL_FLOAT, GL_FALSE, 13*sizeof(GLfloat), (GLvoid*)(9*sizeof(GLfloat)));
glVertexAttribPointer(boneWeights, 2, GL_FLOAT, GL_FALSE, 13*sizeof(GLfloat), (GLvoid*)(11*sizeof(GLfloat)));
glEnableVertexAttribArray(position);
glEnableVertexAttribArray(texCoord);
glEnableVertexAttribArray(boneIndices);
glEnableVertexAttribArray(boneWeights);
我的顶点和索引缓冲区
GLfloat vertices[13*6] =
{-0.5*size, -0.5*size, 0, 0,1, 1,1,1,1, -1,-1, 0,0,
-0.5*size, 0.5*size, 0, 0,0, 1,1,1,1, -1,-1, 0,0,
0.5*size, 0.5*size, 0, 1,0, 1,1,1,1, -1,-1, 0,0,
-0.5*size, -0.5*size, 0, 0,1, 1,1,1,1, -1,-1, 0,0,
0.5*size, 0.5*size, 0, 1,0, 1,1,1,1, -1,-1, 0,0,
0.5*size, -0.5*size, 0, 1,1, 1,1,1,1, -1,-1, 0,0 };
GLushort indices[]= {0,1,2, 3,4,5};
我希望着色器中的索引为-1;但他们不是。
答案 0 :(得分:0)
经过几天的挫折,我终于找到了问题。
罪魁祸首是“int()”函数调用,即使我指定-1,它也会返回0。
观察到的行为是它返回
-1表示-1
-1为-2
-2代表-3和... ...
我不确定这是否是驱动程序/ hw错误,或者是否因为浮点表示,其中-1表示为“-.9999999”
有人可以对此有所了解吗?