获取"数字类型构造函数的参数数量不正确"着色器中的错误

时间:2017-07-05 00:42:14

标签: unity3d glsl shader shaderlab

我已经学习了Unity Shader几天,并决定从Shadertoy移植this油色调器。

我收到以下错误:

  

第69行的numeric-type构造函数的参数数量不正确   (在glcore上)

以下是着色器代码的相关部分:

#define T (_Time/3.+5.)

fixed4 frag(v2f i) : SV_Target
{
    float4 fragColor = 0;
    float2 fragCoord = i.vertex.xy;

    float4 k = fragColor;
    float2 p = fragCoord;

    float s = 1.;

    #define rot(p,a) float2 sc = sin(float2(a,a + 1.6));  p *= float2x2(sc.y,-sc.x,sc);

    #define A float3(0,1,157)
    #define B {float2 m = frac(p),l = dot(p - m,A.yz) + A.xz,r = lerp(frac(57.*sin(l++)),frac(57.*sin(l)),(m *= m*(3. - m - m)).x); k += lerp(r.x,r.y,m.y) / (s += s); p *= float4(1,1,1,-1);}

    p *= log(T) / R.y;              // scaling (slow zoom out)
    p.x += T;                       // translation
    rot(p, T / 22.); //ERROR HERE

    //......the rest of the code below
}

rot(p, T / 22.);行是错误所在的位置。有趣的是,当我删除或注释掉这行代码时,着色器编译并且正常工作。我仍然想知道为什么这行不能编译。

导致该错误的原因是什么?如何解决?

修改

正如helium所指出的那样,float3x3是一个矩阵。

以下是原始rot功能:

#define rot(p,a) vec2 sc=sin(vec2(a,a+1.6)); p*=mat2(sc.y,-sc.x,sc);

移植版本:

#define rot(p,a) float2 sc = sin(float2(a,a + 1.6));  p *= float2x2(sc.y,-sc.x,sc);

请注意我如何将mat2替换为float2x2,因为它是HLSL中的equivalent类型。

我确实认为问题来自float2x2(sc.y,-sc.x,sc);。执行此操作的适当方法是什么,仍然使用3参数作为原始代码?

1 个答案:

答案 0 :(得分:1)

内置值_Timefloat4,因此您必须根据所需的时间尺度选择其中一个组件:

  

_Time float4(t / 20,t,t * 2,t * 3),用于为着色器内的动画制作动画。

例如#define T (_Time.y/3.+5.)

另一件事是*的{​​{1}}运算符表示2个矩阵的分量乘积。对于矢量矩阵/矩阵矩阵乘积,您应该使用float2x2函数。

所以在mul函数中你应该有rot

有关详细信息,请访问:https://en.wikibooks.org/wiki/Cg_Programming/Vector_and_Matrix_Operations