1

我已经花了 2 天时间试图弄清楚这个问题,但没有用。

我已经使用 opengles2.0 for android 编写了一个 collada 动画渲染器;使用着色器进行蒙皮。代码几乎完成了,它在我的 HTC DesireS 上运行得很好。

但是,当我尝试在带有 PowerVR 芯片组的三叉戟 SetTopBox 上运行相同的程序时,我的几何图形不会显示。经过一天的调试,我发现它正在发生,因为我得到 != -1 作为着色器中的骨骼矩阵索引。

我确认它在我的手机中是 == -1;但在机顶盒中是 != -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;但他们不是。

4

1 回答 1

1

经过几天的挫折,我终于自己找到了问题所在

罪魁祸首是“int()”函数调用,即使我指定 -1,它也会返回 0。观察到的行为是它返回
0 表示 -1
-1 表示 -2
-2 表示 -3 等等......

我不确定这是否是驱动程序/硬件错误,或者是因为浮点表示,其中 -1 表示为“-.9999999”之类的东西

任何人都可以对此有所了解吗?

于 2012-04-10T13:50:41.327 回答