碎片着色器GLSL纹理,颜色和纹理/颜色

  • 本文关键字:颜色 纹理 GLSL 碎片 ios glsl
  • 更新时间 :
  • 英文 :


我想完成一个GLSL着色器,可以纹理和颜色我的顶点对象。事实上,它在2/3种情况下对我有效:

1)如果我只分配了一个纹理(但没有特定的颜色-所以颜色是"白色"),我只是得到一个纹理对象-作品

2)如果我有一个纹理和一个颜色分配,我得到一个纹理对象调制与该颜色-作品

3)如果我只分配了一个颜色,但没有纹理,我得到一个黑色的对象-不工作

我的Shader看起来像这样:

varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;
void main(){
    gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying;
}

我猜,texture2D(…,…)返回零,如果没有纹理分配-所以这似乎是问题。是否有一种方法在GLSL我可以检查,如果没有纹理分配(在这种情况下,我想简单的gl_FragColor = colorVarying;)

"如果"在GLSL着色器中不是一个选项,如果我理解正确-有什么想法来完成这个?或者真的有必要为这两种情况制作2个不同的着色器吗?

和你一样,我也接受了一般的建议,即在当前的移动硬件上避免使用'if',但之前在StackOverflow上的优化讨论似乎表明这不是一个重大障碍。所以不要忽略它。在任何情况下,GLSL编译器是相当聪明的,可以选择切换代码,它实际运行取决于为制服设置的值,虽然在这种情况下,你得到的是一样的,如果你只是提供替代着色器。

也就是说,如果你绝对确定你想在所有目的中使用相同的着色器,并且想避免使用if语句,那么你可能想要这样做:

uniform lowp float textureFlag;
[...]
gl_FragColor = textureFlag * texture2D(texture, texcoordVarying) * colorVarying + 
               (1.0 - textureFlag) * colorVarying;

甚至:

gl_FragColor = mix(
                     colorVarying,
                     texture2D(texture, texcoordVarying) * colorVarying,
                     textureFlag
                  )

将textureFlag设置为1.0或0.0,这取决于您是否希望将纹理值考虑在内。

我不知道有什么方法可以确定(I) sampler2D是否指向实际的纹理单元;(ii)一个特定的纹理单元是否有一个缓冲区绑定到它,数据已经上传。

最新更新