Paket | flash.display3D |
Klasse | public final class Program3D |
Vererbung | Program3D Object |
Sprachversion: | ActionScript 3.0 |
Laufzeitversionen: | Flash Player 11, AIR 2 |
Programme, die von einem Program3D-Objekt verwaltet werden, steuern das gesamte Rendern von Dreiecken während eines Aufrufs von Context3D drawTriangles
. Laden Sie den binären Bytecode mit der upload
-Methode in den Renderkontext hoch. (Nach dem Hochladen wird nicht länger auf das Programm im Originalarray verwiesen; das Ändern oder Verwerfen des Ausgangsarrays ändert das Programm nicht.)
Programme bestehen immer aus zwei verknüpften Teilen: einem Vertex- und einem Fragmentprogramm.
- Das Vertexprogramm arbeitet mit Daten, die in VertexBuffer3D-Objekten definiert sind, und ist für das Projizieren von Vertizes in den Clipspace sowie das Übergeben ggf. erforderlicher Vertexdaten, zum Beispiel Farbe, an den Fragmentshader zuständig.
- Der Fragmentshader arbeitet mit den Attributen, die vom Vertexprogramm übergeben werden, und produziert eine Farbe für jedes gerasterte Fragment eines Dreiecks, sodass Pixelfarben daraus resultieren. Beachten Sie, dass in der Literatur zur 3D-Programmierung verschiedene Namen für Fragmentprogramme verwendet werden, zum Beispiel Fragmentshader und Pixelshader.
Bestimmen Sie, welches Programmpaar für nachfolgende Rendervorgänge verwendet werden sollen, indem Sie die entsprechende Program3D-Instanz an die setProgram()
-Methode von Context3D übergeben.
Sie können ein Program3D-Objekt nicht direkt erstellen; verwenden Sie stattdessen die createProgram()
-Methode von Context3D.
Verwandte API-Elemente
Methode | Definiert von | ||
---|---|---|---|
Gibt alle Ressourcen frei, die diesem Objekt zugeordnet sind. | Program3D | ||
Gibt an, ob für ein Objekt eine bestimmte Eigenschaft definiert wurde. | Object | ||
Gibt an, ob eine Instanz der Object-Klasse in der Prototypkette des Objekts vorhanden ist, das als Parameter angegeben wurde. | Object | ||
Gibt an, ob die angegebene Eigenschaft vorhanden ist und durchlaufen werden kann. | Object | ||
Legt die Verfügbarkeit einer dynamischen Eigenschaft für Schleifenoperationen fest. | Object | ||
Gibt die Stringdarstellung dieses Objekts zurück, formatiert entsprechend den Konventionen des Gebietsschemas. | Object | ||
Gibt das angegebene Objekt als String zurück. | Object | ||
Lädt ein Paar von Renderprogrammen hoch, die im AGAL-Bytecode (Adobe Graphics Assembly Language) ausgedrückt werden. | Program3D | ||
Gibt den Grundwert des angegebenen Objekts zurück. | Object |
dispose | () | Methode |
public function dispose():void
Sprachversion: | ActionScript 3.0 |
Laufzeitversionen: | Flash Player 11, AIR 3 |
Gibt alle Ressourcen frei, die diesem Objekt zugeordnet sind. Nachdem ein Program3D-Objekt verworfen wurde, schlagen der Aufruf von upload() und das Rendern mit diesem Objekt fehl.
upload | () | Methode |
public function upload(vertexProgram:ByteArray, fragmentProgram:ByteArray):void
Sprachversion: | ActionScript 3.0 |
Laufzeitversionen: | Flash Player 11, AIR 3 |
Lädt ein Paar von Renderprogrammen hoch, die im AGAL-Bytecode (Adobe Graphics Assembly Language) ausgedrückt werden.
Der Programmbytecode kann mit den Pixel Bender-Offlinetools erstellt werden. Er kann auch dynamisch erstellt werden. Die AGALMiniAssembler-Klasse ist eine Utility-Klasse, die Programme in der AGAL-Sprache in AGAL-Bytecode kompiliert. Die Klasse ist nicht Teil der Laufzeitumgebung. Wenn Sie die Shaderprogramme hochladen, wird der Bytecode in die native Shadersprache für das aktuelle Gerät (zum Beispiel OpenGL oder Direct3D) kompiliert. Die Laufzeitumgebung überprüft den Bytecode beim Hochladen.
Die Programme werden jedes Mal ausgeführt, wenn die drawTriangles()
-Methode von Context3D aufgerufen wird. Das Vertexprogramm wird einmal pro Vertex in der Liste der zu zeichnenden Dreiecke ausgeführt. Das Fragmentprogramm wird einmal pro Pixel auf der Oberfläche des Dreiecks ausgeführt.
Die von einem Shaderprogramm verwendeten „Variablen“ werden Register genannt. Die folgenden Register sind definiert:
Name | Anzahl pro Fragmentprogramm | Anzahl pro Vertexprogramm | Zweck |
---|---|---|---|
Attribute | – | 8 | Vertexshadereingabe; aus einem Vertexpuffer lesen, der mit Context3D.setVertexBufferAt() angegeben wird. |
Constant | 28 | 128 | Shadereingabe; mit der Context3D.setProgramConstants()-Funktionsfamilie festlegen. |
Temporary | 8 | 8 | Temporäres Register für die Berechnung, außerhalb des Programms nicht zugänglich. |
Output | 1 | 1 | Shaderausgabe: in einem Vertexprogramm ist die Ausgabe die Clipspaceposition; in einem Fragmentprogramm ist die Ausgabe eine Farbe. |
Varying | 8 | 8 | Interpolierte Daten zwischen Vertex- und Fragmentprogrammen übertragen. Die unterschiedlichen Register aus dem Vertexprogramm werden als Eingabe in das Fragmentprogramm angewendet. Die Werte werden entsprechend dem Abstand von den Dreiecksvertizes interpoliert. |
Sampler | 8 | – | Fragmentshadereingabe; aus einer mit Context3D.setTextureAt() angegebenen Textur lesen. |
Ein Vertexprogramm empfängt Eingaben aus zwei Quellen: Vertexpuffer und Konstantenregister. Legen Sie mit der setVertexBufferAt()
von Context3D fest, welche Vertexdaten für ein bestimmtes Vertex-Attribut-Register verwendet werden sollen. Sie können bis zu acht Eingaberegister für Vertexattribute definieren. Die Vertexattributwerte werden für jeden Vertex in der Dreieckliste aus dem Vertexpuffer gelesen und im Attributregister platziert. Legen Sie Konstantenregister mithilfe der Context3D-Methoden setProgramConstantsFromMatrix()
oder setProgramConstantsFromVector()
fest. Konstantenregister enthalten denselben Wert für jeden Vertex in der Dreieckliste. (Sie können die Konstantenwerte nur zwischen den Aufrufen von drawTriangles()
ändern.)
Ein Vertexprogramm ist für die Projektion der Dreieckvertizes in den Clipspace (der kanonische Anzeigebereich innerhalb ±1 auf der x- und y-Achse und 0-1 auf der z-Achse) sowie für das Platzieren der transformierten Koordinaten in das Ausgaberegister zuständig. (Normalerweise wird die entsprechende Projektionsmatrix dem Shader mit einem Satz Konstantenregister bereitgestellt.) Das Vertexprogramm muss auch alle Vertexattribute oder berechneten Werte, die vom Fragmentprogramm benötigt werden, in einen speziellen Satz von Variablen kopieren, die Varying-Register genannt werden. Wenn ein Fragmentshader ausgeführt wird, wird der in einem Varying-Register bereitgestellte Wert entsprechend dem Abstand des aktuellen Fragments von jedem Dreieckvertex linear interpoliert.
Ein Fragmentprogramm empfängt Eingaben von den Varying-Registern und aus einem separaten Satz von Konstantenregistern (mit setProgramConstantsFromMatrix()
oder setProgramConstantsFromVector()
festgelegt). Sie können Texturdaten auch aus Texturen lesen, die mit Sampler-Registern in den Renderkontext hochgeladen wurden. Legen Sie fest, auf welche Textur mit einem bestimmten Samplerregister zugegriffen werden soll, indem Sie die Context3D-Methode setTextureAt()
verwenden. Das Fragmentprogramm ist dafür zuständig, sein Ausgaberegister auf einen Farbwert festzulegen.
Parameter
vertexProgram:ByteArray — AGAL-Bytecode für das Vertexprogramm. Das ByteArray-Objekt muss das Little-Endian-Format verwenden.
| |
fragmentProgram:ByteArray — AGAL-Bytecode für das Fragmentprogramm. Das ByteArray-Objekt muss das Little-Endian-Format verwenden.
|
Auslöser
TypeError — Nullzeigerfehler: wenn vertexProgram oder fragmentProgram null ist.
| |
Error — Objekt verworfen: wenn das Program3D-Objekt entweder direkt durch einen Aufruf von dispose() oder indirekt durch einen Aufruf von dispose() verworfen wurde, oder wenn der Renderingkontext aufgrund eines Geräteverlusts verworfen wurde.
| |
ArgumentError — Agal-Programm zu klein: wenn eines der Programmcodearrays kleiner als 31 Bytes Länge ist. Dies ist die Größe des Shaderbytecodes eines Programms mit einer Anweisung.
| |
ArgumentError — Programm muss Little Endian sein: wenn einer der Programmbytecodearrays nicht Little Endian ist.
| |
Error — Native Shaderkompilierung fehlgeschlagen: wenn die Ausgabe des AGAL-Übersetzers kein kompilierbares Programm in der nativen Sprache des Shaders ist. Dieser Fehler wird nur in Release-Playern ausgegeben.
| |
Error — Native Shaderkompilierung für OpenGL fehlgeschlagen: wenn die Ausgabe des AGAL-Übersetzers kein kompilierbares Programm in der OpengGL-Shadersprache ist und Kompilierungsdiagnosen enthält. Dieser Fehler wird nur in Debug-Playern ausgegeben.
| |
Error — Native Shaderkompilierung für D3D9 fehlgeschlagen: wenn die Ausgabe des AGAL-Übersetzers kein kompilierbares Programm in der Direct3D-Shadersprache ist und Kompilierungsdiagnosen enthält. Dieser Fehler wird nur in Debug-Playern ausgegeben.
Die folgenden Fehler werden ausgegeben, wenn die Validierung des AGAL-Bytecodes fehlschlägt: | |
Error — Kein AGAL-Programm: wenn das Magic Byte im Header falsch ist. Das erste Byte des Bytecode muss 0xa0 sein. Dieser Fehler kann anzeigen, dass das Bytearray auf die falsche Endian-Reihenfolge gesetzt ist.
| |
Error — Falsche AGAL-Version: wenn die AGAL-Version von der aktuellen SWF-Version nicht unterstützt wird. Die AGAL-Version muss für die SWF-Version 13 auf 1 gesetzt sein.
| |
Error — Falscher AGAL-Programmtyp; wenn der Bezeichner des AGAL-Programmtyps nicht gültig ist. Das dritte Byte im Bytecode muss 0xa1 sein. Dieser Fehler kann anzeigen, dass das Bytearray auf die falsche Endian-Reihenfolge gesetzt ist.
| |
Error — Falscher AGAL-Shadertyp: wenn der Shadertypcode weder Fragment noch Vertex ist (1 oder 0).
| |
Error — Ungültiger AGAL-Opcode - außerhalb des gültigen Bereichs: wenn im Tokenstream ein ungültiger Opcode erkannt wird.
| |
Error — Ungültiger AGAL-Opcode - nicht implementiert: wenn im Tokenstream ein ungültiger Opcode erkannt wird.
| |
Error — AGAL-Opcode nur in Fragmentprogrammen zulässig: wenn im Tokenstream des Vertexprogramms ein Opcode gefunden wird, der nur in Fragmentprogrammen zulässig ist, zum Beispiel KIL oder TEX.
| |
Error — Falsche AGAL-Quelloperanden; wenn beide Quelloperanden Konstantenregister sind. Sie müssen das Ergebnis außerhalb des Shaderprogramms berechnen und es mit einem einzelnen Konstantenregister übergeben.
| |
Error — Beide Operanden sind indirekte Lesevorgänge: wenn beide Operanden indirekt gelesen werden.
| |
Error — Opcodeziel muss null sein: wenn ein Token mit einem Opcode (zum Beispiel KIL), der kein Ziel hat, einen Nichtnullwert für das Zielregister festlegt.
| |
Error — Opcodeziel muss Maske verwenden: wenn ein Opcode, der ein Ergebnis mit nur 3 Komponenten produziert, ohne Maskierung verwendet wird.
| |
Error — Zu viele Token: wenn ein AGAL-Programm zu viele Token (mehr als 200) enthält.
| |
Error — Fragmentshadertyp: wenn der Fragmentprogrammtyp (Byte 6 des fragmentProgram-Parameters) nicht auf 1 gesetzt ist.
| |
Error — Vertexshadertyp: wenn der Fragmentprogrammtyp (Byte 6 des vertexProgram-Parameters) nicht auf 0 gesetzt ist.
| |
Error — Varying-Register gelesen, aber nicht geschrieben: wenn der Fragmentshader ein Varying-Register liest, in das nie vom Vertexshader geschrieben wurde.
| |
Error — Unvollständiges Schreiben in Varying: wenn nur teilweise in ein Varying-Register geschrieben wird. Es ist erforderlich, dass in alle Komponenten eines Varying-Registers geschrieben wird.
| |
Error — Fragment-Schreiben in alle Komponenten: wenn nur teilweise in eine Fragmentfarbausgabe geschrieben wird. Es ist erforderlich, dass in alle vier Komponenten der Farbausgabe geschrieben wird.
| |
Error — Vertex-Schreiben in alle Komponenten: wenn nur teilweise in eine Vertexclipspaceausgabe geschrieben wird. Es ist erforderlich, dass in alle Komponenten der Vertexclipraumausgabe geschrieben wird.
| |
Error — Nicht verwendeter Operand: wenn ein nicht verwendeter Operand in einem Token nicht vollständig auf null gesetzt wurde.
| |
Error — Samplerregister nur in Fragment: wenn in einem Vertexprogramm ein Textursamplerregister verwendet wird.
| |
Error — Samplerregister zweiter Operand: wenn ein Samplerregister als ein Ziel oder als erster Operand eines AGAL-Tokens verwendet wird.
| |
Error — Indirekt nur in Vertex zulässig: wenn in einem Fragmentprogramm indirekte Adressierung verwendet wird.
| |
Error — Indirekt nur in Konstantenregister: wenn in einem Nicht-Konstantenregister indirekte Adressierung verwendet wird.
| |
Error — Indirekter Quellentyp: wenn der Typ der indirekten Quelle nicht Attribut, Konstante oder Temporär ist.
| |
Error — Indirekte Adressierungsfelder müssen null sein: wenn nicht alle Felder der indirekten Adressierung null für direkte Adressierung sind.
| |
Error — Varying-Register nur in Fragment lesen: wenn in einem Vertexprogramm ein Varying-Register gelesen wird. Varying-Register können in Vertexprogrammen geschrieben und in Fragmentprogrammen gelesen werden.
| |
Error — Attributregister nur in Vertex lesen: wenn ein Attributregister in einem Fragmentprogramm gelesen wird. Attributregister können nur in Vertexprogrammen gelesen werden.
| |
Error — Ausgaberegister kann nicht gelesen werden: wenn ein Ausgaberegister (Position oder Farbe) gelesen wird. In Ausgaberegister kann nur geschrieben werden, das Lesen ist nicht möglich.
| |
Error — Temporäres Register ohne Schreiben gelesen: wenn ein temporäres Register gelesen wird, ohne dass zuvor in das Register geschrieben wurde.
| |
Error — Temporäre Registerkomponente ohne Schreiben gelesen: wenn eine bestimmte temporäre Registerkomponente gelesen wird, ohne dass zuvor in die Komponente geschrieben wurde.
| |
Error — In Samplerregister kann nicht geschrieben werden: wenn in ein Samplerregister geschrieben wird. Samplerregister können nur gelesen werden, das Schreiben in diese Register ist nicht möglich.
| |
Error — Schreibvorgang für Varying-Register: wenn in einem Fragmentprogramm in ein Varying-Register geschrieben wird. Varying-Register können in Vertexprogrammen geschrieben und in Fragmentprogrammen gelesen werden.
| |
Error — In Attributregister kann nicht geschrieben werden: wenn in ein Attributregister geschrieben wird. Attributregister können nur gelesen werden.
| |
Error — In Konstantenregister kann nicht geschrieben werden: wenn in einem Fragmentprogramm in ein Konstantenregister geschrieben wird.
| |
Error — Zielschreibmaske ist null: wenn eine Zielschreibmaske null ist. Alle Komponenten eines Ausgaberegisters müssen festgelegt werden.
| |
Error — Reservierte AGAL-Bits müssen null sein: wenn beliebige reservierte Bits in einem Token nicht null sind. Dies gibt an, dass ein Fehler beim Erstellen des Bytecodes (oder fehlerhaft geschriebener Bytecode) vorliegt.
| |
Error — Unbekannter Registertyp: wenn ein ungültiger Registertypindex verwendet wird.
| |
Error — Samplerregister außerhalb des gültigen Bereichs: wenn ein ungültiger Samplerregisterindex verwendet wird.
| |
Error — Varying-Register außerhalb des gültigen Bereichs: wenn ein ungültiger Varying-Registerindex verwendet wird.
| |
Error — Attributregister außerhalb des gültigen Bereichs: wenn ein ungültiger Attributregisterindex verwendet wird.
| |
Error — Konstantenregister außerhalb des gültigen Bereichs: wenn ein ungültiger Konstantenregisterindex verwendet wird.
| |
Error — Ausgaberegister außerhalb des gültigen Bereichs: wenn ein ungültiger Ausgaberegisterindex verwendet wird.
| |
Error — Temporäres Register außerhalb des gültigen Bereichs: wenn ein ungültiger temporärer Registerindex verwendet wird.
| |
Error — Cubemapsampler muss Clamp verwenden: wenn ein Cubemapsampler den Wrapmodus nicht auf „clamp“ setzt.
| |
Error — Unbekannte Samplerdimension: wenn ein Sample eine unbekannte Samplerdimension verwendet. (Es werden nur 2D- und Würfeltexturen unterstützt.)
| |
Error — Unbekannter Filtermodus: wenn ein Sampler einen unbekannten Filtermodus verwendet. (Es werden nur Nächster-Nachbar-Filterung und lineare Filterung unterstützt.)
| |
Error — Unbekannter Mipmapmodus: wenn ein Sampler einen unbekannten Mipmapmodus verwendet. (Es werden nur kein Mipmapmodus, Nächster-Nachbar-Mipmapmodus und linearer Mipmapmodus unterstützt.)
| |
Error — Unbekannter Wrappingmodus: wenn ein Sampler einen unbekannten Wrappingmodus verwendet. (Es werden nur die Wrappingmodi „Clamp“ und „Wiederholen“ unterstützt.)
| |
Error — Unbekanntes Sondertag: wenn ein Sampler ein unbekanntes Sondertag verwendet.
| |
Error — Ausgabefarbe nicht maskierbar: Sie können das Farbausgaberegister in einem Fragmentprogramm nicht maskieren. Alle Komponenten des Farbregisters müssen festgelegt werden.
| |
Error — Zweiter Operand muss Samplerregister sein: Der AGAL-Text-Opcode muss einen Sampler als zweiten Quelloperanden haben.
| |
Error — Indirekt nicht zulässig: indirekte Adressierung wurde verwendet, wo dies nicht zulässig ist.
| |
Error — Swizzle muss Skalar sein: Swizzling-Fehler.
| |
Error — Swizzling für 2. Quelle nicht möglich: Swizzling-Fehler.
| |
Error — Zweite Verwendung des Samplers muss dieselben Parameter haben: Alle Sampler, die auf dieselbe Textur zugreifen, müssen dieselben Einstellungen für Dimension, Wrap, Filter, Sondertag und Mipmap haben.
| |
Error — 3768: DasStage3D -API darf nicht bei der Ausführung im Hintergrund verwendet werden.
|
Weitere Informationen
Verwandte API-Elemente
Tue Jun 12 2018, 10:04 AM Z