1

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。

不知道尝试计算漫反射着色器发生了什么。它使用来获取浮点数,并在浮点数上调用 swizzle(我认为这就是您所说的.xxx运算符)来尝试复制它?

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

4

2 回答 2

0

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

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

#version 310 es

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

请注意,标量不被视为单分量向量,因此在标量上使用分量选择运算符是非法的。

dot()函数返回一个浮点数,它是一个标量值。所以这个构造是无效的:

dot(...).xxx

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

vec4 diff = vec4(vec3(dot(lightVec.xyz, normalize(vNormal))), 1.0);
于 2016-05-14T02:45:37.450 回答
0

你是说这一行:

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 规范武装自己,这样你就可以参考任何你不理解/不能翻译成你选择的方言的东西。并获得 PowerVR 着色器工具或类似的工具,让您输入着色器代码并获得关于它是否编译以及需要多少周期的即时反馈。

于 2016-05-13T22:17:23.650 回答