Unity シェーダーを数日間学んでいて、Shadertoy からこのオイル シェーダーを移植することにしました。
次のエラーが表示されます。
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.);
エラーがある場所です。面白いことに、このコード行を削除またはコメントアウトすると、シェーダーはコンパイルされ、正常に動作します。その行がコンパイルできない理由を知りたいです。
そのエラーの原因は何ですか?どうすれば修正できますか?
編集:
ヘリウムが指摘したように、float3x3
行列です。
以下は、元の腐敗関数です。
#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);
HLSLでは同等の型であるため、 をmat2
どのように置き換えたかに注意してください。float2x2
問題はからだと思いますfloat2x2(sc.y,-sc.x,sc);
。3
これを行い、元のコードと同じようにパラメーターを使用する適切な方法は何ですか?