2017-07-05 2 views
2

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?

+1

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

+0

@ 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

+0

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

Répondre

1

La valeur intégrée _Time est un float4 donc vous devez choisir l'un des composants en fonction de l'échelle de temps que vous voulez:

_Time float4 (t/20, t, t*2, t*3), use to animate things inside the shaders.

par exemple #define T (_Time.y/3.+5.).

Une autre chose est l'opérateur * pour float2x2 représente un produit composant de 2 matrices. Pour le produit matrice-matrice/matrice-matrice, vous devez utiliser la fonction mul. Donc dans la fonction rot, vous devriez avoir p =mul(p, float2x2(sc.y,-sc.x,sc));.

Pour plus d'informations à ce sujet, vous pouvez aller à: https://en.wikibooks.org/wiki/Cg_Programming/Vector_and_Matrix_Operations.

+0

Le '* =' n'était pas vraiment le problème principal puisque je l'ai déjà fait après avoir lu de nombreux documents en ligne. Le problème est '_Time.y' que vous avez mentionné. J'ai oublié d'ajouter le 'y' à la fin, donc quand j'appelle la fonction' rot' et que je la passe 'T', cela déclenche une erreur. Cela a effectivement corrigé le problème après l'ajout de '.y'. Merci. – Programmer