2016-05-11 8 views
0

Ich bin ein Anfänger in AGAL, ​​ich bin mir sicher, dass das nicht kompliziert ist.Stage3D Error # 3632: AGAL-Verknüpfung: Variable 1 wird im Fragment-Shader gelesen, aber nicht vom Vertex-Shader geschrieben

ich einen Vertex und Fragment-Shader haben, um einfach eine Box mit einer Textur ohne Lichteffekt zeichnen, hier ist der Code:

  vertexAssembly.assemble(Context3DProgramType.VERTEX, 
      "m44 op, va0, vc0\n" + // pos to clipspace 
      "mov v0, va1" // copy uv 
     ); 
     fragmentAssembly.assemble(Context3DProgramType.FRAGMENT, 
      "tex ft1, v0, fs0 <2d,linear,nomip>\n" + 
      "mov oc, ft1" 
     ); 

Ich habe auch AGAL Code für eine Box ohne Textur, gerade Farbe und mit Lichteffekt, hier ist der Code für die Shadern:

 private const VERTEX_SHADER_LIGHT:String = 
     "mov vt0, va0\n"+ 
     "m44 op, vt0, vc0\n"+ 
     "nrm vt1.xyz, va0.xyz\n"+ 
     "mov vt1.w, va0.w\n"+ 
     "mov v1, vt1\n" + 
     "mov v2, va1" 

    private const FRAGMENT_SHADER_LIGHT:String = 
     "dp3 ft1, fc2, v1 \n"+ 
     "neg ft1, ft1 \n"+ 
     "max ft1, ft1, fc0 \n"+ 
     "mul ft2, fc4, ft1 \n"+ 
     "mul ft2, ft2, fc3 \n"+ 
     "add oc, ft2, fc1"; 

Frage ist, wie ich den 2-Codes kombinieren, mag ich ein Box-Modell mit Textur-map, mit Lichteffekt zu zeigen.

Ich habe diese:

 private const VERTEX_SHADER_LIGHT:String = 
     "m44 op, va0, vc0\n" + // pos to clipspace 
     "mov v0, va1" // copy uv 
     //"mov vt0, va0\n"+ 
     //"m44 op, vt0, vc0\n"+ 
     "nrm vt1.xyz, va0.xyz\n"+ 
     "mov vt1.w, va0.w\n"+ 
     "mov v1, vt1\n" + 
     "mov v2, va1" 

    private const FRAGMENT_SHADER_LIGHT:String = 
     "tex ft1, v0, fs0 <2d,linear,nomip>\n" + 
     "mov oc, ft1 \n" + 
     "dp3 ft1, fc2, v1 \n"+ 
     "neg ft1, ft1 \n"+ 
     "max ft1, ft1, fc0 \n"+ 
     "mul ft2, fc4, ft1 \n"+ 
     "mul ft2, ft2, fc3 \n"+ 
     "add oc, ft2, fc1"; 

aber es gibt mir eine Fehlermeldung: „Fehler: Error # 3632: AGAL Verknüpfung: 1 Variation in den Fragment-Shader gelesen, aber nicht geschrieben durch die Vertex-Shader. bei flash.display3D :: Program3D/upload() bei Context3DExample/setupScene() bei Context3DExample/Context()“

ich bin sicher, dass jemand mit experiance dies in 5 Minuten lösen kann. Dank

Antwort

0

Sieht aus wie Sie eine Zeichenfolge verketten vergessen haben, das heißt

"mov v0, va1" // copy uv 
"nrm vt1.xyz, va0.xyz\n" 

"mov v0, va1\n" + // copy uv 
"nrm vt1.xyz, va0.xyz\n" 

Hinweis zusätzliche \n und + in der ersten Zeile sein sollte.

+0

Danke, jetzt bekomme ich die Fehlermeldung nicht und es funktioniert, ich sehe den Lichteffekt, aber ich bekomme nicht die Textur-Karte, irgendwie eine Farbe überschreibt die Textur. Wenn ich einen Teil des Codes entferne und nur die ersten 2 Zeilen des Codes belasse: \t "tex ft1, v0, fs0 <2d, linear, nomip> \ n" + \t \t \t "mov oc, ft1"; Ich sehe die Textur wieder, aber der Lichteffekt ist weg, was soll ich tun? –

+0

Ich habe im Flash seit Ewigkeiten nicht programmiert, so erinnere ich mich nicht 100%. Versuchen Sie diese '' 'privaten const FRAGMENT_SHADER_LIGHT: String = " tex ft0, v0, fs0 <2d, linear, nomip> \ n "+ " dp3 ft1, fc2, v1 \ n "+ " neg ft1, ft1 \ n „+ "max FT1, FT1, FC0 \ n" + "mul FT2, FC4, FT1 \ n" + "mul FT2, FT2, FC3 \ n" + "add ft3, FT2, fc1 \ n" + "mul oc, ft0, ft3"; '' 'Aber ich sehe andere Probleme, zum Beispiel normal sollte im Pixelshader renormiert werden. – nikitablack

+0

Ich habe Ihren Code verwendet, aber das Ergebnis ist das gleiche, könnte das wegen der Normalen Problem sein?denn wenn ich nur die 2 Zeilen Code verwende "tex ft1, v0, fs0 <2d, linear, nomip> \ n" + "mov oc, ft1"; Ich sehe die Textur, ich denke, Normalen sind ein weiteres Problem, sie bestimmen, ob das Modell glatt aussieht oder nicht. –

0

die Antwort hier gefunden wird der Code (basierend auf nikitablack Antwort unten):

 private const VERTEX_SHADER_LIGHT:String = "" + 

     "m44 op, va0, vc0\n" +// pos to clipspace 
     "mov v0, va1\n" +// pass uv 
     "mov v1, va0"; // pas normal for vertex shader. 


    private const FRAGMENT_SHADER_LIGHT:String = "" + 

    "tex ft0, v0, fs0 <2d,linear,nomip>\n" + // read from texture 
    "nrm ft1.xyz, v1.xyz\n" + // renormalize normal 
    "dp3 ft1, fc2.xyz, ft1.xyz \n" + // directional light contribution 
    //"neg ft1, ft1 \n" + // negation because we have a vector "from" light 
    "max ft1, ft1, fc0 \n"+ // clamp to [0, dot] 
    "mul ft1, ft1, fc3 \n"+ // contribution from light 
    "mul ft1, ft1, ft0 \n"+ // contribution from light + texture 
    //"add oc, ft1, fc1"; // final color as surface + ambient 
    "add oc, ft1, ft0"; // final color as surface + texture 

ich die „neg von FT1“ nahm keine Notwendigkeit, diese verctor in meinem Code zu negieren ist es in Ordnung, wie es ist . und ich habe die Umgebungsfarbe am Ende nicht hinzugefügt, nur die Textur noch einmal, so dass sie hell und klar wird, mit nur ein bisschen Schattierung.

Verwandte Themen