2012-04-05 8 views
1

Ich habe bereits 2 Tage verloren, um herauszufinden, in diesem Problem, aber ohne Nutzen.GLSL - Falsche Daten in Vertex-Attribut

Ich habe einen Collada Animation Renderer mit OpenGLES2.0 für Android geschrieben; Verwenden von Shader zum Enthäuten. Der Code ist fast vollständig und es läuft gut auf meinem HTC DesireS.

Aber, wenn ich versuche, das gleiche auf einer trindernt SetTopBox mit PowerVR-Chipsatz zu laufen, wird meine Geometrie nicht angezeigt. Nach einem Tag des Debugging habe ich herausgefunden, dass es passiert, weil ich! = -1 als Knochenmatrix im Shader bekomme.

Ich verifiziert, dass es == -1 in meinem Telefon ist; aber ist! = -1 in der SetTopBox.

Was könnte möglicherweise falsch sein? Bitte rette mich vor diesem großen Problem.

Entschuldigung, dass Sie den Code nicht installiert haben. Hier ist der Vertex-Shader. Ich erwarte, dass vec2 (boneIndices) -1 in [0] sowie [1] hat; ist aber nicht so auf 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; 
} 

die Attributzeiger

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); 

meine Vertex- und Indexpuffer

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}; 

Einrichtung Ich bin expectin g Die Indizes müssen -1 im Shader sein; aber sie sind nicht.

+0

Was wird -1? Ein Attributindex? Könnten Sie uns etwas Code zeigen? –

+0

Es tut uns leid, dass Sie den Code nicht aufgesetzt haben. – CuriousChettai

+0

Also ... werden Sie uns Code zeigen? –

Antwort

0

Nach Tagen der Frustration, fand ich endlich das Problem von mir selbst.

Der Schuldige war der Funktionsaufruf "int()", der 0 zurückgab, auch wenn ich -1 spezifiziere. Das beobachtete Verhalten ist, dass es gibt
0 für -1
-1 -2
-2 -3 und wie ...

Ich bin nicht sicher, ob dies ein Fahrer/hw Fehler ist, oder wenn es wegen der Gleitkommadarstellung ist, wo -1 als etwas wie "-9999999" dargestellt wird

Kann jemand ein wenig mehr Licht darauf werfen?

+0

Ich habe auch dieses Problem. Was war Ihre tatsächliche Lösung am Ende? –