簡體   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