java - OpenGL ES 2.0 : glGetAttribLocation returns -1. 着色器优化?

标签 java android eclipse opengl-es glsl

我正在为 Android 编写一个 3D 应用程序,但是每当我调用 glGetAttribLocation() 时,我总是得到 -1。我很清楚 GLSL 编译器会删除我的着色器中未使用的变量,但据我所知,一切都在使用中,但我仍然得到一个空白屏幕。为什么 GLSL 找不到我的属性?感谢您的帮助。

相关代码:

顶点着色器:

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

fragment 着色器:

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

最佳答案

您显然没有检查编译器错误。因为如果你有,你会看到这个:

gl_Position = MVPMatrix * vec4(vPosition, 1.0);

vPosition 未在您的着色器中任何地方定义。您可能打算将 attribute vec3 vertex; 重命名为那个。

始终检查编译器错误。

关于java - OpenGL ES 2.0 : glGetAttribLocation returns -1. 着色器优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556286/

相关文章:

java - Eclipse 为类练习设置 Maven 项目时出错 : Check $M2_HOME environment variable and mvn script match

java - Java 中的 List<String> 错误

java - Apache Camel : Is there any way to set a message to fault without injecting the exchange in a bean method?

Android:为什么我在点击一些按钮后无法在按钮点击时播放声音?

javascript - eclipse 。添加文件而不将其复制到工作区

java - 有谁知道是否有一个eclipse插件可以指出pom.xml中不兼容的jar?

java - 为什么当你有 finalize() 时关闭资源很重要

java - UnsatisfiedServletRequestParameterException spring Controller 不映射请求,错误400

android - 查看 Firebase 上的 childEventListener 是否已完成所有数据的加载

解析 XML 时出现 Android org.xmlpull.v1.XmlPullParserException