1

私はこの問題を理解しようとしてすでに 2 日を失いましたが、役に立ちませんでした。

Android用のopengles2.0を使用してcolladaアニメーションレンダラーを作成しました。スキニングにシェーダーを使用。コードはほぼ完成しており、私の HTC DesireS で問題なく動作します。

しかし、PowerVR チップセットを搭載した tridernt SetTopBox で同じことを実行しようとすると、ジオメトリが表示されません。デバッグの 1 日後、シェーダーのボーン マトリックス インデックスとして != -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 になることを期待しています。しかし、そうではありません。

4

1 に答える 1

1

欲求不満の日々の後、私はついに自分で問題を見つけました

原因は "int()" 関数呼び出しで、-1 を指定しても 0 を返していました。観測された動作は、
-1 の場合は 0 を返し
、-2
の場合は 1 -3 の場合は -2 などを返します...

これがドライバー/ハードウェアのバグなのか、それとも -1 が "-.9999999" のように表現される浮動小数点表現によるものなのかはわかりません。

誰かがこれについてもう少し光を当てることができますか?

于 2012-04-10T13:50:41.327 に答える