【问题标题】:Trouble with AMD OpenGL ES SDK 3.1 Fragment ShaderAMD OpenGL ES SDK 3.1 片段着色器的问题
【发布时间】: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


【解决方案1】:

你是说这一行吗:

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 着色器工具或类似工具,让您输入着色器代码并获得关于它是否编译以及需要多少周期的即时反馈。

【讨论】:

    【解决方案2】:

    使用texture() 函数对纹理进行采样实际上对于 ES 3.1 着色器是正确的。 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多