首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用法线时打开GL ES 2.0 - glGetAttribLocation返回-1

使用法线时打开GL ES 2.0 - glGetAttribLocation返回-1
EN

Stack Overflow用户
提问于 2016-03-14 14:33:55
回答 1查看 614关注 0票数 0

我的代码:

代码语言:javascript
运行
复制
public void draw1(float[] mvpMatrix) {
    // Add program to OpenGL environment
    GLES20.glUseProgram(mProgram);

    // get handle to shape's transformation matrix
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    // get handle to vertex shader's vPosition member
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    MyGLRenderer.checkGlError("glGetUniformLocation");

    mNormalHandle = GLES20.glGetAttribLocation(mProgram, "a_normal");//new line

    fsTexture = GLES20.glGetUniformLocation(mProgram, "Texture");
    vsTextureCoord = GLES20.glGetAttribLocation(mProgram, "texCoord");
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
    GLES20.glUniform1i(fsTexture, 0);

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    MyGLRenderer.checkGlError("glUniformMatrix4fv");
    // Enable a handle to the triangle vertices

    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(
            mPositionHandle, COORDS_PER_VERTEX,
            GLES20.GL_FLOAT, false,
            vertexStride, vertexBuffer);
    GLES20.glVertexAttribPointer(vsTextureCoord, COORDS_PER_TEXTURE,
            GLES20.GL_FLOAT, false,
            TextureStride, texBuffer);
    GLES20.glEnableVertexAttribArray(vsTextureCoord);

    GLES20.glVertexAttribPointer(mNormalHandle, COORDS_PER_NORMAL, GLES20.GL_FLOAT, false,
            12, normalbuffer);//new line

    GLES20.glEnableVertexAttribArray(mNormalHandle);//new line


    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, tablelamp21NumVerts);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
    GLES20.glDisableVertexAttribArray(vsTextureCoord);
    GLES20.glDisableVertexAttribArray(mNormalHandle);//new line
}

所以我在MyGLRenderer.checkGlError("glGetUniformLocation");代码行得到一个glGetUniformLocation: GLES1281调试后我发现我的mNormalHandle是-1,即GLES20.glGetAttribLocation(mProgram,"a_normal");返回-1,即使我在顶点着色器中使用它,并且我正在使用GLES20.glBindAttribLocation(mProgram,2,"a_normal");在链接之前请帮助。着色器代码:

代码语言:javascript
运行
复制
   private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
                "uniform mat4 u_MVMatrix;" +

                "attribute vec4 vPosition;" +
                "attribute vec2 texCoord;" +
                "attribute vec3 a_normal;"+ //new line

                "varying vec3 v_normal;"+//new line
                "varying vec2 texCoordOut;" +
                "void main() {" +
                "   v_normal = vec3(u_MVMatrix * vec4(a_normal, 0.0));"+
                "   texCoordOut = texCoord;" +
                "   gl_Position = uMVPMatrix * vPosition;" +
                "}";

private final String fragmentShaderCode =
        "precision mediump float;" +
                "uniform sampler2D Texture;" +
                "varying vec2 texCoordOut;"+
                "void main() {" +
                " gl_FragColor = texture2D(Texture, texCoordOut);" +
                "}";
EN

回答 1

Stack Overflow用户

发布于 2017-07-18 06:02:15

很抱歉回答一个过时的问题,但如果这能帮助其他开发人员:我认为GLSL编译器在剔除未使用的变量方面非常好。

例如,使用Android模拟器的OpenGL/ES驱动程序编译的以下顶点和片段着色器:

代码语言:javascript
运行
复制
private val vertexShaderCode = """attribute vec4 in_position;
            attribute vec2 in_texcoord;

            uniform mat4 projection;
            uniform mat4 view;
            uniform mat4 model;

            varying vec2 var_texcoord;

            void main() {
                var_texcoord = in_texcoord;
                gl_Position = projection * view * model * in_position;
            }
            """

    private val fragmentShaderCode = """
            precision mediump float;

            varying vec2 var_texcoord;

            uniform sampler2D texture;
            uniform vec4 color;

            void main() {
                gl_FragColor = color;
            }
            """

GLES20.glGetAttribLocation(program,"in_texcoord");将返回-1

现在,如果我们使用var_texcoord来计算片段着色器中的颜色:

代码语言:javascript
运行
复制
private val fragmentShaderCode = """
            precision mediump float;

            varying vec2 var_texcoord;

            uniform sampler2D texture;
            uniform vec4 color;

            void main() {
                gl_FragColor = texture2D(texture, var_texcoord);
            }
            """

GLES20.glGetAttribLocation(program,"in_texcoord");将返回一个有效的id,> -1

显然,GLSL编译器可以删除变量和可变变量,如果它们不被使用的话,所以你的a_normal变量似乎也被删除了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35980927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档