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

人们如何更轻松地了解着色器?这似乎是一个非常难以熟练的领域。

+0

原始着色器的代码是不是“平出错误的”。它只是缺少版本指令。既然你正在尝试使用ES 3.1,它应该有一个'#version 310 es'作为第一行。没有版本指令,缺省值为版本100,对应于ES 2.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着色器工具或类似的东西,让您输入着色器代码,并获得关于它是否编译以及需要多少次循环的即时反馈。

使用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);