繁体   English   中英

Java Android OpenGL ES 2.0无法链接程序

[英]Java Android OpenGL ES 2.0 Can't link program

我尝试将基本着色器程序与顶点和片段着色器链接。 两个着色器都可以成功编译,但是如果我尝试链接程序,则链接始终会失败。 怎么了,为什么链接失败了? 信息日志为空,但链接时出现GL_INVALID_OPERATION错误。 我从GLSurfaceView.Renderer接口的“ onSurfaceCreated”方法中运行MAIN代码。

主要:

String vertexShaderSource = "attribute vec4 a_Position;     " +
                            "void main()                    " +
                            "{                              " +
                            "   gl_Position = a_Position;   " +
                            "}                              ";

String fragmentShaderSource =   "precision mediump float;                   " +
                                "void main()                                " +
                                "{                                          " +
                                "   gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);" +
                                "}                                          ";

int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
GLES20.glShaderSource(vertexShaderHandle, vertexShaderSource);
ShaderHelper.compileShader(vertexShaderHandle);

int fragmentShaderHandle = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
GLES20.glShaderSource(fragmentShaderHandle, fragmentShaderSource);
ShaderHelper.compileShader(fragmentShaderHandle);

programHandle = GLES20.glCreateProgram();
GLES20.glAttachShader(programHandle, vertexShaderHandle);
GLES20.glAttachShader(programHandle, fragmentShaderHandle);
ProgramHelper.linkProgram(fragmentShaderHandle);

帮手:

public static void compileShader(int shaderHandle)
    {
        GLES20.glCompileShader(shaderHandle);
        int[] results = new int[1];
        GLES20.glGetShaderiv(shaderHandle, GLES20.GL_COMPILE_STATUS, results, 0);

        if(results[0] != GLES20.GL_TRUE)
        {
            String infoLog = GLES20.glGetShaderInfoLog(shaderHandle);
            throw new RuntimeException("Failed to compile shader!" + '\n' + infoLog);
        }
    }

    public static void linkProgram(int programHandle)
    {
        GLES20.glLinkProgram(programHandle);
        int[] results = new int[1];
        GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, results, 0);

        if(results[0] != GLES20.GL_TRUE)
        {
            String infoLog = GLES20.glGetProgramInfoLog(programHandle);
            throw new RuntimeException("Failed to link program!" + '\n' + infoLog);
        }
    }

编辑:

WTF,如果我不使用helper方法进行链接,则程序可以很好地链接。 为什么???

您的代码将错误的参数传递给linkProgram()方法:

programHandle = GLES20.glCreateProgram();
...
ProgramHelper.linkProgram(fragmentShaderHandle);

顾名思义, fragmentShaderHandle是片段着色器对象。 要链接程序,您需要传递程序对象:

ProgramHelper.linkProgram(programHandle);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM