我正在使用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。然后我尝试删除版本,编译器在'全局变量上下文中'表示“无效限定符”和'out'相同,然后尝试将in / out替换为'vary'但在片段着色器中“赋值的左侧”不得为只读“错误出现。对于顶点着色器,有关于下一阶段不会读取的变化字段的警告。 我怎样才能弄清楚将旧式代码改编为新代码? 所以我对GLSL来说是新手
答案 0 :(得分:8)
从旧命名到新命名更为常见。但是如果你需要另一种方式,顶点着色器的转换是:
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);
}