Android GLES20-程序未链接

Android GLES20-程序未链接,android,opengl-es-2.0,Android,Opengl Es 2.0,我正在使用GLES20创建一个着色器程序。链接状态为false,并且GLES20。glGetProgramInfoLog(程序)只返回一个空字符串 着色器本身似乎进行了相应的编译,因为GLES20.glGetShaderiv(着色器,GLES20.GL\u compile\u STATUS,STATUS,0)为顶点着色器和片段着色器提供了true 由于GLES20.glGetProgramInfoLog(program)只返回一个空字符串,因此调试起来非常困难,而且着色器在我看来是正确的,但我显

我正在使用GLES20创建一个着色器程序。链接状态为false,并且
GLES20。glGetProgramInfoLog(程序)
只返回一个空字符串

着色器本身似乎进行了相应的编译,因为
GLES20.glGetShaderiv(着色器,GLES20.GL\u compile\u STATUS,STATUS,0)
为顶点着色器和片段着色器提供了true

由于
GLES20.glGetProgramInfoLog(program)
只返回一个空字符串,因此调试起来非常困难,而且着色器在我看来是正确的,但我显然错过了一些东西。有人知道吗

提前谢谢

现在简化了代码和着色器:

private static String vertexSrc = "#version 100\n" +
        "#ifdef GL_FRAGMENT_PRECISION_HIGH\n" +
        "precision highp float;\n" +
        "#else\n" +
        "precision mediump float;\n" +
        "#endif\n" +
        "\n" +
        "attribute vec3 position;\n" +
        "\n" +
        "\n" +
        "void main() {         \n" +
        "\t\n" +
        "\tgl_Position = vec4(position, 1.0);\n" +
        "\n" +
        "}";
private static String fragmentSrc = "#version 100\n" +
        "#ifdef GL_FRAGMENT_PRECISION_HIGH\n" +
        "precision highp float;\n" +
        "#else\n" +
        "precision mediump float;\n" +
        "#endif\n" +
        "\n" +
        "\n" +
        "void main() {       \n" +
        "\n" +
        "\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" +
        "\n" +
        "}";

private void initShader(){

    int vertexShader = loadShader(vertexSrc, GLES20.GL_VERTEX_SHADER);
    int fragmentShader = loadShader(fragmentSrc, GLES20.GL_FRAGMENT_SHADER);

    int program = GLES20.glCreateProgram();
    System.out.println("Created program: " + program);

    System.out.println("Attaching " + vertexShader + " to " + program);
    GLES20.glAttachShader(program, vertexShader);
    System.out.println("Attaching " + fragmentShader + " to " + program);
    GLES20.glAttachShader(program, fragmentShader);

    int[] attached = new int[2];
    int[] count = new int[1];
    GLES20.glGetAttachedShaders(program, 2, count, 0, attached, 0);
    System.out.println("attached (" + count[0] + "): " + attached[0] + ", " + attached[1]);

    GLES20.glBindAttribLocation(program, 0, "position");
    //GLES20.glBindAttribLocation(program, 1, "texCoord");

    GLES20.glLinkProgram(program);

    int[] lstatus = new int[1];
    GLES20.glGetShaderiv(program, GLES20.GL_LINK_STATUS, lstatus, 0);
    if (lstatus[0] == GL11.GL_FALSE){
        System.err.println("Could not link program.\nlink status: " + lstatus[0]);
        System.err.println("Program-Info-Log: " + GLES20.glGetProgramInfoLog(program));
    }else{
        System.out.println("program linked: " + program);
    }

    GLES20.glValidateProgram(program);

    int[] vstatus = new int[1];
    GLES20.glGetShaderiv(program, GLES20.GL_VALIDATE_STATUS, vstatus, 0);

    if (vstatus[0] == GL11.GL_FALSE){
        System.err.println("Could not validate program.\nvalidate status: " + vstatus[0]);
        System.err.println("Program-Info-Log: " + GLES20.glGetProgramInfoLog(program));
    }else{
        System.out.println("program validated: " + program);
    }

}

private int loadShader(String shadercontent, int GL20_XXX_SHADER){

    //System.out.println(shadercontent);

    if(GL20_XXX_SHADER == GLES20.GL_VERTEX_SHADER)
        System.out.println("Loading vertex shader...");
    else if(GL20_XXX_SHADER == GLES20.GL_FRAGMENT_SHADER)
        System.out.println("Loading fragment shader...");

    int shader = GLES20.glCreateShader(GL20_XXX_SHADER);
    GLES20.glShaderSource(shader, shadercontent);
    GLES20.glCompileShader(shader);
    int[] status = new int[1];
    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, status, 0);
    if (status[0] == GL11.GL_FALSE){
        System.err.println("Could not load shader: \n" + GLES20.glGetShaderInfoLog(shader));
    }else{
        System.out.println("Shader compiled: " + shader);
    }
    return shader;
}
输出:

D/libEGL: eglInitialize EGLDisplay = 0x9f7467c4
I/OpenGLRenderer: Initialized EGL, version 1.4
D/mali_winsys: new_window_surface returns 0x3000,  [1536x2048]-format:1
D/libEGL: eglInitialize EGLDisplay = 0xae57b4c4
D/mali_winsys: new_window_surface returns 0x3000,  [1536x1872]-format:1
I/System.out: Loading vertex shader...
D/libGLESv1: DTS_GLAPI : DTS is not allowed for Package : net.mypackage.myapp
I/System.out: Shader compiled: 1
I/System.out: Loading fragment shader...
I/System.out: Shader compiled: 2
I/System.out: Created program: 3
I/System.out: Attaching 1 to 3
I/System.out: Attaching 2 to 3
I/System.out: attached (2): 1, 2
W/System.err: Could not link program.
W/System.err: link status: 0
W/System.err: Program-Info-Log: 
W/System.err: Could not validate program.
W/System.err: validate status: 0
W/System.err: Program-Info-Log: 

很抱歉,我无法评论主要问题。因此,我必须写一个答案。请删除glValidateProgram,看看这是否是信息日志为空的原因?由于程序在链接失败后可能有效,因此您可以在glLinkProgram之后使用空字符串覆盖glValidateProgram的信息日志

更新


您的错误是使用glGetShaderiv而不是GLGETSPROGRAMIV检查程序的状态。这会导致GL_无效_操作错误。在手机的开发者选项中,您可以打开OpenGL跟踪,这将向您显示此错误。这也解释了为什么你的信息日志是空的。glGetShaderiv没有成功,不知道您的程序有什么问题。glGetProgramiv会给你成功的回报。

很抱歉,我无法评论主要问题。因此,我必须写一个答案。请删除glValidateProgram,看看这是否是信息日志为空的原因?由于程序在链接失败后可能有效,因此您可以在glLinkProgram之后使用空字符串覆盖glValidateProgram的信息日志

更新


您的错误是使用glGetShaderiv而不是GLGETSPROGRAMIV检查程序的状态。这会导致GL_无效_操作错误。在手机的开发者选项中,您可以打开OpenGL跟踪,这将向您显示此错误。这也解释了为什么你的信息日志是空的。glGetShaderiv没有成功,不知道您的程序有什么问题。glGetProgramiv将为您成功返回。

谢谢,但信息日志仍然为空。我听说这是一个bug。你有没有试着明确说明着色器的版本?我的意思是#版本100或类似的东西在每个顶部?我在GLES/GLSL中没有明确说明版本时遇到问题。我现在尝试了
#version 100
,但没有成功。着色器仍然成功编译,但程序将不会链接。是否确定片段着色器和顶点着色器都编译为正确的着色器类型?我的意思是,也许你有一些复制和粘贴错误的内部或左右。你也能给我们编译代码吗?我现在已经简化了代码和着色器(运气不好),并把它放到了问题中。我希望这能有所帮助谢谢,但是信息日志仍然是空的。我听说这是一个bug。你有没有试着明确说明着色器的版本?我的意思是#版本100或类似的东西在每个顶部?我在GLES/GLSL中没有明确说明版本时遇到问题。我现在尝试了
#version 100
,但没有成功。着色器仍然成功编译,但程序将不会链接。是否确定片段着色器和顶点着色器都编译为正确的着色器类型?我的意思是,也许你有一些复制和粘贴错误的内部或左右。你也能给我们编译代码吗?我现在已经简化了代码和着色器(运气不好),并把它放到了问题中。我希望这能有所帮助我也尝试使用几乎为空的着色器,但仍然存在相同的问题。看起来问题的根源不在着色器中。您在其他设备上尝试过吗?如果着色器代码中存在错误,其他设备可能会为您提供更好的信息。我怀疑您在特定的GLES实现中遇到了一个bug,因此简化可能是一个好主意。有一件随机的事情要尝试:在你的VS中,texCoord0是隐式的High,而在你的PS中,它是隐式的mediump,试着让它们匹配。@Columbo我用2个物理设备和1个模拟器进行了尝试。问题是,仿真器为链接和验证状态提供了true。我今天将使用显式精度进行测试,然后回来。@Columbo谢谢,但不幸的是,将显式精度设置为texCoord0并没有解决问题。我还尝试使用几乎为空的着色器,但仍然存在相同的问题。看起来问题的根源不在着色器中。您在其他设备上尝试过吗?如果着色器代码中存在错误,其他设备可能会为您提供更好的信息。我怀疑您在特定的GLES实现中遇到了一个bug,因此简化可能是一个好主意。有一件随机的事情要尝试:在你的VS中,texCoord0是隐式的High,而在你的PS中,它是隐式的mediump,试着让它们匹配。@Columbo我用2个物理设备和1个模拟器进行了尝试。问题是,仿真器为链接和验证状态提供了true。我今天将使用显式精度进行测试,然后回来。@Columbo谢谢,但不幸的是,将显式精度设置为texCoord0并没有解决问题。