【发布时间】:2016-09-09 23:45:28
【问题描述】:
AMD OpenGL ES SDK for 3.1(截至 2016 年 5 月 13 日)中的片段着色器是这样的:
precision highp float;
uniform vec4 lightVec;
uniform sampler2D textureUnit0;
varying vec2 vTexCoord;
varying vec3 vNormal;
void main()
{
vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1);
gl_FragColor = diff * texture(textureUnit0, vTexCoord);
}
这是完全错误的。我最接近纠正的是:
precision highp float;
uniform vec4 lightVec;
uniform sampler2D textureUnit0;
varying vec2 vTexCoord;
varying vec3 vNormal;
void main()
{
vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1);
gl_FragColor = diff * texture2D(textureUnit0, vTexCoord);
}
这只是在最后一行将纹理转换为texture2D。
不知道在尝试计算漫反射着色器时发生了什么。它使用 dot 来获得浮点数,并在浮点数上调用 swizzle(我认为这就是您所说的 .xxx 运算符)来尝试复制它?
人们如何轻松了解着色器的更多信息?这似乎是一个很难熟练掌握的领域。
【问题讨论】:
-
原始着色器代码并非“完全错误”。它只是缺少版本指令。由于您尝试使用 ES 3.1,所以它应该有一个
#version 310 es作为第一行。没有版本指令,默认是100版本,对应ES 2.0,需要老风格的纹理采样功能。
标签: opengl-es glsles opengl-es-3.1