2013-09-01 1 views
1

Я пишу 3D-приложение для Android, но всякий раз, когда я вызываю glGetAttribLocation(), я всегда получаю -1. Мне хорошо известно, что компилятор GLSL удаляет неиспользуемые переменные в моих шейдерах, но насколько я могу сказать, все используется, и я все равно получаю пустой экран. Почему GLSL не может найти мои атрибуты? Любая помощь приветствуется.OpenGL ES 2.0: glGetAttribLocation возвращает -1. Шейдерная оптимизация?

Соответствующий код:

Vertex Shader:

attribute vec3 vertex; 
attribute vec3 normal; 
uniform mat4 modelViewMatrix; 
uniform mat4 MVPMatrix; 

/*varying vec3 lightPosEye;*/ 
varying vec3 normalEye; 
/*varying vec3 vertEye;*/ 

void main() { 

    /*Calculate normal matrix*/ 
    mat4 normalMat = modelViewMatrix; 
    normalMat = inverse(normalMat); 
    normalMat = transpose(normalMat); 
    normalEye = normalize(vec3(normalMat * vec4(vNormal, 0.0))); 

    /*lightPosEye = modelViewMatrix * vec3(0.0, 0.8, 0.0);*/ 

    /*vertEye = modelViewMatrix * vPosition;*/ 

    gl_Position = MVPMatrix * vec4(vPosition, 1.0); 
} 

Фрагмент Shader:

precision mediump float; 
/*uniform vec4 vColor; */ 

/*varying vec3 lightPosEye;*/ 
varying vec3 normalEye; 
/*varying vec3 vertEye;*/ 

void main() { 

    gl_FragColor = vec4(normalEye, 1.0); 
}; 

Draw Метод:

public void draw(float[] mMVPMatrix, float[] mModelViewMatrix){ 

     GLES20.glUseProgram(mProgram); 

     //get handle to vertex shader's vPosition 
     mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); 

     //enable vertex attrib array 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 

     //load up coordinate data 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, 
       GLES20.GL_FLOAT, false, 0, meshVertBuffer); 

     mNormalHandle = GLES20.glGetAttribLocation(mProgram, "vNormal"); 

     //enable vertex attrib array 
     GLES20.glEnableVertexAttribArray(mNormalHandle); 

     //load up coordinate data 
     GLES20.glVertexAttribPointer(mNormalHandle, COORDS_PER_VERTEX, 
       GLES20.GL_FLOAT, false, 0, meshNormBuffer); 



//  //get handle to fragment shader's vColor 
//  mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); 
//  
//  //set color uniform 
//  GLES20.glUniform4fv(mColorHandle, 1, colors, 0); 



     //get handle for and load MVP matrix 
     mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "MVPMatrix"); 

     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0); 

     //load MV matrix 
     mModelViewMatrixHandle = GLES20.glGetUniformLocation(mProgram, "modelViewMatrix"); 
     GLES20.glUniformMatrix4fv(mModelViewMatrixHandle, 1, false, mModelViewMatrix, 0); 

     //draw! 
     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, meshVerts.length/COORDS_PER_VERTEX); 

     //disable vertex attrib array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
    } 

ответ

2

Вы явно не проверить на наличие ошибок компилятора. Потому что, если у вас, вы бы видели это:

gl_Position = MVPMatrix * vec4(vPosition, 1.0); 

vPosition не определен где-нибудь в вашем шейдере. Вероятно, вы хотели переименовать attribute vec3 vertex;.

Всегда проверяйте ошибки компилятора.

+1

Спасибо, я был в такой спешке, чтобы узнать, в чем была ошибка, я забыл изменить имена переменных. Я постараюсь быть более осторожным – Jin

Смежные вопросы