GLSL ES本地变量崩溃?

3

我正在尝试在我的OpenGL ES 2.0引擎中实现来自在线教程(lighthouse3d.com)的一些着色器。

问题在于,由于某种原因,在main()作用域中声明的任何变量都会导致整个着色器失败。例如,以下内容会失败:

void main(){
    vec4 color;     
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}

但这个是完美的:

void main(){
    //vec4 color;       
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}

我的顶点着色器也有同样的问题。(编辑:不好意思,只是片段着色器似乎有这个问题)使用任何非常量值的唯一方法是使用属性、varying、uniform等。例如,以下代码可以正常工作:

uniform sampler2D texture;
varying lowp vec4 fragcol;
varying lowp vec2 texco;

void main(){
    gl_FragColor = fragcol * texture2D(texture, texco);
}

此外,我在寻找有关GLSL ES(或其称之为的版本)的文档或资源方面遇到了很大的麻烦。我所能找到的只有这个链接:http://old.siggraph.org/publications/2006cn/course16/KhronosSpecs/ESLanguageSpec1.10.11.pdf
以下是我找到的与变量声明相关的全部内容:
[省略]没有默认类型。所有变量和函数声明必须具有声明的类型,以及可选的限定符。通过指定其类型,后跟一个或多个用逗号分隔的名称来声明变量。[省略]
这正是我所做的:
声明类型:vec4 接着是一个或多个名称:color
vec4 color

我不知所措

编辑: GLES20.glGetError() 返回错误码1282


1
你使用的编译器/实现是什么? - Nicol Bolas
糟糕!我知道我忘记了什么。我正在使用Android开发工具包进行开发。我应该更新我的帖子。 - AlexRamallo
1个回答

9

GLSL ES与传统GLSL不同之处在于,它需要精度修饰符来指定完整的类型。例如,您尝试过以下内容吗:

void main(){
    lowp vec4 color;     
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}

您还可以将以下内容放入源文件的顶部:

precision highp float;

为了后续可以省略,默认精度需要设置。

要获取编译GLSL错误的详细信息,您可以使用glGetProgramInfoLog(并获得glGetProgramiv的帮助)。大多数GL实现返回有意义的错误和行号。不幸的是,我对Java很陌生,但在C中,您可以执行以下操作:

    glCompileShader(shader);

    // check whether compilation was successful; if not
    // then dump the log to the console
    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    if(!status)
    {
        GLint logLength;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
        if (logLength > 0)
        {
            GLchar *log = (GLchar *)malloc(logLength);
            glGetShaderInfoLog(shader, logLength, &logLength, log);
            printf("Shader compile log:\n%s", log);
            free(log);
        }
    }

[着色器错误] 链接错误:片段着色器未成功编译。>_> 不是很有用。编辑:日志失败了,所以我尝试添加精度修饰符,它起作用了!我认为这一点信息应该更容易找到。感谢您的帮助。 - AlexRamallo
@AlexRamallo 如果你从OpenGL ES的资源中学习而不是尝试逐个复制桌面GL示例,那么很容易找到答案,因为显然这种方法并不总是奏效。 - Christian Rau

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