将cg中的向量转换为glsl

时间:2018-06-17 14:14:44

标签: glsl shader

我无法将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中转换它的建议?谢谢:))

1 个答案:

答案 0 :(得分:1)

假设Cg比较代码实质上是将这些操作中的每一个广播到向量的4个组件,GLSL没有一种简单的内置方法来处理它。但它确实有方式来做它。

现代GLSL(即:texture2D早已被丢弃的版本)可以访问具有条件影响的分量比较函数。它们生成布尔向量,表明相应的组件是否满足条件。

然后,您可以使用mix函数进行分量选择。但是,您必须手动执行整数广播才能使其正常工作。

所以等效的GLSL代码是:

mix(vec4(2.0), vec4(1.0), greaterThan(dst, vec4(0.5)));

是的,mix中值的顺序是“向后”:错误条件(不大于)的值是第一个;真实情况是第二个。