J'ai commencé à apprendre le shader Unity pendant quelques jours et j'ai décidé de porter le shader this de Shadertoy.Obtention d'un nombre incorrect d'arguments pour un constructeur de type numérique Erreur dans un shader
je reçois l'erreur suivante:
incorrect number of arguments to numeric-type constructor at line 69 (on glcore)
Voici la partie pertinente du code de shaders:
#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
}
La ligne rot(p, T/22.);
est où l'erreur est à. La chose amusante est que lorsque je supprime ou commente cette ligne de code, le shader se compile et fonctionne bien. Je veux toujours savoir pourquoi cette ligne ne peut pas compiler.
Quelle est l'origine de cette erreur et comment puis-je la réparer?
EDIT:
Comme l'a souligné helium, float3x3
est une matrice.
est inférieure à la fonction rot originale:
#define rot(p,a) vec2 sc=sin(vec2(a,a+1.6)); p*=mat2(sc.y,-sc.x,sc);
Et la version portage:
#define rot(p,a) float2 sc = sin(float2(a,a + 1.6)); p *= float2x2(sc.y,-sc.x,sc);
Remarquez comment je l'ai remplacé mat2
avec float2x2
parce que ce type equivalent en HLSL. Je crois que le problème est de float2x2(sc.y,-sc.x,sc);
. Quelle est la manière appropriée de faire cela et toujours utiliser les paramètres 3
comme le code original l'a fait?
Je suis loin d'être un expert en matière de shaders, mais un float3x3 est un constructeur de matrice qui attend les ** lignes ** de la matrice, n'est-ce pas? Mais vous spécifiez seulement 3 valeurs flottantes simples. Je ne sais pas si elle est automatiquement "convertie" en une ligne avec les 3 mêmes composants. – Hellium
@ C'est vrai. C'est une matrice et cela semble être le problème quand on l'appelle. Le code d'origine utilise 'mat2' mais [Microsoft] (https://msdn.microsoft.com/en-us/library/windows/apps/dn166865.aspx) et [Unity forum] (https: //forum.unity3d. com/threads/glsl-mat2-mat3-equivlants.222790 /) indique que la traduction appropriée est 'float2x2'. Je suis perdu sur la façon de faire cela prendre 3 paramètres comme le code original.Voir mon edit pour comprendre ce que je veux dire. – Programmer
Avez-vous toujours l'erreur? Selon ce [wiki] (https://en.wikibooks.org/wiki/Cg_Programming/Vector_and_Matrix_Operations), le float2x2 peut soit accepter 2 arguments comme les lignes ou 4 paramètres comme les éléments individuels de la matrice. Je suppose que vous pouvez appeler le constructeur avec un 4ème argument mis à 0. – Hellium