AMD OpenGL ES SDK 3.1 片段着色器的问题

Trouble with AMD OpenGL ES SDK 3.1 Fragment Shader

AMD OpenGL ES SDK for 3.1(截至 5/13/2016)中的片段着色器是这样的:

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 运算符)来尝试复制它?

人们如何轻松地了解有关着色器的更多信息?这似乎是一个很难熟练掌握的领域。

你是说这一行:

vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1);

由于点结果的混乱而无法编译?尝试:

float fDot = dot(lightVec.xyz,normalize(vNormal));
vec4 diff = vec4(fDot, fDot, fDot, 1);

至于学习如何更好地编写着色器,我会搜索有关任何 GLSL 风格的教程,看看是否能找到您喜欢的教程,桌面版本有所不同,但 不同,如果您不将搜索限制在一个特定的修订版,您将能够找到更好的教程。

然后用 GLSLES 3.1 规范武装自己,这样您就可以参考任何您不understand/can未翻译成您选择的方言的内容。并获得 PowerVR 着色器工具或类似工具,让您可以键入着色器代码并获得有关它是否编译以及需要多少周期的即时反馈。

使用 texture() 函数对纹理进行采样对于 ES 3.1 着色器实际上是正确的。 texture2D() 函数在 ES 2.0 附带的 GLSL 版本中使用,但在当前版本中没有使用。

您必须更改它的原因是您的着色器代码缺少版本指令。如果您真的想在着色器代码中使用 ES 3.1 功能,它应该将此作为第一行:

#version 310 es

但是着色器无效。着色器代码中 .xxx 的正式名称是 组件选择运算符 。它仅适用于矢量,这在 GLSL ES 3.10 规范中有明确说明:

Note that scalars are not considered to be single-component vectors and therefore the use of component selection operators on scalars is illegal.

dot()函数returns一个浮点数,这是一个标量值。所以这个结构是无效的:

dot(...).xxx

正确重写该行的最优雅(恕我直言)方式是:

vec4 diff = vec4(vec3(dot(lightVec.xyz, normalize(vNormal))), 1.0);