麻烦与AMD的OpenGL ES SDK 3.1片段着色器
在AMD OpenGL ES SDK for 3.1(如2016年5月13日的)片段着色器是这样的:麻烦与AMD的OpenGL ES SDK 3.1片段着色器
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运算符)来尝试并复制它?
人们如何更轻松地了解着色器?这似乎是一个非常难以熟练的领域。
你说这行:
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着色器工具或类似的东西,让您输入着色器代码,并获得关于它是否编译以及需要多少次循环的即时反馈。
使用texture()
函数对ES 3.1着色器进行纹理采样实际上是正确的。在与ES 2.0一起使用的GLSL版本中使用texture2D()
函数,但不适用于当前版本。
你必须改变它的原因是你的着色器代码缺少版本指令。它应该有这个作为第一行,如果你确实想在着色器代码中使用ES 3.1的功能:
#version 310 es
着色器是无效的,但是。着色器代码中的.xxx
的官方名称是组件选择运算符。它仅适用于载体,这显然是在GLSL ES 3.10规范规定了:
注意,标量不被认为是单组分的载体,因此标量使用组件选择运营商是违法的。
dot()
函数返回一个float值,它是一个标量值。因此,这种结构是无效的:
dot(...).xxx
正确地重写该行的最优雅(恕我直言)的方法是:
vec4 diff = vec4(vec3(dot(lightVec.xyz, normalize(vNormal))), 1.0);
原始着色器的代码是不是“平出错误的”。它只是缺少版本指令。既然你正在尝试使用ES 3.1,它应该有一个'#version 310 es'作为第一行。没有版本指令,缺省值为版本100,对应于ES 2.0,它需要旧式纹理采样功能。 –