2014-09-02 15 views
0

我正在学习OpenGL ES 2 for Android的一本快速入门指南,学习opengl es 2.0 for android的教程。我在第3.5节,我的“编译”代码不会编译。我已经检查并进行了双重检查,但是我的代码与本书相匹配。我搜索了SO和其他网站,但它似乎只是我有这个代码有问题。我已经尝试过使用AVD和jellybean物理设备,但我总是得到Compilation of shader failed以下是我正在编译的代码。这个用于android的opengl es 2.o代码有什么问题吗?

顶点编码:

attribute vec4 a_Position; 
void main(){ 
gl_Position = a_Position; 
} 

片段编码:

precision mediump float; 
uniform vec4 u_Color; 
void main(){ 
gl_FragColor = u_Color; 
} 

助手类定位该资源并编译的OpenGL的代码:

public class ShaderHelper { 

private static final String TAG = "ShaderHelper"; 

public static int compileVertexShader(String shaderCode){ 
    return compileShader(GL_VERTEX_SHADER, shaderCode); 
} 

public static int compileFragmentShader(String shaderCode){ 
    return compileShader(GL_FRAGMENT_SHADER, shaderCode); 
} 

public static int compileShader(int type, String shaderCode){ 
    final int shaderObjectId = glCreateShader(type); 
    if(shaderObjectId == 0){ 
     if(LoggerConfig.ON){ 
      Log.w(TAG, "Could not create new shader."); 

     } 
    } 

    final int[] compileStatus = new int[1]; 
    glGetShaderiv(shaderObjectId, GL_COMPILE_STATUS, compileStatus, 0); 

    if(LoggerConfig.ON){ 
     Log.v(TAG, "Results of compiling source:" + "\n" + shaderCode + "\n:" + glGetShaderInfoLog(shaderObjectId)); 
    } 

    if(compileStatus[0] == 0){ 
     glDeleteShader(shaderObjectId); 
     if(LoggerConfig.ON){ 
      Log.w(TAG, "Compilation of shader failed."); <--This is where I get notification that the code did not compile... 
     } 
     return 0; 
    } 
    return shaderObjectId; 
} 

public static int linkProgram(int vertexShaderId, int fragmentShaderId){ 
    final int programObjectId = glCreateProgram(); 
    if(programObjectId == 0){ 
     if (LoggerConfig.ON){ 
      Log.w(TAG, "Could not create new program."); 
     } 
     return 0; 
    } 
    glAttachShader(programObjectId, vertexShaderId); 
    glAttachShader(programObjectId, fragmentShaderId); 

    final int[] linkStatus = new int[1]; 
    glGetProgramiv(programObjectId, GL_LINK_STATUS, linkStatus, 0); 

    if(LoggerConfig.ON){ 
     Log.v(TAG, "Results of linking program:\n" + glGetProgramInfoLog(programObjectId)); 
    } 

    if(linkStatus[0] == 0){ 
     glDeleteProgram(programObjectId); 
     if(LoggerConfig.ON){ 
      Log.w(TAG, "Linking of program failed."); 
     } 
     return 0; 
    } 

    return programObjectId; 
} 

public static boolean validateProgram(int programObjectId){ 
    glValidateProgram(programObjectId); 

    final int[] validateStatus = new int[1]; 
    glGetProgramiv(programObjectId, GL_VALIDATE_STATUS, validateStatus, 0); 
    Log.v(TAG, "Results of validating program: " + "\nLog:" + glGetProgramInfoLog(programObjectId)); 
    return validateStatus[0] != 0; 
} 

}

回答

0

找到了一些本书中的错误,在后面的章节中增加了额外的代码行,这些代码使以前的版本能够工作。

+0

是的,有很多电话缺失。 'glShaderSource()','glCompileShader()'等 – 2014-09-02 22:49:03