2014-09-27 59 views
0

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

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

HELPER:

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,链接程序很好,如果我不使用辅助方法联系起来。 为什么?

+0

所有编写的代码看起来不错,但你可以发布确切的错误(你从信息日志得到什么(我假设你的程序崩溃的帮手?函数抛出你的runtimeException) – ThMBc 2014-09-27 12:27:32

+0

信息记录是空的,但我得到GL_INVALID_OPERATION错误 – user3325226 2014-09-27 13:27:16

+0

你正确设置了opengl的版本吗?要使用openGL ES 2.0,你必须在GLSurfaceView上调用'setEGLContextClientVersion(2);'。 – ThMBc 2014-09-27 13:35:47

回答

0

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

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

顾名思义,fragmentShaderHandle是片段着色器对象。对于链接程序,你需要通过程序对象:

ProgramHelper.linkProgram(programHandle);