在着色器中出现 "incorrect number of arguments to numeric-type constructor" 错误
Getting "incorrect number of arguments to numeric-type constructor" error in a shader
我已经学习了几天 Unity 着色器并决定从 Shadertoy 移植 this 油着色器。
我收到以下错误:
incorrect number of arguments to numeric-type constructor at line 69
(on 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);
请注意我是如何用 float2x2
替换 mat2
的,因为那是 HLSL 中的 equivalent 类型。
我相信问题出在 float2x2(sc.y,-sc.x,sc);
。执行此操作并仍像原始代码那样使用 3
参数的适当方法是什么?
内置值 _Time
是 float4
因此您必须根据所需的时间范围选择其中一个组件:
_Time float4 (t/20, t, t*2, t*3), use to animate things inside the shaders.
例如#define T (_Time.y/3.+5.)
.
另一件事是 float2x2
的 *
运算符表示 2 个矩阵的分量乘积。对于 vector-matrix/matrix-matrix 产品,您应该使用 mul
函数。
所以在 rot
函数中你应该有 p =mul(p, float2x2(sc.y,-sc.x,sc));
.
有关这方面的更多信息,您可以访问:https://en.wikibooks.org/wiki/Cg_Programming/Vector_and_Matrix_Operations。
我已经学习了几天 Unity 着色器并决定从 Shadertoy 移植 this 油着色器。
我收到以下错误:
incorrect number of arguments to numeric-type constructor at line 69 (on 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);
请注意我是如何用 float2x2
替换 mat2
的,因为那是 HLSL 中的 equivalent 类型。
我相信问题出在 float2x2(sc.y,-sc.x,sc);
。执行此操作并仍像原始代码那样使用 3
参数的适当方法是什么?
内置值 _Time
是 float4
因此您必须根据所需的时间范围选择其中一个组件:
_Time float4 (t/20, t, t*2, t*3), use to animate things inside the shaders.
例如#define T (_Time.y/3.+5.)
.
另一件事是 float2x2
的 *
运算符表示 2 个矩阵的分量乘积。对于 vector-matrix/matrix-matrix 产品,您应该使用 mul
函数。
所以在 rot
函数中你应该有 p =mul(p, float2x2(sc.y,-sc.x,sc));
.
有关这方面的更多信息,您可以访问:https://en.wikibooks.org/wiki/Cg_Programming/Vector_and_Matrix_Operations。