Android的openGL ES 3.0着色器无法工作。

4

我在使用安卓中的openGl ES 3.0来渲染屏幕上的一个矩形,并且想要使用着色器根据顶点位置生成混合颜色。

我确定问题在于顶点和片元着色器代码中,但我不知道具体是什么问题,以下是着色器代码:

 private final String vertexShaderCode =

            "#version 300 es"+
            "in vec3 position;" +
            "out vec3 color;"+

                    "void main() {" +
                    "  gl_Position = vec4(position.x,position.y,position.z,1.0);" +
                    "  color = vec3(position.x+0.5,1.0,position.y+0.5);"+
                    "}";




    private final String fragmentShaderCode =

                    "#version 300 es"+
                    "in vec3 color;"+
                    "out vec4 out_color;"+


                    "void main() {" +
                    "  out_color= vec4(color.x,color.y,color.z,1.0);" +
                    "}";

我正在尝试根据顶点位置填充形状的颜色,因此这是每个像素生成的颜色的混合。
但我不知道为什么它不起作用?
更新:
我有三个信息:
- 链接失败,因为顶点着色器无效。 - 语言版本“300”未知,此编译器仅支持版本“320 es”及以下。 - #version指令之后发现意外的文本。

请给我们更多的信息。显示了什么?您确定着色器已经成功链接了吗?也许在编译着色器时出现了错误。GLES20.getShaderInfoLog()函数可以提供错误消息。 - oto
@oto 什么都没有显示,只有背景颜色。我应该在哪里添加这个方法? - SomeUser
2个回答

4

您的着色器代码无法成功编译,因为您遗漏了换行符(\n)。版本声明必须单独成行:

"#version 300 es\n"+

请参见OpenGL ES Shading Language 3.00 Specification - 3.4版本声明

#version指令必须出现在着色器的第一行,并且必须后跟一个换行符。


此外,您还需要为片段着色器的浮点变量添加精度限定符。例如:
"#version 300 es\n"+
"precision mediump float;\n"+

请参考OpenGL ES Shading Language 3.00 Specification - 4.5.4 Default Precision Qualifiers
在片元语言中,浮点类型没有默认的精度限定符。因此,对于float、浮点向量和矩阵变量声明,要么声明中必须包含精度限定符,要么先前必须已经声明了默认的float精度。

现在出现了一个新的错误信息:变量'color'没有定义默认精度。 - SomeUser
这些信息与片段着色器有关。 - SomeUser
是的,非常感谢,那正是问题所在。我想点赞这个答案,但我需要再获得2点声望。 - SomeUser
顺便说一下,在常规的OpenGL中这些是不需要的。 - SomeUser
@SomeUser 是的。"桌面" OpenGLOpenGL ES(嵌入式系统)是不同的规范。 - Rabbid76

2
您可以通过以下方式显示着色器错误:
    GLES20.glAttachShader(program, vertexShader);
    GLES20.glAttachShader(program, pixelShader);
    GLES20.glLinkProgram(program);
    int[] linkStatus = new int[1];
    GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
    if (linkStatus[0] != GLES20.GL_TRUE) {
        GLES20.glDeleteProgram(program);
        throw new RuntimeException("Could not link program: "
                + GLES20.glGetProgramInfoLog(program));
    }

你是否能够显示任何彩色形状?如果没有显示形状,可能会有许多原因。但如果只涉及颜色,则可以缩小搜索范围。


异常被抛出了,我猜测程序没有被链接起来?但是我看不到信息? - SomeUser
GLES20.glGetProgramInfoLog(program) 应该包含错误信息。查找“Could not link program: ”之后的文本。如果异常让你感到困惑,不要抛出任何东西,像这样打印它:System.out.println(GLES20.glGetProgramInfoLog(program)); 然后看看它说了什么。 - oto
链接失败,因为顶点着色器无效。 - SomeUser
Android的着色器代码与普通Java的OpenGL略有不同。即使着色器没问题,你仍需要相机矩阵来显示形状。这有点困难。我建议你按照此文档操作:https://developer.android.com/guide/topics/graphics/opengl - oto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接