Pakket | flash.display3D |
Klasse | public final class Context3D |
Overerving | Context3D EventDispatcher Object |
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Een renderingcontext omvat een tekenoppervlak en de bijbehorende hulpmiddelen en status. De renderingcontext gebruikt waar mogelijk de GPU (Graphics Processing Unit) van de hardware. Daarnaast maakt de renderingcontext gebruik van software. (Als rendering via Context3D niet op een platform wordt ondersteund, bevat de eigenschap stage3Ds
van het Stage-object een lege lijst.)
De Context3D-renderingcontext is een programmeerbare pijplijn die veel lijkt op OpenGL ES 2, maar is geabstraheerd om te zorgen voor compatibiliteit met een reeks hardware- en GPU-interfaces. Hoewel de renderingpijplijn voor 3D-afbeeldingen is ontworpen, hoeft de rendering niet per se driedimensionaal te zijn. Zo kunt u een 2D-renderer creëren door de juiste hoekpunt- en pixel-/fragmentprogramma's te verschaffen. Zowel in de 3D- als in de 2D-gevallen is de driehoek de enige geometrische primitieve die wordt ondersteund.
U kunt een instantie van de klasse Context3D ophalen door de methode requestContext3D()
van een Stage3D-object aan te roepen. Er kan een beperkt aantal Context3D-objecten per stage bestaan: een voor elke Stage3D in de lijst Stage.stage3Ds
. Wanneer de context wordt gemaakt, verzendt het Stage3D-object een context3DCreate
-gebeurtenis. Een renderingcontext kan te allen tijde worden verwijderd en opnieuw worden gemaakt, bijvoorbeeld wanneer een andere toepassing die gebruik maakt van de GPU, de focus krijgt. Uw code moet berekend zijn op de ontvangst van meerdere context3DCreate
-gebeurtenissen. Plaats het renderinggebied met gebruik van de eigenschappen x
en y
van de gekoppelde Stage3D-instantie in het werkgebied.
Voor het renderen en weergeven van een scène (na het ophalen van een Context3D-object) moet u normaal gesproken de volgende stappen uitvoeren:
- Configureer de voornaamste kenmerken van de weergavebuffer door
configureBackBuffer()
aan te roepen. - Maak en initialiseer uw renderingbronnen, waaronder:
- Hoekpunt- en indexbuffers die de geometrie van de scène definiëren
- Hoekpunt- en pixelprogramma's (shaders) voor het renderen van de scène
- Structuren
- Render een frame:
- Stel de renderstatus juist in voor een object of verzameling objecten in de scène.
- Roep de methode
drawTriangles()
aan om een verzameling driehoeken te renderen. - Wijzig de renderstatus voor de volgende groep objecten.
- Roep
drawTriangles()
aan om de driehoeken te tekenen waardoor de objecten worden gedefinieerd. - Herhaal deze stappen totdat de scène volledig is gerenderd.
- Roep de methode
present()
aan om de gerenderde scène op de stage weer te geven.
Voor rendering gelden de volgende limieten:
Bronlimieten:
Bron | Toegestaan aantal | Totaal geheugen |
---|---|---|
Hoekpuntenbuffers
| 4096 | 256 MB |
Indexbuffers
| 4096 | 128 MB |
Programma's
| 4096 | 16 MB |
Structuren
| 4096 | 128 MB |
Kubusstructuren
| 4096 | 256 MB |
AGAL-limieten: 200 op-codes per programma.
Limieten voor tekenaanroepen: 32.768 aanroepen van drawTriangles()
voor elke present()
-aanroep.
Voor structuren gelden de volgende limieten:
Structuurlimieten voor AIR (32-bits):
Structuur | Maximumgrootte | Totaal GPU-geheugen |
---|---|---|
Normale structuur (onder uitgebreide basislijn)
| 2048 x 2048 | 512 MB |
Normale structuur (uitgebreide basislijn en hoger)
| 4096 x 4096 | 512 MB |
Rechthoekige structuur (onder uitgebreide basislijn)
| 2048 x 2048 | 512 MB |
Rechthoekige structuur (uitgebreide basislijn en hoger)
| 4096 x 4096 | 512 MB |
Kubusstructuur
| 1024 x 1024 | 256 MB |
Structuurlimieten voor de 64-bitsversie van AIR (Desktop):
Structuur | Maximumgrootte | Totaal GPU-geheugen |
---|---|---|
Normale structuur (onder uitgebreide basislijn)
| 2048 x 2048 | 512 MB |
Normale structuur (Basislijn uitgebreid tot Standaard)
| 4096 x 4096 | 512 MB |
Normale structuur (Standaard uitgebreid en hoger)
| 4096 x 4096 | 2048 MB |
Rechthoekige structuur (onder uitgebreide basislijn)
| 2048 x 2048 | 512 MB |
Rechthoekige structuur (Basislijn uitgebreid tot Standaard)
| 4096 x 4096 | 512 MB |
Rechthoekige structuur (Standaard uitgebreid en hoger)
| 4096 x 4096 | 2048 MB |
Kubusstructuur
| 1024 x 1024 | 256 MB |
512 MB is de absolute limiet voor structuren, inclusief het voor mipmaps vereiste structuurgeheugen. Voor kubusstructuren is de geheugenlimiet 256 MB.
U kunt geen Context3D-objecten maken met de Context3D-constructor. Het wordt gemaakt en is beschikbaar als eigenschap van een Stage3D-instantie. De klasse Context3D kan zowel op desktop- als mobiele platforms met Flash Player of AIR worden gebruikt.
Verwante API-elementen
Context3DClearMask
Context3DCompareMode
Context3DProgramType
Context3DRenderMode
Context3DStencilAction
Context3DTextureFormat
Context3DTriangleFace
Context3DVertexBufferFormat
flash.display3D.textures.Texture
flash.display3D.textures.CubeTexture
IndexBuffer3D
flash.geom.Matrix3D
Program3D
flash.display.Stage3D
VertexBuffer3D
Eigenschap | Gedefinieerd door | ||
---|---|---|---|
backBufferHeight : int [alleen-lezen]
Geeft de hoogte van de backbuffer op, die kan worden gewijzigd door een succesvolle aanroep van de configureBackBuffer()-methode. | Context3D | ||
backBufferWidth : int [alleen-lezen]
Geeft de breedte van de backbuffer op, die kan worden gewijzigd door een succesvolle aanroep van de configureBackBuffer()-methode. | Context3D | ||
constructor : Object
Verwijzing naar het klasseobject of de constructorfunctie van een bepaalde objectinstantie. | Object | ||
driverInfo : String [alleen-lezen]
Het type stuurprogramma voor grafische bibliotheken dat door deze renderingcontext wordt gebruikt. | Context3D | ||
enableErrorChecking : Boolean
Geeft aan of fouten die door de renderer zijn aangetroffen, aan de toepassing worden gemeld. | Context3D | ||
maxBackBufferHeight : int
Geeft de maximale hoogte van de backbuffer op. | Context3D | ||
maxBackBufferWidth : int
Geeft de maximale breedte van de backbuffer op. | Context3D | ||
profile : String [alleen-lezen]
Het feature-supportprofiel dat wordt gebruikt door dit Context3D-object. | Context3D | ||
supportsVideoTexture : Boolean [statisch] [alleen-lezen]
Geeft aan of Context3D videostructuur ondersteunt. | Context3D | ||
totalGPUMemory : Number [alleen-lezen]
Retourneert het totale GPU-geheugen dat wordt toegewezen door Stage3D-gegevensstructuren van een toepassing. Wanneer een GPU-bronobject wordt gemaakt, wordt het gebruikte geheugen opgeslagen in Context3D. | Context3D |
Methode | Gedefinieerd door | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Registreert een gebeurtenislistenerobject bij een object EventDispatcher, zodat de listener een melding van een gebeurtenis ontvangt. | EventDispatcher | ||
clear(red:Number = 0.0, green:Number = 0.0, blue:Number = 0.0, alpha:Number = 1.0, depth:Number = 1.0, stencil:uint = 0, mask:uint = 0xffffffff):void
Wist de kleur-, diepte- en stencilbuffer die aan dit Context3D-object zijn gekoppeld, en vult deze met de opgegeven waarden. | Context3D | ||
configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
Stelt de viewportgrootte en andere kenmerken van de renderingbuffer in. | Context3D | ||
createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
Maakt een CubeTexture-object. | Context3D | ||
Maakt een IndexBuffer3D-object. | Context3D | ||
Maakt een Program3D-object. | Context3D | ||
createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
Hiermee maakt u een Rectangle Texture-object. | Context3D | ||
createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
Maakt een Texture-object. | Context3D | ||
createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Maakt een VertexBuffer3D-object. | Context3D | ||
createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Maakt een VertexBuffer3D-object voor instantiegegevens. | Context3D | ||
Maakt een VideoTexture-object. | Context3D | ||
Verzendt een gebeurtenis naar de gebeurtenisstroom. | EventDispatcher | ||
Maakt alle bronnen en interne opslagruimte vrij die aan deze Context3D zijn gekoppeld. | Context3D | ||
Tekent de huidige renderbuffer naar een bitmap. | Context3D | ||
De opgegeven driehoeken weergeven met de huidige buffers en toestand van dit Context3D-object. | Context3D | ||
drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
Geef de opgegeven instantiedriehoeken weer met de huidige buffers en toestand van dit Context3D-object. | Context3D | ||
Controleert of het object EventDispatcher listeners heeft geregistreerd voor een specifiek type gebeurtenis. | EventDispatcher | ||
Geeft aan of voor een object een opgegeven eigenschap is gedefinieerd. | Object | ||
Geeft aan of een instantie van de klasse Object zich in de prototypeketen van het object bevindt dat als parameter is opgegeven. | Object | ||
Geeft de backbuffer voor rendering weer. | Context3D | ||
Geeft aan of de opgegeven eigenschap bestaat en kan worden opgesomd. | Object | ||
Verwijdert een listener uit het object EventDispatcher. | EventDispatcher | ||
Geeft de factoren op die worden gebruikt om de uitvoerkleur van een tekenhandeling over te laten vloeien met de bestaande kleur. | Context3D | ||
Stelt het masker in dat wordt gebruikt bij het schrijven van kleuren naar de renderingbuffer. | Context3D | ||
Hiermee stelt u de schiftingmodus voor driehoeken in. | Context3D | ||
Stelt het vergelijkingstype in dat wordt gebruikt voor dieptetests. | Context3D | ||
De standaardvulmodus wordt gebruikt voor de weergave. | Context3D | ||
Stelt hoekpunt- en fragmentshaderprogramma's in die vervolgens kunnen worden gebruikt voor rendering. | Context3D | ||
setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
Stel constanten in voor gebruik door shaderprogramma's met behulp van waarden die in een ByteArray zijn opgeslagen. | Context3D | ||
setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Hiermee stelt u met behulp van waarden die in een Matrix3D zijn opgeslagen constanten in voor gebruik door shaderprogramma's. | Context3D | ||
setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
Stelt de constante-invoer in voor de shaderprogramma's. | Context3D | ||
Stelt de beschikbaarheid van een dynamische eigenschap voor lusbewerkingen in. | Object | ||
Stelt de backbuffer voor rendering in als het renderdoel. | Context3D | ||
setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
Stelt de opgegeven structuur in als het renderdoel. | Context3D | ||
Overschrijf handmatig de structuursamplerstatus. | Context3D | ||
Stelt een sscissor-rechthoek in, dit is een type tekenmasker. | Context3D | ||
setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
Stelt de stencilmodus- en bewerking in. | Context3D | ||
Stelt de stencilvergelijkingswaarde in die wordt gebruikt voor stenciltests. | Context3D | ||
Geeft de structuur aan die moet worden gebruikt voor een structuurinvoerregister van een fragmentprogramma. | Context3D | ||
setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
Geeft op welke hoekpuntgegevenscomponenten overeenkomen met één invoerwaarde voor hoekpuntshaderprogramma's. | Context3D | ||
Geeft de tekenreeksweergave van dit object weer, geformatteerd volgens de locatiespecifieke conventies. | Object | ||
Retourneert een tekenreeksrepresentatie van het opgegeven object. | Object | ||
Retourneert de primitieve waarde van het opgegeven object. | Object | ||
Controleert of een gebeurtenislistener is geregistreerd bij dit object EventDispatcher of een van de voorouders voor het opgegeven type gebeurtenis. | EventDispatcher |
backBufferHeight | eigenschap |
backBufferHeight:int
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 15, AIR 15 |
Geeft de hoogte van de backbuffer op, die kan worden gewijzigd door een succesvolle aanroep van de configureBackBuffer()
-methode. De hoogte kan worden gewijzigd wanneer de zoomfactor van de browser wijzigt als wantsBestResolutionOnBrowserZoom
is ingesteld op true
in de laatste succesvolle aanroep van de configureBackBuffer()
-methode. De wijziging in hoogte kan worden gedetecteerd door een gebeurtenislistener te registreren voor de gebeurtenis voor het wijzigen van de browserzoom.
Implementatie
public function get backBufferHeight():int
Verwante API-elementen
backBufferWidth | eigenschap |
backBufferWidth:int
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 15, AIR 15 |
Geeft de breedte van de backbuffer op, die kan worden gewijzigd door een succesvolle aanroep van de configureBackBuffer()
-methode. De hoogte kan worden gewijzigd wanneer de zoomfactor van de browser wijzigt als wantsBestResolutionOnBrowserZoom
is ingesteld op true
in de laatste succesvolle aanroep van de configureBackBuffer()
-methode. De wijziging in breedte kan worden gedetecteerd door een gebeurtenislistener te registreren voor de gebeurtenis voor het wijzigen van de browserzoom.
Implementatie
public function get backBufferWidth():int
Verwante API-elementen
driverInfo | eigenschap |
driverInfo:String
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Het type stuurprogramma voor grafische bibliotheken dat door deze renderingcontext wordt gebruikt. Geeft aan of de rendering wordt uitgevoerd met gebruik van software, een DirectX-stuurprogramma of een OpenGL-stuurprogramma. Geeft ook aan of hardwarerendering al dan niet is mislukt. Als de hardwarerendering mislukt, gebruikt Flash Player softwarerendering voor Stage3D en bevat driverInfo
een van de volgende waarden:
- "Software Hw_disabled=userDisabled" - Het selectievakje Hardwareversnelling inschakelen in de gebruikersinterface Instellingen Adobe Flash Player is niet ingeschakeld.
- "Software Hw_disabled=oldDriver" - Er zijn bekende problemen met het grafische stuurprogramma voor de hardware. Dit probleem kan worden verholpen door het grafische stuurprogramma bij te werken.
- "Software Hw_disabled=unavailable" - Bekende problemen met het grafische stuurprogramma voor de hardware, of fout bij de initialisatie van de grafische hardware.
- "Software Hw_disabled=explicit" - De inhoud heeft expliciet gevraagd om softwarerendering via requestContext3D.
- "Software Hw_disabled=domainMemory" - De inhoud gebruikt domainMemory die een licentie vereist bij gebruik met Stage3D-hardwarerendering. Ga naar adobe.com/go/fpl_nl.
Implementatie
public function get driverInfo():String
enableErrorChecking | eigenschap |
enableErrorChecking:Boolean
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Geeft aan of fouten die door de renderer zijn aangetroffen, aan de toepassing worden gemeld.
Als enableErrorChecking
true
is, zijn de methoden clear()
en drawTriangles()
synchroon en kunnen deze methoden fouten genereren. Als enableErrorChecking
false
(de standaardwaarde) is, zijn de methoden clear()
en drawTriangles()
asynchroon en worden fouten niet gemeld. Wanneer foutcontrole wordt ingeschakeld, gaan de renderprestaties achteruit. Schakel foutcontrole alleen in voor foutopsporingsdoeleinden.
Implementatie
public function get enableErrorChecking():Boolean
public function set enableErrorChecking(value:Boolean):void
Verwante API-elementen
maxBackBufferHeight | eigenschap |
maxBackBufferHeight:int
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 15, AIR 15 |
Geeft de maximale hoogte van de backbuffer op. De oorspronkelijke waarde is de systeemlimiet in het platform. De eigenschap kan worden ingesteld op een waarde kleiner dan of gelijk aan, maar niet groter dan, de systeemlimiet. De eigenschap kan worden ingesteld op een waarde groter dan of gelijk aan, maar niet kleiner dan, de systeemlimiet. De minimale limiet is een constante waarde, 32, als de backbuffer niet is geconfigureerd. De minimale limiet wordt de waarde van de hoogteparameter in de laatste succesvolle aanroep van de configureBackBuffer()
-methode nadat de backbuffer is geconfigureerd.
Implementatie
public function get maxBackBufferHeight():int
public function set maxBackBufferHeight(value:int):void
maxBackBufferWidth | eigenschap |
maxBackBufferWidth:int
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 15, AIR 15 |
Geeft de maximale breedte van de backbuffer op. De oorspronkelijke waarde is de systeemlimiet in het platform. De eigenschap kan worden ingesteld op een waarde kleiner dan of gelijk aan, maar niet groter dan, de systeemlimiet. De eigenschap kan worden ingesteld op een waarde groter dan of gelijk aan, maar niet kleiner dan, de systeemlimiet. De minimale limiet is een constante waarde, 32, als de backbuffer niet is geconfigureerd. De minimale limiet wordt de waarde van de breedteparameter in de laatste succesvolle aanroep van de configureBackBuffer()
-methode nadat de backbuffer is geconfigureerd.
Implementatie
public function get maxBackBufferWidth():int
public function set maxBackBufferWidth(value:int):void
profile | eigenschap |
supportsVideoTexture | eigenschap |
totalGPUMemory | eigenschap |
totalGPUMemory:Number
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 21, AIR 21 |
Retourneert het totale GPU-geheugen dat wordt toegewezen door Stage3D-gegevensstructuren van een toepassing.
Wanneer een GPU-bronobject wordt gemaakt, wordt het gebruikte geheugen opgeslagen in Context3D. Dit geheugen bevat indexbuffers, hoekpuntbuffers, structuren (met uitzondering van videostructuren) en programma's die zijn gemaakt via deze Context3D.
API totalGPUMemory
retourneert het totale geheugengebruik door de bovenstaande bronnen aan de gebruiker. De standaardwaarde is 0. Het totale GPU-geheugen wordt geretourneerd in bytes. De informatie is alleen beschikbaar in de modus Direct op mobiele apparaten en in de modus Direct of GPU op bureaublad-pc's. (Als u <renderMode>gpu</renderMode>
gebruikt op bureaublad-pc's, wordt de modus <renderMode>direct</renderMode>
toegepast)
Implementatie
public function get totalGPUMemory():Number
clear | () | methode |
public function clear(red:Number = 0.0, green:Number = 0.0, blue:Number = 0.0, alpha:Number = 1.0, depth:Number = 1.0, stencil:uint = 0, mask:uint = 0xffffffff):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Wist de kleur-, diepte- en stencilbuffer die aan dit Context3D-object zijn gekoppeld, en vult deze met de opgegeven waarden.
Stel de parameter mask
in om op te geven welke buffers moeten worden gewist. Gebruik de constanten die in de klasse Context3DClearMask zijn gedefinieerd om de parameter mask
in te stellen. Gebruik de bitsgewijze operator OR (|) om meerdere buffers aan het masker toe te voegen (of gebruik Context3DClearMask.ALL
). Bij rendering naar de backbuffer moet de methode configureBackBuffer()
worden aangeroepen voordat clear()
wordt aangeroepen.
Opmerking: als u een parameterwaarde buiten het toegestane bereik opgeeft, worden numerieke parameterwaarden aan het bereik 0-1 vastgeklemd. Dit wordt niet gemeld. En als stencil
groter is dan 0xff, wordt deze op die waarde ingesteld.
Parameters
red:Number (default = 0.0 ) — de rode component van de kleur waarmee de kleurbuffer moet worden gewist, in het bereik 0-1.
| |
green:Number (default = 0.0 ) — de groene component van de kleur waarmee de kleurbuffer moet worden gewist, in het bereik 0-1.
| |
blue:Number (default = 0.0 ) — de blauwe component van de kleur waarmee de kleurbuffer moet worden gewist, in het bereik 0-1.
| |
alpha:Number (default = 1.0 ) — de alfacomponent van de kleur waarmee de kleurbuffer moet worden gewist, in het bereik 0-1. De alfacomponent wordt niet gebruikt voor overvloeiing. Deze wordt rechtstreeks in de alfabuffer geschreven.
| |
depth:Number (default = 1.0 ) — de waarde waarmee de dieptebuffer moet worden gewist, in het bereik 0-1.
| |
stencil:uint (default = 0 ) — de 8 bitswaarde waarmee de dieptebuffer moet worden gewist, in het bereik 0x00-0xff.
| |
mask:uint (default = 0xffffffff ) — geeft aan welke buffers moeten worden gewist.
|
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — 3768: De Stage3D -API kan niet worden gebruikt tijdens uitvoering op de achtergrond.
|
Verwante API-elementen
configureBackBuffer | () | methode |
public function configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt de viewportgrootte en andere kenmerken van de renderingbuffer in.
Rendering is dubbel gebufferd. De backbuffer wordt omgewisseld met de zichtbare voorbuffer wanneer de methode present()
wordt aangeroepen. De minimumgrootte van de buffer is 32x32 pixels. De grootte van de backbuffer wordt beperkt door de mogelijkheden van het apparaat en kan ook door de gebruiker worden ingesteld via de eigenschappen maxBackBufferWidth
en maxBackBufferHeight
. Het configureren van de buffer neemt veel tijd in beslag. U kunt de buffergrootte of -kenmerken beter niet tijdens normale renderbewerkingen wijzigen.
Parameters
width:int — breedte in pixels van de buffer.
| |||||||||
height:int — hoogte in pixels van de buffer.
| |||||||||
antiAlias:int — een geheel getal dat de gewenste antialiasingkwaliteit aangeeft. De waarde correleert met het aantal subsamples dat bij antialiasing wordt gebruikt. Bij gebruik van meer subsamples moeten meer berekeningen worden uitgevoerd, hoewel de relatieve invloed op prestaties afhankelijk is van de specifieke renderinghardware. Het type antialiasing en of antialiasing überhaupt wordt uitgevoerd, is afhankelijk van het apparaat en de renderingmodus. Antialiasing wordt helemaal niet ondersteund door de softwarerenderingcontext.
| |||||||||
enableDepthAndStencil:Boolean (default = true ) — Bij false is er geen diepte-of stencilbuffer gemaakt, bij true wordt een diepte- en stencilbuffer gemaakt. Als het element renderMode in het descriptorbestand van de toepassing direct is in geval van AIR 3.2. of een latere toepassing die is gecompileerd met SWF-versie 15 of hoger, moet het element depthAndStencil in het descriptorbestand van de toepassing dezelfde waarde hebben als dit argument. Standaard heeft het elementdepthAndStencil de waarde false .
| |||||||||
wantsBestResolution:Boolean (default = false ) — true geeft aan dat als het apparaat HiDPI-schermen ondersteunt, het zal proberen een grotere backbuffer toe te wijzen dan aangeduid met de breedte- en hoogteparameters. Omdat dit meer pixels toevoegt en mogelijk het resultaat van arceringsbewerkingen wijzigt, is dit standaard uitgeschakeld. Gebruik Stage.contentsScaleFactor om te bepalen hoeveel de native backbuffer omhoog is geschaald.
| |||||||||
wantsBestResolutionOnBrowserZoom:Boolean (default = false ) — true geeft aan dat de grootte van de backbuffer moet toenemen in verhouding tot de toename in de zoomfactor van de browser. De instelling van deze waarde is blijvend voor meerdere zoomacties van de browser. De standaardwaarde van de parameter is false . Stel de eigenschappen maxBackBufferWidth en maxBackBufferHeight in om de toename van de backbuffergrootte te beperken. Gebruik backBufferWidth en backBufferHeight om de huidig grootte van de backbuffer te bepalen.
|
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Onjuiste invoergrootte: De parameter voor hoogte of breedte is kleiner dan de minimaal toegestane backbuffer of groter dan de maximaal toegestane backbuffer.
| |
Error — 3709: De markering depthAndStencil in het descriptorbestand van de toepassing moet overeenkomen met de Booleaanse waardeenableDepthAndStencil die is doorgegeven aan configureBackBuffer() op het Context3D-object.
|
createCubeTexture | () | methode |
public function createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Maakt een CubeTexture-object.
Gebruik een CubeTexture-object om kubusstructuurbitmaps te uploaden naar de renderingcontext en om tijdens rendering te verwijzen naar een kubusstructuur. Een kubusstructuur bestaat uit zes vierkante structuren van hetzelfde formaat die in een kubieke topologie zijn gerangschikt en nuttig zijn voor het beschrijven van omgevingstoewijzingen.
U kunt geen CubeTexture-objecten maken met een CubeTexture-constructor; gebruik in plaats daarvan deze methode. Na het maken van een CubeTexture-object, uploadt u de structuurbitmapgegevens met gebruik van de CubeTexture-methoden uploadFromBitmapData()
, uploadFromByteArray()
of uploadCompressedTextureFromByteArray()
.
Parameters
size:int — De structuurrandlengte in texels.
| |
format:String — Het texelformaat van de opsommingslijst Context3DTextureFormat.
Met structuurcompressie kunt u structuurafbeeldingen rechtstreeks in gecomprimeerde vorm opslaan op de GPU. Zo bespaart u GPU-geheugen en geheugenbandbreedte. Gewoonlijk worden gecomprimeerde structuren offline gecomprimeerd en in gecomprimeerde vorm geüpload naar de GPU met gebruik van de methode Texture.uploadCompressedTextureFromByteArray. In Flash Player 11.4 en AIR 3.4 voor desktopplatforms is ondersteuning toegevoegd voor structuurcompressie tijdens de runtime. Dit kan in bepaalde situaties nuttig zijn, zoals bij het renderen van dynamische structuren van vectorillustraties. Let op: deze functie is momenteel niet beschikbaar op mobiele platforms. Dan wordt een ArgumentError (niet-overeenkomende structuurindeling) weergegeven. Voer de volgende stappen uit als u structuurcompressie tijdens de runtime wilt gebruiken. 1. Maak het structuurobject door de Context3D.createCubeTexture()-methode aan te roepen door flash.display3D.Context3DTextureFormat.COMPRESSED of flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA door te geven als de indelingsparameter. 2. Roep aan de hand van de instantie flash.display3D.textures.Texture die is geretourneerd door createCubeTexture() ofwel flash.display3D.textures.CubeTexture.uploadFromBitmapData() ofwel flash.display3D.textures.CubeTexture.uploadFromByteArray() aan om de structuur in één stap te uploaden en te comprimeren. | |
optimizeForRenderToTexture:Boolean — Stel de waarde in op true als de structuur waarschijnlijk wordt gebruikt als een renderdoel.
| |
streamingLevels:int (default = 0 ) — Het MIP-mapniveau dat moet worden geladen voordat de afbeelding wordt gerenderd. Structuurstreaming maakt het mogelijk om de kleinste mip-niveaus eerst te laden en weer te geven en vervolgens afbeeldingen van steeds hogere kwaliteit weer te geven terwijl de structuren worden geladen. Eindgebruikers kunnen de afbeeldingen bij een lagere kwaliteit in de toepassing bekijken terwijl de afbeeldingen van hogere kwaliteit worden geladen.
Standaard is streamingLevels ingesteld op 0. Dit betekent dat de afbeelding met de hoogste kwaliteit in de mipmap moet worden geladen voordat de afbeelding wordt gerenderd. Deze parameter is toegevoegd in Flash Player 11.3 en AIR 3.3. Als u de standaardwaarde gebruikt, blijft de functionaliteit van de vorige versies van Flash Player en AIR behouden. Stel Opmerking: Als u deze eigenschap instelt op een waarde > 0, is dat van invloed op het geheugengebruik en de prestaties. |
flash.display3D.textures:CubeTexture |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: wanneer er te veel structuurobjecten zijn gemaakt of wanneer de hoeveelheid aan structuren toegewezen geheugen wordt overschreden.
| |
ArgumentError — Dieptestructuur niet geïmplementeerd: wanneer u probeert een dieptestructuur te maken.
| |
ArgumentError — Structuurformaat is nul: wanneer de parameter size niet groter is dan nul.
| |
ArgumentError — Structuur geen macht van twee: als de parameter size geen macht van twee is.
| |
ArgumentError — Structuur te groot: als de parameter size groter is dan 1024.
| |
Error — Maken van structuur mislukt: als het object CubeTexture niet kan worden gemaakt door de renderingcontext (en er geen informatie over de oorzaak beschikbaar is).
| |
ArgumentError — Ongeldig streamingniveau: als de waarde van streamingLevels groter of gelijk is aan log2(grootte).
|
Verwante API-elementen
createIndexBuffer | () | methode |
public function createIndexBuffer(numIndices:int, bufferUsage:String = "staticDraw"):IndexBuffer3D
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Maakt een IndexBuffer3D-object.
Gebruik een IndexBuffer3D-object om een set driehoekindices te uploaden naar de rendering context en om voor de rendering te verwijzen naar deze set. Elke index in de indexbuffer verwijst naar een corresponderend hoekpunt in een hoekpuntbuffer. Elke set met drie indices vormt een driehoek. Geef het IndexBuffer3D-object door aan de methode drawTriangles()
om een of meerdere in de indexbuffer gedefinieerde driehoeken te renderen.
U kunt geen IndexBuffer3D-objecten maken met de IndexBuffer3D-klasseconstructor; gebruik daarvoor deze methode. Na het maken van een IndexBuffer3D-object, uploadt u de indices met gebruik van de IndexBuffer3D-methode uploadFromVector()
of uploadFromByteArray()
.
Parameters
numIndices:int — het aantal hoekpunten dat in de buffer moet worden opgeslagen.
| |
bufferUsage:String (default = "staticDraw ") — het verwachte buffergebruik. Gebruik een van de constante waarden die zijn gedefinieerd in Context3DBufferUsage . De hardwaredriver kan de desbetreffende optimalisatie uitvoeren als u deze op de juiste manier instelt. Deze parameter is alleen beschikbaar in versies na Flash 12 / AIR 4.
|
IndexBuffer3D |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: als er te veel indexbuffers zijn gemaakt of wanneer de hoeveelheid aan indexbuffers toegewezen geheugen wordt overschreden.
| |
Error — 3768: De Stage3D -API kan niet worden gebruikt tijdens uitvoering op de achtergrond.
| |
ArgumentError — Buffer te groot: wanneer numIndices groter is dan of gelijk is aan 0xf0000.
|
Verwante API-elementen
createProgram | () | methode |
public function createProgram():Program3D
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Maakt een Program3D-object.
Gebruik een Program3D-object om shaderprogramma's te uploaden naar de renderingcontext en om tijdens de rendering te verwijzen naar geüploade programma's. Een Program3D-object slaat twee programma's op, namelijk een hoekpuntprogramma en een fragmentprogramma (ook wel een pixelprogramma genoemd). De programma's worden geschreven in een assembleertaal voor binaire shaders.
U kunt geen Program3D -objecten maken met een Program3D-constructor; gebruik daarvoor deze methode. Na het maken van een Program3D-object, uploadt u de programma's met gebruik van de Program3D-methode upload()
.
Program3D |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Het aantal programma's is hoger dan 4096 of het totale geheugen is groter dan 16 MB (gebruik dispose om Program3D-bronnen te ontlasten).
|
Verwante API-elementen
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
renderContext
is een instantie van de Context3D-klasse. De programma's in dit voorbeeld zijn geschreven in AGAL (Adobe Graphics Assembly Language).
//A simple vertex program in AGAL const VERTEX_SHADER:String = "m44 op, va0, vc0 \n" + "mov v0, va1"; //A simple fragment (or pixel) program in AGAL const FRAGMENT_SHADER:String = "mov oc, v0"; var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); var programPair:Program3D; //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair );
createRectangleTexture | () | methode |
public function createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.8, AIR 3.8 |
Hiermee maakt u een Rectangle Texture-object.
Gebruik een RectangleTexture-object om structuurbitmaps te uploaden naar de renderingcontext en om tijdens rendering te verwijzen naar een structuur.
U kunt geen RectangleTexture-objecten maken met een RectangleTexture-constructor; gebruik in plaats daarvan deze methode. Na het maken van een RectangleTexture-object, uploadt u de structuurbitmaps met gebruik van de Texture-methoden uploadFromBitmapData()
of uploadFromByteArray()
.
Merk op dat 32-bits geheel-getalstructuren opgeslagen zijn in een gecomprimeerde BGRA-indeling in overeenkomst met de BitmapData
-indeling in Flash. Drijvende-kommatexturen gebruiken een conventionele RGBA-indeling.
Rechthoekige structuren zijn anders dan gewone 2D-structuren omdat de hoogte en breedte van rechthoekige structuren geen machten van 2 hoeven te zijn. Bovendien bevatten rechthoekige structuren geen MIP-maps. Rechthoekige structuren zijn erg handig wanneer er naar structuren wordt gerenderd. Als een Rectangle Texture-object wordt gebruikt met een sampler die mip-mapfiltering of de wrap-modus Herhalen gebruikt, mislukt de drawTriangles-aanroep. Bij Rectangle Texture-objecten is streaming ook niet toegestaan. De enige structuurindelingen die door rechthoekige structuren worden ondersteund, zijn BGRA, BGR_PACKED, BGRA_PACKED. De gecomprimeerde structuurindelingen worden niet ondersteund door rechthoekige structuren.
Parameters
width:int — De structuurbreedte in texels.
| |
height:int — De structuurhoogte in texels.
| |
format:String — Het texelformaat van de opsommingslijst Context3DTextureFormat.
| |
optimizeForRenderToTexture:Boolean — Stel de waarde in op true als de structuur waarschijnlijk wordt gebruikt als een renderdoel.
|
flash.display3D.textures:RectangleTexture |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: wanneer er te veel structuurobjecten zijn gemaakt of wanneer de hoeveelheid aan structuren toegewezen geheugen wordt overschreden.
| |
ArgumentError — Structuurformaat is nul: wanneer zowel de parameterwidth als de parameter height niet groter is dan nul.
| |
ArgumentError — Structuur te groot: als een van de parameters width of height groter is dan 2048.
| |
Error — Maken van structuur mislukt: als het object Texture niet kan worden gemaakt door de renderingcontext (en er geen informatie over de oorzaak beschikbaar is).
| |
Error — Vereist basislijnprofiel of hoger: als de rechthoekige structuur wordt gemaakt met een beperkt basislijnprofiel
|
Verwante API-elementen
createTexture | () | methode |
public function createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Maakt een Texture-object.
Gebruik een Texture-object om structuurbitmaps te uploaden naar de renderingcontext en om tijdens rendering te verwijzen naar een structuur.
U kunt geen Texture-objecten maken met een Texture-constructor; gebruik in plaats daarvan deze methode. Na het maken van een Texture-object, uploadt u de structuurbitmaps met gebruik van de Texture-methoden uploadFromBitmapData()
, uploadFromByteArray()
of uploadCompressedTextureFromByteArray()
.
Merk op dat 32-bits geheel-getalstructuren opgeslagen zijn in een gecomprimeerde BGRA-indeling in overeenkomst met de BitmapData
-indeling in Flash. Drijvende-kommatexturen gebruiken een conventionele RGBA-indeling.
Parameters
width:int — De structuurbreedte in texels.
| |
height:int — De structuurhoogte in texels.
| |
format:String — Het texelformaat van de opsommingslijst Context3DTextureFormat.
Met structuurcompressie kunt u structuurafbeeldingen rechtstreeks in gecomprimeerde vorm opslaan op de GPU. Zo bespaart u GPU-geheugen en geheugenbandbreedte. Gewoonlijk worden gecomprimeerde structuren offline gecomprimeerd en in gecomprimeerde vorm geüpload naar de GPU met gebruik van de methode Texture.uploadCompressedTextureFromByteArray. In Flash Player 11.4 en AIR 3.4 voor desktopplatforms is ondersteuning toegevoegd voor structuurcompressie tijdens de runtime. Dit kan in bepaalde situaties nuttig zijn, zoals bij het renderen van dynamische structuren van vectorillustraties. Let op: deze functie is momenteel niet beschikbaar op mobiele platforms. Dan wordt een ArgumentError (niet-overeenkomende structuurindeling) weergegeven. Voer de volgende stappen uit als u structuurcompressie tijdens de runtime wilt gebruiken. 1. Maak het structuurobject door de Context3D.createTexture()-methode aan te roepen of door flash.display3D.Context3DTextureFormat.COMPRESSED of flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA door te geven als de indelingsparameter. 2. Roep aan de hand van de instantie flash.display3D.textures.Texture die is geretourneerd door createTexture() ofwel flash.display3D.textures.Texture.uploadFromBitmapData() ofwel flash.display3D.textures.Texture.uploadFromByteArray() aan om de structuur in één stap te uploaden en te comprimeren. | |
optimizeForRenderToTexture:Boolean — Stel de waarde in op true als de structuur waarschijnlijk wordt gebruikt als een renderdoel.
| |
streamingLevels:int (default = 0 ) — Het MIP-mapniveau dat moet worden geladen voordat de afbeelding wordt gerenderd. Structuurstreaming maakt het mogelijk om de kleinste mip-niveaus eerst te laden en weer te geven en vervolgens afbeeldingen van steeds hogere kwaliteit weer te geven terwijl de structuren worden geladen. Eindgebruikers kunnen de afbeeldingen bij een lagere kwaliteit in de toepassing bekijken terwijl de afbeeldingen van hogere kwaliteit worden geladen.
Standaard is streamingLevels ingesteld op 0. Dit betekent dat de afbeelding met de hoogste kwaliteit in de mipmap moet worden geladen voordat de afbeelding wordt gerenderd. Deze parameter is toegevoegd in Flash Player 11.3 en AIR 3.3. Als u de standaardwaarde gebruikt, blijft de functionaliteit van de vorige versies van Flash Player en AIR behouden. Stel Opmerking: Als u deze eigenschap instelt op een waarde > 0, is dat van invloed op het geheugengebruik en de prestaties. |
flash.display3D.textures:Texture |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: wanneer er te veel structuurobjecten zijn gemaakt of wanneer de hoeveelheid aan structuren toegewezen geheugen wordt overschreden.
| |
ArgumentError — Dieptestructuur niet geïmplementeerd: wanneer u probeert een dieptestructuur te maken.
| |
ArgumentError — Structuurformaat is nul: wanneer zowel de parameterwidth als de parameter height niet groter is dan nul.
| |
ArgumentError — Structuur geen macht van twee: als de parameter width en de parameterheight een macht van twee is.
| |
ArgumentError — Structuur te groot: als de parameter width of height groter is dan 2048 voor een basislijnprofiel en een beperkt basislijnprofiel of als de parameter width of height groter is dan 4096 voor uitgebreid basislijnprofiel en hoger.
| |
Error — Maken van structuur mislukt: als het object Texture niet kan worden gemaakt door de renderingcontext (en er geen informatie over de oorzaak beschikbaar is).
| |
ArgumentError — Ongeldig streamingniveau: als de waarde van streamingLevels groter of gelijk is aan log2(min(breedte,hoogte)).
|
Verwante API-elementen
createVertexBuffer | () | methode |
public function createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Maakt een VertexBuffer3D-object.
Gebruik een VertexBuffer3D-object om een set hoekpuntgegevens te uploaden naar de renderingcontext. Een hoekpuntbuffer bevat de gegevens die nodig zijn om elk punt in de scènegeometrie te renderen. De aan elk hoekpunt gekoppelde gegevenskenmerken bevatten doorgaans de positie-, kleur- en structuurcoördinaten en dienen als de invoer voor het shaderprogramma voor hoekpunten. Stel met gebruik van de setVertexBufferAt()
-methode vast welke gegevenswaarden overeenkomen met een van de invoeren van het hoekpuntprogramma. U kunt maximaal 64 32-bits waarden opgeven voor elk hoekpunt.
U kunt geen VertexBuffer3D-objecten maken met de VertexBuffer3D-constructor; gebruik daarvoor deze methode. Na het maken van een VertexBuffer3D-object, uploadt u de hoekpuntgegevens met gebruik van de VertexBuffer3D-methode uploadFromVector()
of uploadFromByteArray()
.
Parameters
numVertices:int — Het aantal hoekpunten dat in de buffer moet worden opgeslagen. Het maximumaantal hoekpunten in één buffer is 65535.
| |
data32PerVertex:int — Het aantal 32-bits (4 bytes) gegevenswaarden dat is gekoppeld aan elk hoekpunt. Het maximum aantal 32-bits gegevenselementen per hoekpunt is 64 (of 256 bytes). Let op: slechts acht kenmerkenregisters tegelijk zijn toegankelijk met een shaderprogramma voor hoekpunten. Gebruik SetVertextBufferAt() om kenmerken in een hoekpuntenbuffer te selecteren.
| |
bufferUsage:String (default = "staticDraw ") — het verwachte buffergebruik. Gebruik een van de constante waarden die zijn gedefinieerd in Context3DBufferUsage . De hardwaredriver kan de desbetreffende optimalisatie uitvoeren als u deze op de juiste manier instelt. Deze parameter is alleen beschikbaar in versies na Flash 12 / AIR 4.
|
VertexBuffer3D |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: als er te veel hoekpuntbufferobjecten zijn gemaakt of wanneer de hoeveelheid aan hoekpuntbuffers toegewezen geheugen is overschreden.
| |
ArgumentError — Buffer te groot: wanneer numVertices groter is dan 0x10000 of data32PerVertex groter is dan 64.
| |
ArgumentError — Buffer heeft grootte van nul: wanneer numVertices of data32PerVertex gelijk is aan nul.
| |
ArgumentError — Maken van buffer mislukt: als het object VertexBuffer3D niet kan worden gemaakt door de renderingcontext (en er geen informatie over de oorzaak beschikbaar is).
| |
Error — 3768: De Stage3D -API kan niet worden gebruikt tijdens uitvoering op de achtergrond.
|
Verwante API-elementen
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
setVertexBufferAt()
aan om op te geven dat de eerste drie gegevenspunten als drie zwevende-kommawaarden in va0 worden doorgegeven aan het hoekpuntprogramma en dat de tweede set van drie gegevenspunten worden doorgegeven als va1. Er kunnen op deze manier maximaal 8 invoerwaarden, ook wel registers voor hoekpuntkenmerken genoemd, worden gedefinieerd voor een hoekpuntprogramma.
const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ // x, y, z r, g, b format 0, 0, 0, 1, 1, 1, -1, 1, 0, 0, 0,.5, 1, 1, 0, 0, 0, 1, 1,-1, 0, .5, 0, 0, -1,-1, 0, 1, 0, 0 ] ); var vertexes:VertexBuffer3D = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //Defines shader input va0 as the position data renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //Defines shader input va1 as the color data
createVertexBufferForInstances | () | methode |
public function createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 20.0 |
Maakt een VertexBuffer3D-object voor instantiegegevens.
Gebruik een VertexBuffer3D-object om een set instantiegegevens te uploaden naar de renderingcontext. De hoekpuntbuffer bevat de gegevens die nodig zijn om elke instantie in de scènegeometrie te renderen. Hoekpuntbuffers met instantiegegevens bieden kenmerken die gemeenschappelijk zijn voor alle hoekpunten van een instantie en die dienen als invoer voor het hoekpuntshaderprogramma. Stel met gebruik van de setVertexBufferAt()
-methode vast welke gegevenswaarden overeenkomen met een van de invoeren van het hoekpuntprogramma. U kunt maximaal 64 32-bits waarden opgeven voor elk element van de hoekpuntbuffer.
U kunt geen VertexBuffer3D-objecten maken met de VertexBuffer3D-constructor; gebruik daarvoor deze methode. Na het maken van een VertexBuffer3D-object, uploadt u de hoekpuntgegevens met gebruik van de VertexBuffer3D-methode uploadFromVector()
of uploadFromByteArray()
.
Parameters
numVertices:int — het aantal elementen dat in de buffer moet worden opgeslagen. Het maximale aantal elementen in één buffer is 65535.
| |
data32PerVertex:int — het aantal 32-bits (4 bytes) gegevenswaarden dat is gekoppeld aan elk element. Het maximum aantal 32-bits gegevenselementen per hoekpunt is 64 (of 256 bytes).
| |
instancesPerElement:int — het aantal instanties dat één element van de hoekpuntbuffer wordt gebruikt.
| |
bufferUsage:String (default = "staticDraw ") — het verwachte buffergebruik. Gebruik een van de constante waarden die zijn gedefinieerd in Context3DBufferUsage . De hardwaredriver kan de desbetreffende optimalisatie uitvoeren als u deze op de juiste manier instelt. Deze parameter is alleen beschikbaar in versies na Flash 12 / AIR 4.
|
VertexBuffer3D |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: als er te veel hoekpuntbufferobjecten zijn gemaakt of wanneer de hoeveelheid aan hoekpuntbuffers toegewezen geheugen is overschreden.
| |
ArgumentError — Buffer te groot: wanneer numVertices groter is dan 0x10000 of data32PerVertex groter is dan 64.
| |
ArgumentError — Buffer heeft grootte van nul: wanneer numVertices of data32PerVertex gelijk is aan nul.
| |
ArgumentError — Maken van buffer mislukt: als het object VertexBuffer3D niet kan worden gemaakt door de renderingcontext (en er geen informatie over de oorzaak beschikbaar is).
| |
Error — 3768: De Stage3D -API kan niet worden gebruikt tijdens uitvoering op de achtergrond.
| |
Error — Vereist Standard Extended-profiel of hoger: als deze methode wordt aangeroepen wanneer het gevraagde profiel een lagere waarde heeft dan het Standard Extended-profiel.
| |
Error — Ongeldige instanties per element: als instancesPerElement niet groter is dan nul.
|
Verwante API-elementen
createVideoTexture | () | methode |
public function createVideoTexture():flash.display3D.textures:VideoTexture
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 17.0, Flash Player 18.0 |
Maakt een VideoTexture-object.
Gebruik een VideoTexture-object om videoframes te verkrijgen als structuur uit een NetStream- of Camera-object en om de videoframes te uploaden naar de renderingcontext.
Het VideoTexture-object kan niet worden gemaakt met de VideoTexture-constructor. Gebruik in plaats daarvan deze methode. Na het maken van een VideoTexture-object, voegt u een NetStream-of een Camera-object bij om de videoframes aan te roepen met de VideoTexture-methode attachNetStream()
of attachCamera()
.
Deze methode retourneert null als het systeem deze functie niet ondersteunt.
VideoTexture bevat geen mipmaps. Als VideoTexture wordt gebruikt met een sampler die mip-mapfiltering of de wrap-modus Herhalen gebruikt, mislukt de drawTriangles-aanroep. VideoTexture kan door de shaders worden behandeld als een BGRA-structuur. De poging om een instantie te maken van het VideoTexture-object mislukt als Context3D wordt aangevraagd met de modus voor softwarerendering.
Er zijn maximaal 4 VideoTexture-objecten beschikbaar per Context3D-instantie. Op mobiele apparatuur kan het aantal ondersteunde VideoTexture-objecten minder dan 4 zijn vanwege platformbeperkingen.
Geretourneerde waardeflash.display3D.textures:VideoTexture |
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Bronlimiet overschreden: wanneer er te veel structuurobjecten zijn gemaakt of wanneer de hoeveelheid aan structuren toegewezen geheugen wordt overschreden.
| |
Error — Maken van structuur mislukt: als het object Texture niet kan worden gemaakt door de renderingcontext (en er geen informatie over de oorzaak beschikbaar is).
|
dispose | () | methode |
public function dispose(recreate:Boolean = true):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Maakt alle bronnen en interne opslagruimte vrij die aan deze Context3D zijn gekoppeld.
Alle indexbuffers, hoekpuntbuffers, structuren en programma's die zijn gemaakt via deze Context3D worden verwijderd, net zoals wanneer dispose()
zou zijn aangeroepen voor elk afzonderlijk element. Bovendien wordt Context3D zelf verwijderd waardoor alle tijdelijke buffers en de backbuffer worden vrijgemaakt. Als configureBackBuffer(), clear(), drawTriangles(), createCubeTexture(), createTexture(), createProgram(), createIndexBuffer(), createVertexBuffer() of drawToBitmapData() wordt aangeroepen nadat dispose() is aangeroepen, genereert de runtime een uitzondering.
Waarschuwing: Wanneer dispose() wordt aangeroepen voor een Context3D terwijl er nog een gebeurtenislistener voor Events.CONTEXT3D_CREATE ingesteld is in het bijbehorende Stage3D-object, wordt door de dispose()-aanroep een apparaatverlies gesimuleerd. In dat geval wordt een nieuwe Context3D voor de Stage3D gemaakt en wordt de gebeurtenis Events.CONTEXT3D_CREATE nogmaals gegenereerd. Als u dit niet wenst, verwijdert u de gebeurtenislistener van het Stage3D-object voordat u dispose() aanroept of stelt u de parameter recreate in op false.
Parameters
recreate:Boolean (default = true )
|
Verwante API-elementen
flash.display.Stage3D
drawToBitmapData | () | methode |
public function drawToBitmapData(destination:BitmapData, srcRect:Rectangle = null, destPoint:Point = null):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 3 |
Tekent de huidige renderbuffer naar een bitmap.
De actuele inhoud van de backrenderbuffer wordt naar een BitmapData-object gekopieerd. Dit is een mogelijk trage bewerking die soms een seconde in beslag kan nemen. Wees voorzichtig in uw gebruik hiervan. Merk op dat dit niet de voorrenderbuffer is (de buffer die wordt weergegeven in het werkgebied), maar de buffer waarnaar wordt getekend. Roep drawToBitmapData()
aan vlak voordat u present()
aanroept om de gerenderde afbeelding precies zo vast te leggen als deze in het werkgebied wordt weergegeven.
Vanaf AIR 25 zijn er twee nieuwe parameters geïntroduceerd in de API drawToBitmapData ()
. Deze API werkt nu met drie parameters. De eerste is de bestaande parameterdestination:BitmapData
. De tweede parameter is srcRect:Rectangle
; dit is de doelrechthoek op stage3D. De derde parameter is destPoint:Point
; dit is de coördinaat op de doelbitmap. De parameters srcRect en destPoint zijn optioneel en standaard ingesteld op (0,0,bitmapWidth,bitmapHeight) en (0,0) respectievelijk.
De afbeelding wordt tijdens het tekenen niet geschaald naar de grootte van de bitmap. De inhoud wordt in plaats daarvan bijgesneden naar de grootte van de doelbitmap.
In Flash BitmapData-objecten worden de kleuren opgeslagen die al zijn vermenigvuldigd door de alfacomponent. Als de 'zuivere' RGB-kleurcomponenten van een pixel bijvoorbeeld (0x0A, 0x12, 0xBB) zijn en de alfacomponent 0x7F (,5) is, wordt de pixel met de volgende RGBA-waarden opgeslagen in het BitmapData-object: (0x05, 0x09, 0x5D, 0x7F). U kunt de overvloeifactoren zodanig instellen dat de naar de buffer gerenderde kleuren vermenigvuldigd worden met alfa of u kunt de bewerking uitvoeren in de fragmentshader. De renderingcontext valideert niet of de kleuren in vooraf vermenigvuldigde indeling worden opgeslagen.
Parameters
destination:BitmapData | |
srcRect:Rectangle (default = null )
| |
destPoint:Point (default = null )
|
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — 3768: De Stage3D -API kan niet worden gebruikt tijdens uitvoering op de achtergrond.
| |
Error — 3802: Als een van de parameters destPoint:Point of srcRect:Rectangle zich buiten de bitmap/stage3D-coördinaatgrens bevindt, of niet-numerieke waarden (NaN) worden doorgegeven als invoer.
|
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.Stage3D; import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; import flash.filters.DropShadowFilter; public class Context3D_drawToBitmapData extends Sprite { public const viewWidth:Number = 320; public const viewHeight:Number = 200; private var bitmap:Bitmap; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private const VERTEX_SHADER:String = "mov op, va0 \n" + //copy position to output "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; public function Context3D_drawToBitmapData() { stage3D = this.stage.stage3Ds[0]; stage3D.x = 0; stage3D.y = 0; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false ); //Create vertex index list for the triangles var triangles:Vector.<uint> = Vector.<uint>( [ 0, 1, 2, 0, 3, 4 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ // x, y, z r, g, b format 0, 0, 0, 1, 1, 1, -1, 1, 0, 0, 0,.5, 1, 1, 0, 0, 0, 1, 1,-1, 0, .5, 0, 0, -1,-1, 0, 1, 0, 0 ] ); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); //Clear required before first drawTriangles() call renderContext.clear( .3,.3,.3 ); //Draw the 2 triangles renderContext.drawTriangles( indexList, 0, 2 ); var renderedBitmapData:BitmapData = new BitmapData( viewWidth, viewHeight, true ); renderContext.drawToBitmapData( renderedBitmapData ); renderContext.present(); //Add to stage bitmap = new Bitmap( renderedBitmapData ); this.addChild( bitmap ); bitmap.x = 55; bitmap.y = 25; bitmap.filters = [new DropShadowFilter( 8, 235, .4 )]; } } }
drawTriangles | () | methode |
public function drawTriangles(indexBuffer:IndexBuffer3D, firstIndex:int = 0, numTriangles:int = -1):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
De opgegeven driehoeken weergeven met de huidige buffers en toestand van dit Context3D-object.
Voor elke driehoek worden de hoekpunten door het hoekpuntshaderprogramma verwerkt, en het oppervlak door het pixelshaderprogramma. De uitvoerkleur van het pixelprogramma voor elke pixel wordt naar het renderdoel getekend afhankelijk van de stencilbewerkingen, dieptetest en bron- en doelalfa, en de huidige overvloeimodus. Het renderdoel kan de hoofdrenderbuffer of een structuur zijn.
Als schifting (culling) ingeschakeld is, (met de methode setCulling()
), kunnen driehoeken uit de scène worden verwijderd voordat het pixelprogramma wordt uitgevoerd. Als stencil- en dieptetests zijn ingeschakeld, kunnen uitvoerpixels van het pixelprogramma worden verwijderd zonder de renderbestemming bij te werken. Bovendien kan het pixelprogramma besluiten geen kleur voor een pixel uit te voeren.
De gerenderde driehoeken worden pas weergegeven in de viewport als u de methode present()
aanroept. Na elke aanroep van present()
, dient de methode clear()
te worden aangeroepen vóór de eerste aanroep van drawTriangles()
, anders mislukt de rendering.
Wanneer enableErrorChecking
false
is, wordt deze functie direct verwerkt zonder op resultaten te wachten, en worden alleen uitzonderingen gegenereerd als deze Context3D-instantie is verwijderd of er te veel tekenaanroepen zijn. Als de toestand van de renderingcontext ongeldig is, mislukt renderen (dit wordt niet gemeld). Als de eigenschap enableErrorChecking
true
is, wordt deze functie verwerkt nadat de driehoeken zijn getekend, en worden uitzonderingen gegenereerd voor alle tekenfouten en ongeldige contexttoestanden.
Parameters
indexBuffer:IndexBuffer3D — Een set hoekpuntindices die verwijzen naar de hoekpunten die moeten worden gerenderd.
| |
firstIndex:int (default = 0 ) — De index van de eerste hoekpuntindex die is geselecteerd voor de rendering. Standaard 0.
| |
numTriangles:int (default = -1 ) — Het aantal driehoeken dat moet worden gerenderd. Elke driehoek gebruikt drie indices. Geef -1 door om alle driehoeken in de indexbuffer te tekenen. Standaard -1.
|
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Als deze methode te vaak wordt aangeroepen tussen aanroepen van present() . Het maximum aantal aanroepen is 32.768.
De volgende fouten treden alleen op wanneer de eigenschap | |
Error — Eerst wissen voor tekenen: als de buffer niet is gewist sinds de laatste keer dat present() is aangeroepen.
| |
Error — Als er geen geldig Program3D-object is ingesteld.
| |
Error — Geen geldige indexbuffer ingesteld: als er geen IndexBuffer3D-object is ingesteld.
| |
Error — Parametergezondheidscontrole mislukt: wanneer het aantal driehoeken dat moet worden getekend of de firstIndex de toegestane waarden overschrijdt.
| |
RangeError — Onvoldoende indices in deze buffer: als er onvoldoende indices in de buffer zijn om het aantal te tekenen driehoeken te definiëren.
| |
Error — Aan structuur gekoppeld sample ook gekoppeld aan render: wanneer het renderdoel een structuur is en die structuur is toegewezen aan een structuurinvoer van het huidige fragmentprogramma.
| |
Error — Sample gekoppeld aan ongeldige structuur: er is een ongeldige structuur opgegeven als de invoer voor het huidige fragmentprogramma.
| |
Error — Samplerindeling komt niet overeen met structuurindeling: wanneer de structuur die is toegewezen als de invoer voor het huidige fragmentprogramma een andere indeling heeft dan is opgegeven voor het samplerregister. Bijvoorbeeld wanneer een 2D-structuur wordt toegewezen aan een kubusstructuursampler.
| |
Error — Sample koppelt niet-gedefinieerde structuur: het huidige fragmentprogramma benadert een structuurregister dat niet is ingesteld (met gebruik van setTextureAt() .
| |
Error — Dezelfde structuur vereist dezelfde samplerparameters: als een structuur voor meerdere samplerregisters wordt gebruikt, dienen alle samplers over dezelfde instellingen te beschikken. U kunt bijvoorbeeld niet een sampler instellen op beperken en een andere op insluiten.
| |
Error — Structuur gekoppeld, maar niet gebruikt: een structuur is ingesteld als shaderinvoer, maar wordt niet gebruikt.
| |
Error — Stream wordt niet gebruikt: er is een hoekpuntbuffer toegewezen aan invoer voor hoekpuntkenmerken, maar het hoekpuntprogramma verwijst niet naar het corresponderende register.
| |
Error — Stream is ongeldig: een VertexBuffer3D-object dat is toegewezen aan invoer voor een hoekpuntprogramma is geen geldig object.
| |
RangeError — Stream heeft onvoldoende hoekpunten: een hoekpuntbuffer die gegevens verschaft voor het tekenen van de opgegeven driehoeken beschikt over onvoldoende gegevens.
| |
RangeError — Stream-hoekpuntverschuivingen buiten bereik: de verschuiving die is opgegeven in een setVertexBufferAt() -aanroep is negatief of passeert het einde van de buffer.
| |
Error — Stream gelezen, maar niet ingesteld: een hoekpuntkenmerk dat wordt gebruikt door het actuele hoekpuntprogramma is niet ingesteld (met setVertexBufferAt() ).
|
Verwante API-elementen
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
De driehoeken worden gedefinieerd met de hoekpuntenbuffer en de indexbuffer. De hoekpuntenbuffer bevat de positie- en kleurgegevens voor elk hoekpunt van de driehoek. De indexbuffer bevat indexen op de hoekpuntenbuffer. Een driehoek wordt door drie indexen gedefinieerd. Een driehoek die uit de eerste drie punten in de hoekpuntenbuffer bestaat, wordt in de indexbuffer bijvoorbeeld als 0,1,2 vermeld.
In dit eenvoudige voorbeeld wordt geen 3D-transformatie uitgevoerd. Alleen objecten binnen het canonieke weergavegebied (eenheidsvolume 2x2x1) kunnen worden weergegeven en de coördinaten van de driehoeken worden zodanig gedefinieerd dat ze binnen dit gebied blijven. Bij het renderen van een gebruikelijke 3D-scène projecteert u de te renderen objecten uit het globale coördinatensysteem echter in dit weergavegebied met een orthogonale of perspectiefprojectie.
package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; public class Context3D_drawTriangles extends Sprite { public const viewWidth:Number = 320; public const viewHeight:Number = 200; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private const VERTEX_SHADER:String = "mov op, va0 \n" + //copy position to output "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; public function Context3D_drawTriangles() { stage3D = this.stage.stage3Ds[0]; stage3D.x = 10; stage3D.y = 10; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false ); //Create vertex index list for the triangles var triangles:Vector.<uint> = Vector.<uint>( [ 0, 1, 2, 0, 3, 4 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ // x, y, z r, g, b format 0, 0, 0, 1, 1, 1, -1, 1, 0, 0, 0,.5, 1, 1, 0, 0, 0, 1, 1,-1, 0, .5, 0, 0, -1,-1, 0, 1, 0, 0 ] ); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); //Clear required before first drawTriangles() call renderContext.clear( .3,.3,.3 ); //Draw the 2 triangles renderContext.drawTriangles( indexList, 0, 2 ); //Show the frame renderContext.present(); } } }
drawTrianglesInstanced | () | methode |
public function drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 20.0 |
Geef de opgegeven instantiedriehoeken weer met de huidige buffers en toestand van dit Context3D-object.
Voor elke driehoek van elke instantie worden de hoekpunten door het hoekpuntshaderprogramma verwerkt, en het oppervlak door het pixelshaderprogramma. De uitvoerkleur van het pixelprogramma voor elke pixel wordt naar het renderdoel getekend afhankelijk van de stencilbewerkingen, dieptetest en bron- en doelalfa, en de huidige overvloeimodus. Het renderdoel kan de hoofdrenderbuffer of een structuur zijn.
Als schifting (culling) ingeschakeld is, (met de methode setCulling()
), kunnen driehoeken uit de scène worden verwijderd voordat het pixelprogramma wordt uitgevoerd. Als stencil- en dieptetests zijn ingeschakeld, kunnen uitvoerpixels van het pixelprogramma worden verwijderd zonder de renderbestemming bij te werken. Bovendien kan het pixelprogramma besluiten geen kleur voor een pixel uit te voeren.
De gerenderde instantiedriehoeken worden pas weergegeven in de viewport als u de methode present()
aanroept. Na elke aanroep van present()
, moet de methode clear()
worden aangeroepen vóór de eerste aanroep van drawTrianglesInstanced()
, anders mislukt de rendering.
Wanneer enableErrorChecking
false
is, wordt deze functie direct verwerkt zonder op resultaten te wachten, en worden alleen uitzonderingen gegenereerd als deze Context3D-instantie is verwijderd of er te veel tekenaanroepen zijn. Als de toestand van de renderingcontext ongeldig is, mislukt renderen (dit wordt niet gemeld). Als de eigenschap enableErrorChecking
true
is, wordt deze functie verwerkt nadat de driehoeken zijn getekend, en worden uitzonderingen gegenereerd voor alle tekenfouten en ongeldige contexttoestanden.
Deze methode kan een uitzondering genereren als de volgorde van de geïnstantieerde buffer niet correct is ingesteld met SetVertexAt()
. Met Direct 3D 9 bijvoorbeeld, moeten de geïndexeerde geometriegegevens en het aantal te tekenen instanties altijd zijn ingesteld in stream nul met SetStreamSourceFreq()
-API.
Dit betekent dat de hoekpuntbuffer die CreateVertexBufferForInstance()
gebruikt, niet moet worden geplaatst met het minimale indexnummer wanneer deze buffer wordt gerangschikt met SetVertexBufferAt()
als invoer voor het hoekpuntshaderprogramma. De gegenereerde hoekpuntbuffer die CreateVertexBuffer()
gebruikt, moet worden geplaatst met een kleiner indexnummer dan het nummer dat is toegewezen aan CreateVertexBufferForInstance()
. In het algemeen geldt dat geometriegegevens moeten worden geplaatst voordat per-instantiegegevens worden geplaatst, met SetVertexBufferAt()
.
Parameters
indexBuffer:IndexBuffer3D — Een set hoekpuntindices die verwijzen naar de hoekpunten die moeten worden gerenderd.
| |
numInstances:int — Het aantal instanties dat moet worden weergegeven.
| |
firstIndex:int (default = 0 ) — De index van de eerste hoekpuntindex die is geselecteerd voor de rendering. Standaard 0.
| |
numTriangles:int (default = -1 ) — Het aantal driehoeken dat moet worden gerenderd. Elke driehoek gebruikt drie indices. Geef -1 door om alle driehoeken in de indexbuffer te tekenen. Standaard -1.
|
Gegenereerde uitzondering
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
| |
Error — Als deze methode te vaak wordt aangeroepen tussen aanroepen van present() . Het maximum aantal aanroepen is 32.768.
| |
Error — Vereist Standard Extended-profiel of hoger: als deze methode wordt aangeroepen wanneer het gevraagde profiel een lagere waarde heeft dan het Standard Extended-profiel.
| |
Error — Als deze methode wordt aangeroepen met negatieve numInstances.
De volgende fouten treden alleen op wanneer de eigenschap | |
Error — Eerst wissen voor tekenen: als de buffer niet is gewist sinds de laatste keer dat present() is aangeroepen.
| |
Error — Als er geen geldig Program3D-object is ingesteld.
| |
Error — Geen geldige indexbuffer ingesteld: als er geen IndexBuffer3D-object is ingesteld.
| |
Error — Parametergezondheidscontrole mislukt: wanneer het aantal driehoeken dat moet worden getekend of de firstIndex de toegestane waarden overschrijdt.
| |
RangeError — Onvoldoende indices in deze buffer: als er onvoldoende indices in de buffer zijn om het aantal te tekenen driehoeken te definiëren.
| |
Error — Aan structuur gekoppeld sample ook gekoppeld aan render: wanneer het renderdoel een structuur is en die structuur is toegewezen aan een structuurinvoer van het huidige fragmentprogramma.
| |
Error — Sample gekoppeld aan ongeldige structuur: er is een ongeldige structuur opgegeven als de invoer voor het huidige fragmentprogramma.
| |
Error — Samplerindeling komt niet overeen met structuurindeling: wanneer de structuur die is toegewezen als de invoer voor het huidige fragmentprogramma een andere indeling heeft dan is opgegeven voor het samplerregister. Bijvoorbeeld wanneer een 2D-structuur wordt toegewezen aan een kubusstructuursampler.
| |
Error — Sample koppelt niet-gedefinieerde structuur: het huidige fragmentprogramma benadert een structuurregister dat niet is ingesteld (met gebruik van setTextureAt() .
| |
Error — Dezelfde structuur vereist dezelfde samplerparameters: als een structuur voor meerdere samplerregisters wordt gebruikt, dienen alle samplers over dezelfde instellingen te beschikken. U kunt bijvoorbeeld niet een sampler instellen op beperken en een andere op insluiten.
| |
Error — Structuur gekoppeld, maar niet gebruikt: een structuur is ingesteld als shaderinvoer, maar wordt niet gebruikt.
| |
Error — Stream wordt niet gebruikt: er is een hoekpuntbuffer toegewezen aan invoer voor hoekpuntkenmerken, maar het hoekpuntprogramma verwijst niet naar het corresponderende register.
| |
Error — Stream is ongeldig: een VertexBuffer3D-object dat is toegewezen aan invoer voor een hoekpuntprogramma is geen geldig object.
| |
RangeError — Stream heeft onvoldoende hoekpunten: een hoekpuntbuffer die gegevens verschaft voor het tekenen van de opgegeven driehoeken beschikt over onvoldoende gegevens.
| |
RangeError — Stream-hoekpuntverschuivingen buiten bereik: de verschuiving die is opgegeven in een setVertexBufferAt() -aanroep is negatief of passeert het einde van de buffer.
| |
Error — Stream gelezen, maar niet ingesteld: een hoekpuntkenmerk dat wordt gebruikt door het actuele hoekpuntprogramma is niet ingesteld (met setVertexBufferAt() ).
| |
Error — Hoekpuntbufferstream bevat onvoldoende elementen voor instanties: als een hoekpuntbufferstream onvoldoende elementen bevat voor het aantal instanties.
| |
Error — Hoekpuntbufferstream voor instanties is niet correct ingesteld bij het minimale indexkenmerkenregister: Als de gegenereerde hoekpuntenbuffer die gebruikmaakt van CreateVertexBuffer() een groter indexnummer krijgt dan het nummer dat is toegewezen aan de gegenereerde hoekpuntbuffer die gebruikmaakt van CreateVertexBufferForInstance() .
|
Verwante API-elementen
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
package { import com.adobe.utils.v3.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DTriangleFace; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; import flash.geom.Matrix3D; import flash.utils.ByteArray; public class Context3D_HelloInstancedDrawing extends Sprite { private var W:int; private var H:int; private var renderContext:Context3D; private var program:Program3D; private var vertexBuffer:VertexBuffer3D; private var instanceBufferColor:VertexBuffer3D; private var instanceBufferTranslation:VertexBuffer3D; private var indexBuffer:IndexBuffer3D; private var m:Matrix3D; private var vertexShader:ByteArray; private var fragmentShader:ByteArray; public function Context3D_HelloInstancedDrawing() { if (hasEventListener(Event.ADDED_TO_STAGE)) removeEventListener(Event.ADDED_TO_STAGE, init); W = stage.stageWidth; H = stage.stageHeight; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, contextCreated); //We need to request context3D in standard extended profile as instanced drawing requires standard extended profile. stage.stage3Ds[0].requestContext3D("auto","standardExtended"); } //Note: <code>context3DCreate</code> event can happen at any time. For example, when the hardware resources are taken up by another process. private function contextCreated( event:Event ):void { var t:Stage3D = event.target as Stage3D; renderContext = t.context3D; trace( "3D driver: " + renderContext.driverInfo ); setupScene(); } private function setupScene():void { renderContext.enableErrorChecking = true; renderContext.configureBackBuffer( W, H, 2, false ); renderContext.setCulling( Context3DTriangleFace.BACK ); //create vertex buffer for geometry information of the instances (same geometry of the instances) vertexBuffer = renderContext.createVertexBuffer(3, 3); //The color and translation information varies across the instances. Use <code>createVertexBufferForInstances</code> for color and translation information. //the intancesPerElement parameter used is 1 which means that each instance will use unique element of the instances buffer //if the intancesPerElement is 3 then sets of 3 instances will use the same element of the instances buffer instanceBufferColor = renderContext.createVertexBufferForInstances(4,3,1); instanceBufferTranslation = renderContext.createVertexBufferForInstances(4,3,1); //create index buffer for the triangle indexBuffer = renderContext.createIndexBuffer(3); //create and compile program program = renderContext.createProgram(); var assembler:AGALMiniAssembler = new AGALMiniAssembler(); // VERTEX SHADER var code:String = ""; //The vertex shader code runs for every vertex of each instance. //The vertex buffers uploaded for instance data (va1,va2) are used when the vertex shader for that particular instance is being executed. code += "add vt0, va0, va2\n"; code += "mov op, vt0\n"; code += "mov v0, va1\n"; vertexShader = assembler.assemble(Context3DProgramType.VERTEX, code); //FRAGMENT SHADER code = "mov oc, v0\n"; // Compile the agal code into bytecode using agalminiassembler fragmentShader = assembler.assemble(Context3DProgramType.FRAGMENT, code); //upload program to gpu program.upload(vertexShader, fragmentShader); //geometry data for the instances var vertexData:Vector.<Number>=Vector.<Number>([ -0.3, -0.3, 0, // - 1st vertex x,y,z 0, 0.3, 1, // - 2nd vertex x,y,z 0.3, -0.3, 0 // - 3rd vertex x,y,z ]); //per instance color data var instanceColorData:Vector.<Number>=Vector.<Number>([ 1.0, 0.0, 0.0, // - 1st instance r,g,b 0.0, 1.0, 0.0, // - 2nd instance r,g,b 1.0, 1.0, 1.0, // - 3rd instance r,g,b 0.7, 0.0, 1.0 // - 4th instance r,g,b ]); //per instance translation data var instanceTranslationData:Vector.<Number>=Vector.<Number>([ -0.3, -0.3, 0.0, // - 1st instance x,y,z 0.3, 0.3, 0.0, // - 2nd instance x,y,z -0.3, 0.3, 0.0, // - 3rd instance x,y,z 0.3, -0.3, 0.0 // - 4th instance x,y,z ]); vertexBuffer.uploadFromVector(vertexData, 0, 3); instanceBufferColor.uploadFromVector(instanceColorData, 0, 4); indexBuffer.uploadFromVector(Vector.<uint>([0, 1, 2]), 0, 3); instanceBufferTranslation.uploadFromVector(instanceTranslationData, 0, 4); //pass data to program renderContext.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3); renderContext.setVertexBufferAt(1, instanceBufferColor, 0, Context3DVertexBufferFormat.FLOAT_3); renderContext.setVertexBufferAt(2, instanceBufferTranslation, 0, Context3DVertexBufferFormat.FLOAT_3); //set active program renderContext.setProgram(program); renderContext.enableErrorChecking = true; addEventListener(Event.ENTER_FRAME, render); } private function render( event:Event ):void { renderContext.clear(0.3, 0.2, 1, 1); // Clear the backbuffer by filling it with the given color //Draw three instances of the same geometry but with varying instance data specified using <code>vertexBufferForInstances</code>. renderContext.drawTrianglesInstanced(indexBuffer,4); renderContext.present(); // render the backbuffer on screen. } } }
package { import com.adobe.utils.v3.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DTriangleFace; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; import flash.geom.Matrix3D; import flash.utils.ByteArray; public class Context3D_HelloInstanceIdRegister extends Sprite { private var W:int; private var H:int; private var renderContext:Context3D; private var program:Program3D; private var vertexBuffer:VertexBuffer3D; private var instanceBufferColor:VertexBuffer3D; private var instanceBufferTranslation:VertexBuffer3D; private var indexBuffer:IndexBuffer3D; private var m:Matrix3D; private var vertexShader:ByteArray; private var fragmentShader:ByteArray; public function Context3D_HelloInstanceIdRegister() { if (hasEventListener(Event.ADDED_TO_STAGE)) removeEventListener(Event.ADDED_TO_STAGE, init); W = stage.stageWidth; H = stage.stageHeight; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, contextCreated); //We need to request context3D in standard extended profile as instanced drawing requires standard extended profile. stage.stage3Ds[0].requestContext3D("auto","standardExtended"); } //Note: <code>context3DCreate</code> event can happen at any time. For example, when the hardware resources are taken up by another process. private function contextCreated( event:Event ):void { var t:Stage3D = event.target as Stage3D; renderContext = t.context3D; trace( "3D driver: " + renderContext.driverInfo ); setupScene(); } private function setupScene():void { renderContext.enableErrorChecking = true; renderContext.configureBackBuffer( W, H, 2, false ); renderContext.setCulling( Context3DTriangleFace.BACK ); //create vertex buffer for geometry information of the instances (same geometry of the instances) vertexBuffer = renderContext.createVertexBuffer(3, 3); //The color and translation information varies across the instances. Use <code>createVertexBufferForInstances</code> for color and translation information. //the intancesPerElement parameter used is 1 which means that each instance will use unique element of the instances buffer //if the intancesPerElement is 3 then sets of 3 instances will use the same element of the instances buffer instanceBufferColor = renderContext.createVertexBufferForInstances(4,3,1); instanceBufferTranslation = renderContext.createVertexBufferForInstances(4,3,1); //create index buffer for the triangle indexBuffer = renderContext.createIndexBuffer(3); //create and compile program program = renderContext.createProgram(); //Note : for instance id support , use the latest AgalMiniAssembler from github - https://github.com/adobe-flash/graphicscorelib/blob/master/src/com/adobe/utils/v3/AGALMiniAssembler.as var assembler:AGALMiniAssembler = new AGALMiniAssembler(); // VERTEX SHADER var code:String = ""; //the vertex shader code will run for every vertex of every instance , //the vertex buffers uploaded for instance data (va1,va2) will be used when vertex shader for that particular instance is being executed //the vertex shader code below indexes the program constants matrix using iid.x. iid is a new register introduced in vertex shader for instanced drawing //it is a read only register , iid.x gives the current instance id whose shader is being executed code += "add vt0, va0, va2\n"; code += "mul vt1, vt0, vc[iid.x]\n" code += "mov op, vt1\n"; code += "mov v0, va1\n"; vertexShader = assembler.assemble(Context3DProgramType.VERTEX, code, 3); //FRAGMENT SHADER code = "mov oc, v0\n"; // Compile the agal code into bytecode using agalminiassembler fragmentShader = assembler.assemble(Context3DProgramType.FRAGMENT, code, 3); //upload program to gpu program.upload(vertexShader, fragmentShader); //geometry data for the instances var vertexData:Vector.<Number>=Vector.<Number>([ -0.3, -0.3, 0, // - 1st vertex x,y,z 0, 0.3, 1, // - 2nd vertex x,y,z 0.3, -0.3, 0 // - 3rd vertex x,y,z ]); //per instance color data var instanceColorData:Vector.<Number>=Vector.<Number>([ 1.0, 0.0, 0.0, // - 1st instance r,g,b 0.0, 1.0, 0.0, // - 2nd instance r,g,b 1.0, 1.0, 1.0, // - 3rd instance r,g,b 0.7, 0.0, 1.0 // - 4th instance r,g,b ]); //per instance translation data var instanceTranslationData:Vector.<Number>=Vector.<Number>([ -0.3, -0.3, 0.0, // - 1st instance x,y,z 0.3, 0.3, 0.0, // - 2nd instance x,y,z -0.3, 0.3, 0.0, // - 3rd instance x,y,z 0.3, -0.3, 0.0 // - 4th instance x,y,z ]); vertexBuffer.uploadFromVector(vertexData, 0, 3); instanceBufferColor.uploadFromVector(instanceColorData, 0, 4); indexBuffer.uploadFromVector(Vector.<uint>([0, 1, 2]), 0, 3); instanceBufferTranslation.uploadFromVector(instanceTranslationData, 0, 4); //pass data to program renderContext.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3); renderContext.setVertexBufferAt(1, instanceBufferColor, 0, Context3DVertexBufferFormat.FLOAT_3); renderContext.setVertexBufferAt(2, instanceBufferTranslation, 0, Context3DVertexBufferFormat.FLOAT_3); //set active program renderContext.setProgram(program); renderContext.enableErrorChecking = true; addEventListener(Event.ENTER_FRAME, render); } private function render( event:Event ):void { renderContext.clear(0.3, 0.2, 1, 1); // Clear the backbuffer by filling it with the given color var instanceScalingData:Vector.<Number>=Vector.<Number>([ 1.0, 1.0, 1.0, 1.0, // - 1st instance x,y,z,w 1.4, 1.4, 1.4, 1.0, // - 2nd instance x,y,z,w 0.6, 0.6, 0.6, 1.0, // - 3rd instance x,y,z,w 0.6, 0.6, 0.6, 1.0 ]); var m:Matrix3D = new Matrix3D(); m.copyRawDataFrom(instanceScalingData); renderContext.setProgramConstantsFromMatrix("vertex",0,m,false); //Draw three instances of the same geometry but with varying instance data specified using <code>vertexBufferForInstances</code>. renderContext.drawTrianglesInstanced(indexBuffer,4); renderContext.present(); // render the backbuffer on screen. } } }
present | () | methode |
public function present():void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Geeft de backbuffer voor rendering weer.
Als u de methode present()
aanroept, worden alle renderingbewerking sinds de laatste keer dat present()
is aangeroepen zichtbaar en wordt een nieuwe renderingcyclus gestart. Nadat u present
hebt aangeroepen, dient u clear()
aan te roepen voordat u drawTriangles()
weer aanroept. Anders wist deze functie de renderbuffer om en om naar geel en groen of wordt een uitzondering gegenereerd als enableErrorChecking
is ingesteld op true
.
Door present()
aan te roepen, wordt het renderdoel bovendien opnieuw ingesteld, net als wanneer u setRenderToBackBuffer()
aanroept.
Gegenereerde uitzondering
Error — Eerst wissen voor tekenen: als clear() niet is aangeroepen sinds de laatste aanroep van present() . (Twee opeenvolgende present() -aanroepen zijn niet toegestaan, u dient clear() aan te roepen tussen twee van deze oproepen.)
| |
Error — 3768: De Stage3D -API kan niet worden gebruikt tijdens uitvoering op de achtergrond.
|
setBlendFactors | () | methode |
public function setBlendFactors(sourceFactor:String, destinationFactor:String):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Geeft de factoren op die worden gebruikt om overvloeiing uit te voeren op de uitvoerkleur van een tekenhandeling met de bestaande kleur.
De uitvoer(bron)kleur van het pixelshaderprogramma wordt gecombineerd met de bestaande (doel)kleur op de pixel volgens de volgende formule:
resultaatkleur = (bronkleur * sourceFactor) + (doelkleur * destinationFactor)
De doelkleur is de huidige kleur in de renderingbuffer voor die pixel. Het is dus het resultaat van de meest recente clear()
-aanroep en eventuele tussenliggende drawTriangles()
-aanroepen.
Gebruik setBlendFactors()
om de factoren in te stellen die zijn gebruikt om de bron- en doelkleuren te vermenigvuldigen voordat deze werden samengevoegd. De standaardovervloeifactoren zijn sourceFactor = Context3DBlendFactor.ONE
en destinationFactor = Context3DBlendFactor.ZERO
. Dit zorgt ervoor dat de bronkleur de doelkleur overschrijft (met andere woorden er ontstaat geen overvloeiing van de twee kleuren). Voor normale alfaovervloeiing gebruikt u sourceFactor = Context3DBlendFactor.SOURCE_ALPHA
en destinationFactor = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA
.
Gebruik de constanten die zijn gedefinieerd in de klasse Context3DBlendFactor om de parameters van deze functie in te stellen.
Parameters
sourceFactor:String — De factor waarmee de bronkleur moet worden vermenigvuldigd. Wordt standaard ingesteld op Context3DBlendFactor.ONE .
| |
destinationFactor:String — De factor waarmee de doelkleur moet worden vermenigvuldigd. Wordt standaard ingesteld op Context3DBlendFactor.ZERO .
|
Gegenereerde uitzondering
Error — Ongeldige opsomming: als sourceFactor of destinationFactor niet een van de herkende waarden zijn die in de klasse Context3DBlendFactor zijn gedefinieerd.
|
Verwante API-elementen
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display3D.Context3D; import flash.display3D.Context3DBlendFactor; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.ErrorEvent; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class Context3D_setBlendMode extends Sprite { public const viewWidth:Number = 320; public const viewHeight:Number = 200; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private const VERTEX_SHADER:String = "mov op, va0 \n" + //copy position to output "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; private var sourceFactor:int = 6; private var destinationFactor:int = 4; private var blendFactors:Array = [Context3DBlendFactor.DESTINATION_ALPHA, Context3DBlendFactor.DESTINATION_COLOR, Context3DBlendFactor.ONE, Context3DBlendFactor.ONE_MINUS_DESTINATION_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_COLOR, Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.SOURCE_COLOR, Context3DBlendFactor.ZERO]; public function Context3D_setBlendMode() { this.stage.addEventListener( KeyboardEvent.KEY_DOWN, keyHandler ); stage3D = this.stage.stage3Ds[0]; stage3D.x = 10; stage3D.y = 10; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.addEventListener( ErrorEvent.ERROR, contextError ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false ); //Create vertex index list for the triangles var triangles:Vector.<uint> = Vector.<uint>( [ 0, 3 , 2, 0, 1, 3, 6, 4, 5, 5, 7, 6, 10, 8, 9, 9, 11, 10, 12, 15, 14, 12, 13, 15, 16, 17, 19, 16, 19, 18 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes const dataPerVertex:int = 7; var vertexData:Vector.<Number> = Vector.<Number>( [ // x, y, z r, g, b, a format -1, 1, 0, 1, 1, 1, .5, 0, 1, 0, 1, 1, 1, .5, -1, 0, 0, 1, 1, 1, .5, 0, 0, 0, 1, 1, 1, .5, 0, 1, 0, .8,.8,.8, .6, 1, 1, 0, .8,.8,.8, .6, 0, 0, 0, .8,.8,.8, .6, 1, 0, 0, .8,.8,.8, .6, -1, 0, 0, 1, 0, 0, .5, 0, 0, 0, 0, 1, 0, .5, -1,-1, 0, 0, 0, 1, .5, 0,-1, 0, 1, 0, 1, .5, 0, 0, 0, 0, 0, 0, .5, 1, 0, 0, 0, 0, 0, .5, 0,-1, 0, 0, 0, 0, .5, 1,-1, 0, 0, 0, 0, .5, -.8,.8, 0, .6,.4,.2,.4, .8,.8, 0, .6,.4,.2,.4, -.8,-.8, 0, .6,.4,.2,.4, .8,-.8, 0, .6,.4,.2,.4 ] ); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_4 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); render(); } private function render():void { //Clear required before first drawTriangles() call renderContext.clear( 1, 1, 1, 1 ); //Draw the back triangles renderContext.setBlendFactors( Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO ); //No blending renderContext.drawTriangles( indexList, 0, 8 ); //Set blend renderContext.setBlendFactors( blendFactors[sourceFactor], blendFactors[destinationFactor] ); //Draw the front triangles renderContext.drawTriangles( indexList, 24, 2 ); //Show the frame renderContext.present(); } private function contextError( error:ErrorEvent ):void { trace( error.errorID + ": " + error.text ); } private function keyHandler( event:KeyboardEvent ):void { switch ( event.keyCode ) { case Keyboard.NUMBER_1: if( --sourceFactor < 0 ) sourceFactor = blendFactors.length - 1; break; case Keyboard.NUMBER_2: if( ++sourceFactor > blendFactors.length - 1) sourceFactor = 0; break; case Keyboard.NUMBER_3: if( --destinationFactor < 0 ) destinationFactor = blendFactors.length - 1; break; case Keyboard.NUMBER_4: if( ++destinationFactor > blendFactors.length - 1) destinationFactor = 0; break; } trace( "Source blend factor: " + blendFactors[sourceFactor] + ", destination blend factor: " + blendFactors[destinationFactor] ); render(); } } }
setColorMask | () | methode |
public function setColorMask(red:Boolean, green:Boolean, blue:Boolean, alpha:Boolean):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt het masker in dat wordt gebruikt bij het schrijven van kleuren naar de renderingbuffer.
Alleen kleurcomponenten waarvoor de overeenkomstige kleurmaskerparameter true
is, worden bijgewerkt wanneer een kleur naar de renderingbuffer wordt geschreven. Als u bijvoorbeeld setColorMask( true, false, false, false )
aanroept, wordt alleen de rode component van een kleur naar de buffer geschreven tot u het kleurmasker opnieuw wijzigt. Het kleurmasker heeft geen invloed op het gedrag van de clear()
-methode.
Parameters
red:Boolean — stel false in om wijzigingen in het rode kanaal te blokkeren.
| |
green:Boolean — stel false in om wijzigingen in het groene kanaal te blokkeren.
| |
blue:Boolean — stel false in om wijzigingen in het blauwe kanaal te blokkeren.
| |
alpha:Boolean — stel false in om wijzigingen in het alfakanaal te blokkeren.
|
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; public class Context3D_setColorMask extends Sprite { public const viewWidth:Number = 320; public const viewHeight:Number = 200; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private const VERTEX_SHADER:String = "mov op, va0 \n" + //copy position to output "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; public function Context3D_setColorMask() { stage3D = this.stage.stage3Ds[0]; stage3D.x = 10; stage3D.y = 10; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false ); //Create vertex index list for the triangles var triangles:Vector.<uint> = Vector.<uint>( [ 0, 1, 2, 0, 3, 4 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ // x, y, z r, g, b format 0, 0, 0, 1, 1, 1, -1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,-1, 0, 1, 1, 1, -1,-1, 0, 1, 1, 1 ] ); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); renderContext.clear( .3,.3,.3,1 ); renderContext.drawTriangles( indexList, 0, 1 ); //Top triangle draws all colors, so is white renderContext.setColorMask( true, false, false, false ); //Mask all but red channel renderContext.drawTriangles( indexList, 3, 1 ); //Bottom triangle only updates red //Show the frame renderContext.present(); } } }
setCulling | () | methode |
public function setCulling(triangleFaceToCull:String):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Hiermee stelt u de schiftingmodus voor driehoeken in.
Driehoeken kunnen vroeg in de renderingpijplijn uit de scène worden verwijderd op basis van hun oriëntatie ten opzichte van het weergavevlak. Geef de hoekpuntenvolgorde op een consistente manier (rechtsom of linksom) op zoals deze wordt gezien vanaf de buitenkant van het model om de culling correct uit te voeren.
Parameters
triangleFaceToCull:String — De schiftingmodus. Gebruik een van de constanten die zijn gedefinieerd in de Context3DTriangleFace-klasse.
|
Gegenereerde uitzondering
Error — Ongeldige opsommingsfout: wanneertriangleFaceToCull niet een van de waarden is die zijn gedefinieerd in de Context3DTriangleFace-klasse.
|
Verwante API-elementen
setDepthTest | () | methode |
public function setDepthTest(depthMask:Boolean, passCompareMode:String):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt het vergelijkingstype in dat wordt gebruikt voor dieptetests.
De diepte van de bronpixeluitvoer van het pixelshaderprogramma wordt vergeleken met de huidige waarde in de dieptebuffer. Als de vergelijking wordt geëvalueerd als false
, wordt de bronpixel genegeerd. Als deze true
is, wordt de bronpixel verwerkt door de volgende stap in de renderingpijplijn, de stenciltest. Bovendien wordt de dieptebuffer bijgewerkt met de diepte van de bronpixel, zolang de depthMask
-parameter is ingesteld op true
.
Stelt de test in die gebruikt werd om dieptewaarden voor bron- en doelpixels te vergelijken. De bronpixel wordt samengesteld met de doelpixel wanneer de vergelijking true is. De vergelijkingsoperator wordt toegepast als een infixoperator tussen de bron- en doelpixelwaarden, in die volgorde.
Parameters
depthMask:Boolean — De doeldieptewaarde zal worden bijgewerkt vanaf de bronpixel indien true.
| |
passCompareMode:String — De bewerking voor de dieptevergelijkingstest. Een van de waarden van Context3DCompareMode.
|
Verwante API-elementen
setFillMode | () | methode |
public function setFillMode(fillMode:String):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 16 |
De standaardvulmodus wordt gebruikt voor de weergave. De interface is alleen beschikbaar in de desktopversie van AIR.
Parameters
fillMode:String — Als de waarde WIREFRAME is, wordt het object in een net van lijnen weergegeven. Als de waarde SOLID is, wordt het object als effen gearceerde veelhoeken weergegeven.
|
Verwante API-elementen
setProgram | () | methode |
public function setProgram(program:Program3D):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt hoekpunt- en fragmentshaderprogramma's in die vervolgens kunnen worden gebruikt voor rendering.
Parameters
program:Program3D — Het Program3D-object dat de te gebruiken hoekpunt- en fragmentprogramma's vertegenwoordigt.
|
Verwante API-elementen
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
renderContext
is een instantie van de Context3D-klasse. De programma's in dit voorbeeld zijn geschreven in AGAL (Adobe Graphics Assembly Language).
//A simple vertex program in AGAL const VERTEX_SHADER:String = "m44 op, va0, vc0 \n" + "mov v0, va1"; //A simple fragment (or pixel) program in AGAL const FRAGMENT_SHADER:String = "mov oc, v0"; var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); var programPair:Program3D; //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair );
setProgramConstantsFromByteArray | () | methode |
public function setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.1, AIR 3.1 |
Stel constanten in voor gebruik door shaderprogramma's met behulp van waarden die in een ByteArray
zijn opgeslagen.
Stelt constanten in die toegankelijk zijn via het hoekpunt- of fragmentprogramma.
Parameters
programType:String — Een van Context3DProgramType.
| |
firstRegister:int — De index van de eerste constante van het shaderprogramma die moet worden ingesteld.
| |
numRegisters:int — Het aantal registers dat moet worden ingesteld. Elk register wordt gelezen als vier zwevende waarden.
| |
data:ByteArray — Het ByteArray-bronobject
| |
byteArrayOffset:uint — Een verschuiving in de ByteArray voor lezen
|
Gegenereerde uitzondering
TypeError — kNullPointerError waarbij data is null.
| |
RangeError — kConstantRegisterOutOfBounds wanneer wordt geprobeerd om meer dan het maximumaantal shaderconstanten in te stellen.
| |
RangeError — kBadInputSize als byteArrayOffset groter is dan of gelijk is aan de lengte van data of als het aantal elementen in data - byteArrayOffset lager is dan numRegisters *16
|
Verwante API-elementen
setProgramConstantsFromMatrix | () | methode |
public function setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt constanten in voor gebruik door shaderprogramma's met behulp van waarden die in een Matrix3D
zijn opgeslagen.
Gebruik deze functie om een matrix door te geven aan een shaderprogramma. De functie stelt vier constante-registers in die door het hoekpunt- of fragmentprogramma worden gebruikt. De matrix wordt rij voor rij aan registers toegewezen. Het eerste constante-register wordt toegewezen aan de bovenste rij van de matrix. U kunt 128 registers instellen voor een hoekpuntprogramma en 28 voor een fragmentprogramma.
Parameters
programType:String — Het type shaderprogramma, Context3DProgramType.VERTEX of Context3DProgramType.FRAGMENT .
| |
firstRegister:int — De index van het eerste constante-register dat moet worden ingesteld. Aangezien een Matrix3D zestien waarden heeft, worden er vier registers ingesteld.
| |
matrix:Matrix3D — De matrix die de constante waarden bevat.
| |
transposedMatrix:Boolean (default = false ) — Indien true , worden de matrixinvoerwaarden in omgekeerde volgorde naar registers gekopieerd. De standaardwaarde is false .
|
Gegenereerde uitzondering
TypeError — Null-aanwijzerfout: wanneer matrix de waarde null heeft.
| |
RangeError — Constante-register buiten de grenzen: bij pogingen meer dan het maximaal toegestane aantal shaderconstante-registers in te stellen.
|
Meer informatie
Verwante API-elementen
setProgramConstantsFromVector | () | methode |
public function setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt de constante-invoer in voor de shaderprogramma's.
Stelt een array van constanten in die kunnen worden geopend door een hoekpunt- of fragmentshaderprogramma. Constanten die worden ingesteld in Program3D kunnen in de shaderprogramma's worden geopend als constantenregisters. Elk constantenregister bestaat uit 4 drijvende-kommawaarden (x, y, z, w). Daarom moet elk register vier invoerwaarden in de data-vector bevatten. Het aantal registers dat u voor het hoekpuntprogramma en het fragmentprogramma kunt instellen, is afhankelijk van Context3DProfile
.
Parameters
programType:String — Het type shaderprogramma, Context3DProgramType.VERTEX of Context3DProgramType.FRAGMENT .
| |
firstRegister:int — De index van het eerste constante-register dat moet worden ingesteld.
| |
data:Vector.<Number> — De constante waarden van de drijvende komma. Er moeten minstens vier numRegisters -elementen in data zijn.
| |
numRegisters:int (default = -1 ) — Het aantal constanten dat moet worden ingesteld. Geef de standaardwaarde -1 op om voldoende registers in te stellen om alle beschikbare gegevens te kunnen gebruiken.
|
Gegenereerde uitzondering
TypeError — Null-aanwijzerfout: wanneer data de waarde null heeft.
| |
RangeError — Constante-register buiten de grenzen: bij pogingen meer dan het maximaal toegestane aantal shaderconstante-registers in te stellen.
| |
RangeError — Onjuiste invoergrootte: Wanneer het aantal elementen in data minder is dan numRegisters *4
|
Meer informatie
Verwante API-elementen
setRenderToBackBuffer | () | methode |
public function setRenderToBackBuffer():void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt de backbuffer voor rendering in als het renderdoel. Opeenvolgende aanroepen van de methoden drawTriangles()
en clear()
zullen leiden tot updates van de backbuffer. Gebruik deze methode om normale rendering te hervatten na gebruik van de methode setRenderToTexture()
.
setRenderToTexture | () | methode |
public function setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt de opgegeven structuur in als het renderdoel.
Volgende aanroepen van de methoden drawTriangles()
en clear()
werken de opgegeven structuur bij in plaats van de backbuffer. Mipmaps worden automatisch gemaakt. Gebruik setRenderToBackBuffer()
om normale rendering naar de backbuffer te hervatten.
Wissen is niet nodig vóór het tekenen. Als er niet wordt gewist, blijft de inhoud van het renderen behouden. de dieptebuffer en de stencilbuffer worden ook niet gewist. Maar het wissen wordt afgedwongen bij de eerste tekening. Door present()
aan te roepen, wordt het doel opnieuw ingesteld naar de backbuffer.
Parameters
texture:flash.display3D.textures:TextureBase — De doelstructuur waarnaar moet worden gerenderd. Stel in op null om rendering naar de backbuffer te hervatten (met setRenderToBackBuffer() en present wordt het doel ook opnieuw ingesteld in de backbuffer).
| |
enableDepthAndStencil:Boolean (default = false ) — In geval van true zijn diepte- en stenciltests beschikbaar. In geval van false worden alle diepte- en stencilstatussen genegeerd voor alle volgende tekenbewerkingen.
| |
antiAlias:int (default = 0 ) — De antialiasing-kwaliteit. Gebruik 0 om antialiasing uit te schakelen. Hogere waarden verbeteren de kwaliteit van antialiasing, maar vergen ook meer berekeningen. De waarde wordt momenteel genegeerd door het mobiele platform en door de context voor softwarerendering.
| |
surfaceSelector:int (default = 0 ) — Geeft aan welk element van de structuur bijgewerkt moet worden. Structuurobjecten hebben één oppervlak, dus u dient de standaardwaarde 0 op te geven. CubeTexture-objecten hebben zes oppervlakken en dus kunt u een geheel getal tussen 0 en 5 opgeven.
| |
colorOutputIndex:int (default = 0 ) — Het uitvoerkleurregister. Moet 0 zijn voor beperkte of basislijnmodus. Anders geeft dit het uitvoerkleurregister op.
|
Gegenereerde uitzondering
ArgumentError — Voor een surfaceSelector -parameter zonder overeenkomst. De waarde moet 0 zijn voor 2D-structuren en tussen 0 en 5 liggen voor kubustoewijzingen.
| |
ArgumentError — texture is niet afgeleid van de klasse TextureBase (de klasse Texture of CubeTexture).
| |
ArgumentError — colorOutputIndex moet een geheel getal tussen 0 en 3 zijn.
| |
ArgumentError — deze aanroep vereist een Context3D die wordt gemaakt met het standaardprofiel of hoger.
|
Verwante API-elementen
setSamplerStateAt | () | methode |
public function setSamplerStateAt(sampler:int, wrap:String, filter:String, mipfilter:String):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11.6, AIR 3.6 |
Overschrijf handmatig de structuursamplerstatus.
De structuursamplerstatus wordt doorgaans ingesteld op het moment dat setProgram
wordt aangeroepen. U kunt echter de status van de structuursampler met deze functie opheffen. Als u niet wilt dat het programma de samplerstatus wijzigt, stelt u het gedeelte ignoresamnpler
in AGAL in en gebruikt u deze functie.
Parameters
sampler:int — sampler Het samplerregister dat moet worden gebruikt. Wordt toegewezen aan het samplerregister in AGAL.
| |
wrap:String — Wrappingmodus. Gedefinieerd in Context3DWrapMode . De standaardwaarde is herhalen.
| |
filter:String — Modus voor filteren van structuur. Gedefinieerd in Context3DTextureFilter . De standaardwaarde is dichtstbijzijnd.
| |
mipfilter:String — Mipmapfilter. Gedefinieerd in Context3DMipFilter . De standaardwaarde is geen.
|
Gegenereerde uitzondering
Error — sampler buiten bereik
| |
Error — wrap, filter, mipfilter slechte enum
| |
Error — Object verwijderd: als dit Context3D-object is verwijderd door het aanroepen van dispose() of omdat de onderliggende renderinghardware verloren is gegaan.
|
Verwante API-elementen
setScissorRectangle | () | methode |
public function setScissorRectangle(rectangle:Rectangle):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt een sscissor-rechthoek in, dit is een type tekenmasker. De renderer tekent alleen naar het gebied binnen de scissor-rechthoek. Scissoring heeft geen invloed op wisbewerkingen.
Geef null
door om scissoring uit te schakelen.
Parameters
rectangle:Rectangle — De rechthoek waarin moet worden getekend. Geef de positie en de afmetingen van de rechthoek op in pixels. Het nulpunt van het coördinatensysteem is de linkerbovenhoek van de viewport, waarbij positieve waarden omlaag en naar rechts toenemen (net als in het gebruikelijke Flash-coördinatensysteem voor weergave).
|
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
De driehoeken worden gedefinieerd met de hoekpuntenbuffer en de indexbuffer. De hoekpuntenbuffer bevat de positie- en kleurgegevens voor elk hoekpunt van de driehoek. De indexbuffer bevat indexen op de hoekpuntenbuffer. Een driehoek wordt door drie indexen gedefinieerd. Een driehoek die uit de eerste drie punten in de hoekpuntenbuffer bestaat, wordt in de indexbuffer bijvoorbeeld als 0,1,2 vermeld.
In dit eenvoudige voorbeeld wordt geen 3D-transformatie uitgevoerd. Alleen objecten in het canonieke weergavegebied (een kubus van 2x2x2 met de inhoud gecentreerd op de oorsprong) worden weergegeven. Bij het renderen van een standaard-3D-scène projecteert u de te renderen objecten echter in dit weergavegebied met een orthogonale of perspectiefprojectie.
package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display3D.Context3D; import flash.display3D.Context3DBlendFactor; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.TimerEvent; import flash.geom.Rectangle; import flash.ui.Keyboard; import flash.utils.Timer; public class Context3D_ScissorRectangle extends Sprite { public const viewWidth:Number = 640; public const viewHeight:Number = 480; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private const VERTEX_SHADER:String = "mov op, va0 \n" + //copy position to output "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; private var scissorOn:Boolean = false; private var toggler:Timer = new Timer( 750 ); public function Context3D_ScissorRectangle() { stage3D = this.stage.stage3Ds[0]; stage3D.x = 10; stage3D.y = 10; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); //Set up timer to turn scissoring on and off toggler.addEventListener( TimerEvent.TIMER, toggleScissor ); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false ); //Create vertex index list for the triangles var triangles:Vector.<uint> = Vector.<uint>( [ 0, 3 , 2, 0, 1, 3 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ // x, y, z r, g, b, a format -1, 1, 0, 1,0,0, 1, 1, 0, 0,0,1, -1,-1, 0, 0,1,0, 1,-1, 0, 1,0,1 ] ); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); render(); toggler.start(); } private function render():void { //Clear required before first drawTriangles() call renderContext.clear(); //Sciss a region excluding the outer 100 pixels of the viewport var scissor:Rectangle = new Rectangle( 100, 100, viewWidth - 200, viewHeight - 200 ); if( scissorOn ) renderContext.setScissorRectangle( scissor ); //on else renderContext.setScissorRectangle( null ); //off //Draw the triangles renderContext.drawTriangles( indexList, 0, 2 ); //Show the frame renderContext.present(); } private function toggleScissor( event:Event ):void { scissorOn = !scissorOn; render(); } } }
setStencilActions | () | methode |
public function setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt de stencilmodus- en bewerking in.
Een 8 bits-stencilreferentiewaarde kan met elke tekenaanroep worden gekoppeld. Tijdens rendering kan de referentiewaarde worden getest tegen de waarden die eerder in de framebuffer zijn opgeslagen. Het resultaat van de test kan de tekenactie controleren en bepalen of en hoe de opgeslagen stencilwaarde wordt bijgewerkt. Bovendien controleren de dieptetests of stenciltests worden uitgevoerd. Een mislukte dieptetest kan ook worden gebruikt om de actie te controleren die op de stencilbuffer wordt ondernomen.
In de pixelverwerkingspijplijn worden de dieptetests eerst uitgevoerd. Als de dieptetest mislukt, kan de stencilbuffer worden bijgewerkt, maar er kan geen verdere evaluatie van de stencilbufferwaarde worden uitgevoerd. Als de dieptetest slaagt, wordt de stenciltest uitgevoerd. Er kunnen andere acties worden ondernomen afhankelijk van het resultaat van de stenciltest.
De stencilreferentiewaarde wordt ingesteld met behulp van setStencilReferenceValue()
.
Parameters
triangleFace:String (default = "frontAndBack ") — De driehoekoriëntaties die zijn toegestaan om bij te dragen tot de stencilbewerking. Een van Context3DTriangleFace.
| |
compareMode:String (default = "always ") — De testoperator die wordt gebruikt om de huidige stencilreferentiewaarde te vergelijken met de doelpixelstencilwaarde. De update van de kleur en diepte van de doelpixel wordt uitgevoerd wanneer de vergelijking true is. De stencilacties worden uitgevoerd zoals aangevraagd in de volgende actieparameters. De vergelijkingsoperator wordt toegepast als een infixoperator tussen de huidige en de doelreferentiewaarden, in die volgorde (in pseudocode: als stencilReference OPERATOR stencilbuffer dan doorgifte ). Gebruik een van de constanten die zijn gedefinieerd in de Context3DCompareMode-klasse.
| |
actionOnBothPass:String (default = "keep ") — Actie die moet worden ondernomen wanneer beide diepte- en stencilvergelijkingen worden goedgekeurd. Gebruik een van de constanten die zijn gedefinieerd in de Context3DStencilAction-klasse.
| |
actionOnDepthFail:String (default = "keep ") — Actie die moet worden ondernomen wanneer dieptevergelijking mislukt. Gebruik een van de constanten die zijn gedefinieerd in de Context3DStencilAction-klasse.
| |
actionOnDepthPassStencilFail:String (default = "keep ") — Actie die moet worden ondernomen wanneer dieptevergelijking slaagt en stencilvergelijking mislukt. Gebruik een van de constanten die zijn gedefinieerd in de Context3DStencilAction-klasse.
|
Gegenereerde uitzondering
Error — Ongeldige opsommingsfout: wanneertriangleFace niet een van de waarden is die zijn gedefinieerd in de Context3DTriangleFace-klasse.
| |
Error — Ongeldige opsommingsfout: wanneercompareMode niet een van de waarden is die zijn gedefinieerd in de Context3DCompareMode-klasse.
| |
Error — Ongeldige opsommingsfout: wanneer actionOnBothPass , actionOnDepthFail of actionOnDepthPassStencilFail niet een van de waarden is die is gedefinieerd in de Context3DStencilAction-klasse.
|
Verwante API-elementen
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
- Wis de stencilbuffer naar 0.
- Stel de stencilhandeling in op toenemen wanneer de stenciltest slaagt.
- Stel de stencilreferentiewaarde in op 0.
- Teken het driehoekige masker. Wanneer de driehoek wordt getekend, slaagt de stenciltest omdat de buffer is gewist naar 0 en de referentiewaarde 0 is. Het resultaat is dat de stencilbuffer wordt verhoogd naar 1 in het gebied waar het driehoekmasker wordt getekend.
- Wijzig de stencilhandeling definitief, zodat volgende tekenbewerkingen de stencilbuffer niet wijzigen.
- Teken een driehoek van volledige schermgrootte (met verschillende kleuren). Aangezien de stencilreferentiewaarde nog steeds 0 is, mislukt de stenciltest in het gemaskeerde gebied. De rechthoek wordt dus overal getekend, maar niet in het gemaskeerde gebied.
- Wijzig de stencilreferentiewaarde in 1.
- Teken nog een rechthoek van volledige schermgrootte (rood). De stenciltest mislukt nu overal, behalve in het gemaskeerde gebied dat immers is verhoogd tot 1. De rechthoek wordt dus alleen in het gemaskeerde gebied getekend.
Plaats de muis boven het voorbeeld om de belangrijkste stappen in de juiste volgorde weer te geven.
package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Sprite; import flash.display.Stage3D; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display3D.Context3D; import flash.display3D.Context3DBlendFactor; import flash.display3D.Context3DCompareMode; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DStencilAction; import flash.display3D.Context3DTriangleFace; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.geom.Rectangle; import flash.text.TextField; import flash.text.TextFormat; import flash.ui.Keyboard; import flash.utils.Timer; public class Context3D_Stencil extends Sprite { public const viewWidth:Number = 350; public const viewHeight:Number = 240; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private const VERTEX_SHADER:String = "mov op, va0 \n" + //copy position to output "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; public function Context3D_Stencil() { stage3D = this.stage.stage3Ds[0]; stage3D.x = 10; stage3D.y = 10; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); non3DSetup(); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, true ); //Create vertex index list for the triangles var triangles:Vector.<uint> = Vector.<uint>( [ 0, 3, 2, 0, 1, 3, 4, 7, 6, 4, 5, 7, 8, 9, 10 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ //x, y, z r,g,b format -1, 1, 0, 1,0,0, 1, 1, 0, 0,0,1, -1,-1, 0, 0,1,0, 1,-1, 0, 1,0,1, -1, 1, 0, .5,0,0, 1, 1, 0, .5,0,0, -1,-1, 0, .5,0,0, 1,-1, 0, .5,0,0, 0, .7,.1, 0,0,0, -.7,-.7,.1, 0,0,0, .7,-.7,.1, 0,0,0 ]); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); render(); } private function render():void { //Clear, setting stencil to 0 renderContext.clear( .3, .3, .3, 1, 1, 0 ); //Draw stencil, incrementing the stencil buffer value renderContext.setStencilReferenceValue( 0 ); renderContext.setStencilActions( Context3DTriangleFace.FRONT_AND_BACK, Context3DCompareMode.EQUAL, Context3DStencilAction.INCREMENT_SATURATE ); if( state > 0 ) renderContext.drawTriangles( indexList, 12, 1 ); //Change stencil action when stencil passes so stencil buffer is not changed renderContext.setStencilActions( Context3DTriangleFace.FRONT_AND_BACK, Context3DCompareMode.EQUAL, Context3DStencilAction.KEEP ); //Draw quad -- doesn't draw where stencil has already drawn if( state > 1 ) renderContext.drawTriangles( indexList, 0, 2 ); //Change the reference to 1 so this quad only draws into stenciled area renderContext.setStencilReferenceValue( 1 ); if( state > 2 ) renderContext.drawTriangles( indexList, 6, 2 ); //Show the frame renderContext.present(); } //The rest of the code is for the example UI and timer private function doState( event:TimerEvent ):void { switch (state) { case 0: description.text = "Draw triangle with stencil action == increment"; state = 1; break; case 1: description.text = "Draw the first plane where stencil == 0"; state = 2; break; case 2: description.text = "Draw second plane where stencil == 1"; state = 3; break; case 3: description.text = "Clear, setting stencil to 0"; state = 0; break; default: description.text = ""; state = 0; } render(); } private var state:int = 3; private var stateTimer:Timer = new Timer( 1250 ); private var description:TextField = new TextField(); private function non3DSetup():void { //Setup timer to animate the stages of drawing the scene stateTimer.addEventListener( TimerEvent.TIMER, doState ); this.stage.addEventListener( MouseEvent.MOUSE_OVER, function(event:Event):void{stateTimer.start()} ); this.stage.addEventListener( MouseEvent.MOUSE_OUT, function(event:Event):void{stateTimer.stop()} ); description.height = 30; description.width = viewWidth; this.addChild( description ); description.y = viewHeight + 15; description.defaultTextFormat = new TextFormat( null, 18, 0xffffff ); description.text = "Mouse over to view."; //Allows mouse-over events var coverSprite:Sprite = new Sprite(); coverSprite.graphics.beginFill( 0, .01 ) coverSprite.graphics.lineTo( stage.stageWidth, 0 ); coverSprite.graphics.lineTo( stage.stageWidth, stage.stageHeight ); coverSprite.graphics.lineTo( 0, stage.stageHeight ); coverSprite.graphics.lineTo( 0, 0 ); this.addChild( coverSprite ); } } }
setStencilReferenceValue | () | methode |
public function setStencilReferenceValue(referenceValue:uint, readMask:uint = 255, writeMask:uint = 255):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Stelt de stencilvergelijkingswaarde in die wordt gebruikt voor stenciltests.
Alleen de laagste 8 bits van de referentiewaarde worden gebruikt. De stencilbufferwaarde is ook 8 bits lang. Gebruik het readMask
en writeMask
om de stencilbuffer te gebruiken als een bitveld.
Parameters
referenceValue:uint — Een 8 bits-referentiewaarde die wordt gebruikt in vergelijkingstests voor referentiewaarden.
| |
readMask:uint (default = 255 ) — een 8-bits masker die wordt toegepast zowel op de huidige stencilbufferwaarde als op de referentiewaarde vóór de vergelijking.
| |
writeMask:uint (default = 255 ) — een 8-bits masker die wordt toegepast op de referentiewaarde voordat de stencilbuffer wordt bijgewerkt.
|
Verwante API-elementen
setTextureAt | () | methode |
public function setTextureAt(sampler:int, texture:flash.display3D.textures:TextureBase):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Geeft de structuur aan die moet worden gebruikt voor een structuurinvoerregister van een fragmentprogramma.
Een fragmentprogramma kan de informatie in maximaal acht structuurobjecten lezen. Gebruik deze functie om een Texture- of CubeTexture-object toe te wijzen aan een van de samplerregisters die worden gebruikt door het fragmentprogramma.
Opmerking: als u het actieve fragmentprogramma wijzigt (met setProgram
) in een shader die minder structuren gebruikt, stelt u de niet-gebruikte registers in op null
:
setTextureAt( 7, null );
Parameters
sampler:int — De samplerregisterindex, een waarde tussen 0 en 7.
| |
texture:flash.display3D.textures:TextureBase — Het structuurobject dat u beschikbaar wilt maken, hetzij een Texture- of een CubeTexture-instantie.
|
Meer informatie
Verwante API-elementen
CubeTexture
setVertexBufferAt | () | methode |
public function setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | Flash Player 11, AIR 3 |
Geeft op welke hoekpuntgegevenscomponenten overeenkomen met één invoerwaarde voor hoekpuntshaderprogramma's.
Gebruik de setVertexBufferAt
-methode om vast te stellen welke componenten van de gegevens die zijn gedefinieerd voor elk hoekpunt in een VertexBuffer3D-buffer tot welke invoerwaarden van het hoekpuntprogramma behoren. De ontwikkelaar van het hoekpuntprogramma bepaalt hoeveel gegevens nodig zijn per hoekpunt. Deze gegevens worden toegewezen van 1 of meer VertexBuffer3D
-stream(s) naar de kenmerkenregisters van de hoekpuntshader.
De kleinste eenheid gegevens die door de hoekpuntshader worden gebruikt zijn 32 bits-gegevens. Offsets in de hoekpuntenstream worden opgegeven in meervouden van 32 bits.
Zo kan een programmeur elk hoekpunt bijvoorbeeld definiëren met de volgende gegevens:position: x float32 y float32 z float32 color: r unsigned byte g unsigned byte b unsigned byte a unsigned byteIn de veronderstelling dat het hoekpunt is gedefinieerd in het VertexBuffer3D-object
buffer
, kan dit met de volgende code worden toegewezen aan een hoekpuntshader:
setVertexBufferAt( 0, buffer, 0, Context3DVertexBufferFormat.FLOAT_3 ); // attribute #0 will contain the position information setVertexBufferAt( 1, buffer, 3, Context3DVertexBufferFormat.BYTES_4 ); // attribute #1 will contain the color information
Parameters
index:int — De index van het kenmerkenregister in de hoekpuntshader (0 tot en met 7).
| |
buffer:VertexBuffer3D — De buffer die de bronhoekpuntgegevens bevat die in de hoekpuntshader moeten worden ingevoerd.
| |
bufferOffset:int (default = 0 ) — Een offset van het begin van de gegevens voor één hoekpunt waarbij moet worden begonnen met lezen van dit kenmerk. In het bovenstaande voorbeeld hebben de positiegegevens een offset van 0 omdat dit het eerste kenmerk is. De kleur heeft een offset van 3, omdat het kleurkenmerk volgt op de drie 32-bits waarden voor positie. De offset wordt opgegeven in eenheden van 32 bits.
| |
format:String (default = "float4 ") — Een waarde van de Context3DVertexBufferFormat-klasse die het gegevenstype van dit kenmerk opgeeft.
|
Gegenereerde uitzondering
Error — Ongeldige opsomming: wanneer de indeling niet een van de waarden is die zijn gedefinieerd in de Context3DVertexBufferFormat-klasse.
| |
RangeError — Kenmerkenregister buiten bereik: wanneer de parameter index buiten het bereik van 0 tot en met 7 valt. (Een shader kan maximaal acht registers voor hoekpuntkenmerken gebruiken.)
|
Meer informatie
Verwante API-elementen
package { import com.adobe.utils.AGALMiniAssembler; import com.adobe.utils.PerspectiveMatrix3D; import flash.display.Sprite; import flash.display.Stage3D; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DTriangleFace; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.events.ErrorEvent; import flash.events.Event; import flash.geom.Matrix3D; import flash.geom.Vector3D; public class Context3DExample extends Sprite { public const viewWidth:Number = 320; public const viewHeight:Number = 200; public const zNear:Number = 1; public const zFar:Number = 500; public const fov:Number = 45; private var stage3D:Stage3D; private var renderContext:Context3D; private var indexList:IndexBuffer3D; private var vertexes:VertexBuffer3D; private var projection:PerspectiveMatrix3D = new PerspectiveMatrix3D(); private var model:Matrix3D = new Matrix3D(); private var view:Matrix3D = new Matrix3D(); private var finalTransform:Matrix3D = new Matrix3D(); //For rotating the cube private const pivot:Vector3D = new Vector3D(); private const VERTEX_SHADER:String = "m44 op, va0, vc0 \n" + // 4x4 matrix transform "mov v0, va1"; //copy color to varying variable v0 private const FRAGMENT_SHADER:String = "mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler(); private var programPair:Program3D; public function Context3DExample() { this.stage.scaleMode = StageScaleMode.NO_SCALE; this.stage.align = StageAlign.TOP_LEFT; this.stage.nativeWindow.activate(); //AIR only stage3D = this.stage.stage3Ds[0]; stage3D.x = 10; stage3D.y = 10; //Add event listener before requesting the context stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated ); stage3D.addEventListener( ErrorEvent.ERROR, contextCreationError ); stage3D.requestContext3D( Context3DRenderMode.AUTO ); //Compile shaders vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false ); fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false ); } //Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process private function contextCreated( event:Event ):void { renderContext = Stage3D( event.target ).context3D; trace( "3D driver: " + renderContext.driverInfo ); setupScene(); } private function setupScene():void { renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false ); renderContext.setCulling( Context3DTriangleFace.BACK ); //Create vertex index list for the triangles forming a cube var triangles:Vector.<uint> = Vector.<uint>( [ 2,1,0, //front face 3,2,0, 4,7,5, //bottom face 7,6,5, 8,11,9, //back face 9,11,10, 12,15,13, //top face 13,15,14, 16,19,17, //left face 17,19,18, 20,23,21, //right face 21,23,22 ] ); indexList = renderContext.createIndexBuffer( triangles.length ); indexList.uploadFromVector( triangles, 0, triangles.length ); //Create vertexes - cube faces do not share vertexes const dataPerVertex:int = 6; var vertexData:Vector.<Number> = Vector.<Number>( [ // x,y,z r,g,b format 0,0,0, 1,0,0, //front face 0,1,0, 1,0,0, 1,1,0, 1,0,0, 1,0,0, 1,0,0, 0,0,0, 0,1,0, //bottom face 1,0,0, 0,1,0, 1,0,1, 0,1,0, 0,0,1, 0,1,0, 0,0,1, 1,0,0, //back face 1,0,1, 1,0,0, 1,1,1, 1,0,0, 0,1,1, 1,0,0, 0,1,1, 0,1,0, //top face 1,1,1, 0,1,0, 1,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,1, 0,0,1, //left face 0,1,0, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 1,1,0, 0,0,1, //right face 1,1,1, 0,0,1, 1,0,1, 0,0,1, 1,0,0, 0,0,1 ] ); vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex ); vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex ); //Identify vertex data inputs for vertex program renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color //Upload programs to render context programPair = renderContext.createProgram(); programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode ); renderContext.setProgram( programPair ); //Set up 3D transforms projection.perspectiveFieldOfViewRH( fov, viewWidth/viewHeight, zNear, zFar ); view.appendTranslation( 0, 0, -2 ); //Move view back model.appendTranslation( -.5, -.5, -.5 ); //center cube on origin this.stage.addEventListener( Event.ENTER_FRAME, render ); } private function render( event:Event ):void { //Rotate model on each frame model.appendRotation( .5, Vector3D.Z_AXIS, pivot ); model.appendRotation( .5, Vector3D.Y_AXIS, pivot ); model.appendRotation( .5, Vector3D.X_AXIS, pivot ); //Combine transforms finalTransform.identity(); finalTransform.append( model ); finalTransform.append( view ); finalTransform.append( projection ); //Pass the final transform to the vertex shader as program constant, vc0 renderContext.setProgramConstantsFromMatrix( Context3DProgramType.VERTEX, 0, finalTransform, true ); //Clear is required before drawTriangles on each frame renderContext.clear( .3,.3,.3 ); //Draw the 12 triangles that make up the cube renderContext.drawTriangles( indexList, 0, 12 ); //Show the frame renderContext.present(); } private function contextCreationError( error:ErrorEvent ):void { trace( error.errorID + ": " + error.text ); } } }
Wed Jun 13 2018, 11:42 AM Z