【问题标题】:Getting "incorrect number of arguments to numeric-type constructor" error in a shader在着色器中获取“数字类型构造函数的参数数量不正确”错误
【发布时间】:2017-07-05 00:42:13
【问题描述】:

我这几天一直在学习 Unity 着色器,并决定从 Shadertoy 移植 this oil shader。

我收到以下错误:

第 69 行数字类型构造函数的参数数量不正确 (在 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 参数?

【问题讨论】:

  • 我远非着色器专家,但 float3x3 是等待矩阵的 的矩阵构造函数,对吧?但是您只指定了 3 个单个浮点值。我不知道它是否会自动“转换”为具有 3 个相同组件的行。
  • @没错。这是一个矩阵,当它被调用时,这似乎是问题所在。原始代码使用mat2MicrosoftUnity forum 表示适当的翻译是float2x2。我不知道如何使它像原始代码一样采用 3 个参数。查看我的编辑以了解我的意思。
  • 你还有这个错误吗?根据wiki,float2x2 可以接受 2 个参数作为行或 4 个参数作为矩阵的各个元素。我猜你可以调用构造函数并将第四个参数设置为 0。
  • 试过了,但还是有同样的问题。
  • 怎么样:float2x2(sc.y,-sc.x,sc.x,sc.y); 因为 sc 是一个 float2(在你的 Shadertoy 中工作)

标签: unity3d glsl shader shaderlab


【解决方案1】:

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

_Time float4 (t/20, t, t*2, t*3),用于在着色器中设置动画。

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

另一件事是* 运算符float2x2 表示2 个矩阵的组件乘积。对于向量矩阵/矩阵矩阵产品,您应该使用mul 函数。

所以在rot 函数中你应该有p =mul(p, float2x2(sc.y,-sc.x,sc));

有关这方面的更多信息,您可以访问:https://en.wikibooks.org/wiki/Cg_Programming/Vector_and_Matrix_Operations

【讨论】:

  • *= 并不是真正的主要问题,因为我在网上阅读了许多资料后已经这样做了。问题是您提到的_Time.y。我忘了在末尾添加y,所以当我调用rot 函数并将其传递给T 时,它会触发错误。在添加.y 后,这实际上解决了问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多