2

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これを行い、元のコードと同じようにパラメーターを使用する適切な方法は何ですか?

4

1 に答える 1