我无法将cg着色器转换为glsl。
在cg中,有一行:
float4 dst = tex2D(DST, i.uv);
float4 outputColor = (dst > 0.5 ? 1.0 : 2.0);
当我将其转换为glsl时:
vec4 dst = texture2D(DST, v_texCoord);
vec4 outputColor = (dst > 0.5 ? 1.0 : 2.0);
我遇到错误:
'>' : comparison operator only defined for scalars
然后我尝试了:
vec4 outputColor = (dst > vec4(0.5) ? 1.0 : 2.0);
仍然是同样的错误.....
任何人都可以给我一些关于如何在glsl中转换它的建议?谢谢:))
答案 0 :(得分:1)
假设Cg比较代码实质上是将这些操作中的每一个广播到向量的4个组件,GLSL没有一种简单的内置方法来处理它。但它确实有方式来做它。
现代GLSL(即:texture2D
早已被丢弃的版本)可以访问具有条件影响的分量比较函数。它们生成布尔向量,表明相应的组件是否满足条件。
然后,您可以使用mix
函数进行分量选择。但是,您必须手动执行整数广播才能使其正常工作。
所以等效的GLSL代码是:
mix(vec4(2.0), vec4(1.0), greaterThan(dst, vec4(0.5)));
是的,mix
中值的顺序是“向后”:错误条件(不大于)的值是第一个;真实情况是第二个。