GLSL ES局部变量崩溃?

问题描述 投票:3回答:2

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

问题是由于某种原因,在main()范围内声明的ANY变量都会导致整个着色器失败。例如,此操作失败:

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

我的顶点着色器发生了同样的事情。(EDIT:nvm,似乎只发生在片段着色器中)使用任何类型的非恒定值的唯一方法是使用属性,变化,统一等。例如,这可以按您期望的那样工作:

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

这就是我能找到的所有与变量声明有关的内容:

[snip]没有默认类型。所有变量和函数声明必须具有声明的类型以及可选的限定符。变量是通过指定其类型后跟一个或多个名称来声明以逗号分隔。[snip]

这正是我所做的:

声明的类型:vec4

后跟一个或多个名称:颜色;

vec4 color

我一无所知

编辑:GLES20.glGetError()给出错误1282

android opengl-es glsl opengl-es-2.0
2个回答
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);
        }
    }

0
投票

一段时间以来,我一直在努力解决此类错误...我不知道为什么会这样,但是如果未在整个GLSL管道中使用声明的变量,似乎会破坏编译器。它不取决于变量的类型,也不取决于它是否已初始化。这是A **中的一个痛苦,因为没有着色器程序的本地智能...您只需要小心(和耐心!)

© www.soinside.com 2019 - 2024. All rights reserved.