2013-09-01 94 views
1

我正在为Android编写一个3D应用程序,但每当我调用glGetAttribLocation()时,我总是得到-1。我很清楚GLSL编译器在我的着色器中删除了未使用的变量,但据我所知,所有的东西都在使用中,我仍然看到一个空白的屏幕。为什么GLSL不能找到我的属性?任何帮助表示赞赏。OpenGL ES 2.0:glGetAttribLocation返回-1。着色器优化?

相关代码:

顶点着色器:

​​

片段着色器:

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

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

void main() { 

    gl_FragColor = vec4(normalEye, 1.0); 
}; 

绘制方法:

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