【问题标题】:OpenGL shader builder errors on compiling编译时出现 OpenGL 着色器生成器错误
【发布时间】:2014-07-14 13:32:19
【问题描述】:

我正在使用 OpenGL 着色器生成器 v2.2.2 并从书中获取示例代码。 对于顶点着色器

#version 140
uniform float CoolestTemp;
uniform float TempRange;
uniform mat4  MVPMatrix;
in  vec4  mcVertex;
in  float VertexTemp;

out float Temperature;
void main() {

    Temperature = (VertexTemp - CoolestTemp) /  TempRange;
    gl_Position = MVPMatrix * mcVertex;
}

对于片段着色器

#version 140

uniform vec3 CoolestColor;
uniform vec3 HottestColor;

in float Temperature;
out vec4 FragmentColor;

void main() 
{    
    vec3 color = mix(CoolestColor, HottestColor, Temperature);
    FragmentColor = vec4(color, 1.0);
}

我的问题是执行此代码,因为不支持版本 140 和 320。然后我尝试删除版本,编译器说“全局变量上下文中的无效限定符'in'”和'out'相同,然后尝试将in/out替换为'variing'但在片段着色器中“分配的左侧不能是只读的”错误出现。对于顶点着色器,警告在下一阶段将不会读取不同的字段。 我如何弄清楚它以使旧式代码适应新代码? 所以我对 GLSL 完全陌生

【问题讨论】:

    标签: opengl-es fragment-shader vertex-shader


    【解决方案1】:

    从旧命名到新命名更为常见。但是如果你需要其他方式,顶点着色器的转换是:

    in --> attribute
    out --> varying
    

    对于片段着色器:

    in --> varying
    out --> (delete)
    

    对于片段着色器的out,可以删除变量的声明。而是使用内置的gl_FragColor 变量。

    对于您的示例,顶点着色器将如下所示:

    uniform float CoolestTemp;
    uniform float TempRange;
    uniform mat4  MVPMatrix;
    attribute vec4  mcVertex;
    attribute float VertexTemp;
    varying float Temperature;
    
    void main() {
        Temperature = (VertexTemp - CoolestTemp) /  TempRange;
        gl_Position = MVPMatrix * mcVertex;
    }
    

    片段着色器:

    uniform vec3 CoolestColor;
    uniform vec3 HottestColor;
    varying float Temperature;
    
    void main() {
        vec3 color = mix(CoolestColor, HottestColor, Temperature);
        gl_FragColor = vec4(color, 1.0);
    }
    

    【讨论】:

    • 终于有一些清晰的信息了,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多