Paket | flash.display3D |
Klass | public final class Context3D |
Arv | Context3D EventDispatcher Object |
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ett återgivningssammanhang innehåller en rityta och associerade resurser och lägen. När det är möjligt används maskinvarans grafikprocessorsenhet (GPU-enheten) för återgivningssammanhanget. I andra fall kommer program att användas för återgivningssammanhanget. (Om återgivning med Context3D inte stöds på en plattform, kommer stage3Ds
-egenskapen för scenobjektet att innehålla en tom lista.)
Återgivningssammanhanget för Context3D är ett programeringsbart tillvägagångssätt som påminner mycket om OpenGL ES 2, men det är anpassat så att det är kompatibelt med ett antal maskinvaru- och GPU-gränssnitt. Trots att det är avsett för 3D-grafik tillåter inte återgivningstillvägagångssättet att återgivningen är tredimensionell. Du kan emellertid skapa en 2D-återgivning genom att ange rätt vertex- och pixelfragmentprogram. För både 3D- och 2D-fallen är triangeln den enda geometriska primitiven som stöds.
Hämta en instans av Context3D-klassen genom att anropa metoden requestContext3D()
för ett Stage3D-objekt. Ett begränsat antal Context3D-objekt kan finnas per scen; ett för varje Stage3D i Stage.stage3Ds
-listan. När ett sammanhang skapas, skickar Stage3D-objektet en context3DCreate
-händelse. Ett återgivningssammanhang kan när som helst förstöras och återskapas, till exempel när ett annat program som använder GPU-enheten kommer i fokus. Koden ska anpassas så att flera context3DCreate
-händelser kan tas emot. Placera återgivningsområdet på scenen med egenskaperna x
och y
för den associerade Stage3D-instansen.
Följande steg är vanliga för återgivning och visning på en scen (sedan ett Context3D-objekt hämtats):
- Konfigurera attributen för huvudvisningsbufferten genom att anropa
configureBackBuffer()
. - Skapa och initiera återgivningsresurser såsom:
- Vertex- och indexbuffertar som definierar scenens geometri
- Vertex- och pixelprogram (skuggningsprogram) för återgivning av scenen
- Texturer
- Återgivning av en bildruta:
- Ställ in ett återgivningsläge som är korrekt för ett objekt eller en samling med objekt på scenen.
- Anropa metoden
drawTriangles()
för att återge en uppsättning trianglar. - Ändra återgivningsläge för nästa grupp med objekt.
- Anropa
drawTriangles()
för att rita upp trianglarna som definierar objekten. - Upprepa proceduren tills hela scenen är återgiven.
- Anropa metoden
present()
för att visa återgivningen på scenen.
Följande begränsningar gäller för återgivning:
Resursbegränsningar:
Resurs | Antal tillåtna | Totalt minne |
---|---|---|
Vertex-buffertar
| 4096 | 256 MB |
Index-buffertar
| 4096 | 128 MB |
Program
| 4096 | 16 MB |
Texturer
| 4096 | 128 MB |
Kubtexturer
| 4096 | 256 MB |
AGAL-begränsningar: 200 opkoder per program.
Ritanropsbegränsningar: 32 768 drawTriangles()
-anrop för varje present()
-anrop.
Följande begränsningar gäller texturer:
Texturbegränsningar för 32-bitars AIR:
Textur | Maximal storlek | Totalt GPU-minne |
---|---|---|
Normal textur (under utökad baslinje)
| 2 048 x 2 048 | 512 MB |
Normal textur (utökad baslinje och ovanför)
| 4 096 x 4 096 | 512 MB |
Rektangulär textur (under utökad baslinje)
| 2 048 x 2 048 | 512 MB |
Rektangulär textur (utökad baslinje och ovanför)
| 4 096 x 4 096 | 512 MB |
Kubtextur
| 1 024 x 1 024 | 256 MB |
Texturbegränsningar för 64-bitars AIR (datorer):
Textur | Maximal storlek | Totalt GPU-minne |
---|---|---|
Normal textur (under utökad baslinje)
| 2 048 x 2 048 | 512 MB |
Normal textur (baslinjen utökas till standard)
| 4 096 x 4 096 | 512 MB |
Normal textur (utökad standard och högre)
| 4 096 x 4 096 | 2048 MB |
Rektangulär textur (under utökad baslinje)
| 2 048 x 2 048 | 512 MB |
Rektangulär textur (baslinjen utökas till standard)
| 4 096 x 4 096 | 512 MB |
Rektangulär textur (utökad standard och högre)
| 4 096 x 4 096 | 2048 MB |
Kubtextur
| 1 024 x 1 024 | 256 MB |
512 MB är den absoluta gränsen för texturer, inklusive det texturminne som krävs för mipmappar. För kubtexturer är minnesgränsen dock 256 MB.
Du kan inte skapa Context3D-objekt med Context3D-konstruktorn. Det konstrueras och är tillgängligt som en egenskap för Stage3D-instansen. Klassen Context3D kan användas både på stationära och mobila plattformar, både i Flash Player och AIR.
Relaterade API-element
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
Egenskap | Definieras med | ||
---|---|---|---|
backBufferHeight : int [skrivskyddad]
Anger höjden på bakåtbufferten, som kan ändras av ett lyckat anrop till metoden configureBackBuffer(). | Context3D | ||
backBufferWidth : int [skrivskyddad]
Anger bredden på bakåtbufferten, som kan ändras av ett lyckat anrop till metoden configureBackBuffer(). | Context3D | ||
constructor : Object
En referens till klassobjektet eller konstruktorfunktionen för en given objektinstans. | Object | ||
driverInfo : String [skrivskyddad]
Den typ av drivrutin för grafikbibliotek som används av det här återgivningssammanhanget. | Context3D | ||
enableErrorChecking : Boolean
Anger om fel som upptäcks vid återgivningen rapporteras till programmet. | Context3D | ||
maxBackBufferHeight : int
Anger högsta tillåtna höjd på bakåtbufferten. | Context3D | ||
maxBackBufferWidth : int
Anger högsta tillåtna bredd på bakåtbufferten. | Context3D | ||
profile : String [skrivskyddad]
Den funktionsstödda profilen som används av det här Context3D-objektet. | Context3D | ||
supportsVideoTexture : Boolean [statisk] [skrivskyddad]
Anger om Context3D har stöd för videotextur. | Context3D | ||
totalGPUMemory : Number [skrivskyddad]
Returnerar det totala GPU-minnet som tilldelats av Stage3D-datastrukturer i ett program. När ett GPU-resursobjekt skapas, lagras minnet som används i Context3D. | Context3D |
Metod | Definieras med | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Registrerar ett händelseavlyssnarobjekt för ett EventDispatcher-objekt så att avlyssnaren får meddelanden om händelser. | 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
Rensar färg-, djup- och stencil-bufferterna som är associerade med detta Context3D-objekt och fyller dem med de angivna värdena. | Context3D | ||
configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
Anger visningsportdimensioner och andra attribut för återgivningsbufferten. | Context3D | ||
createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
Skapar ett CubeTexture-objekt. | Context3D | ||
Skapar ett IndexBuffer3D-objekt. | Context3D | ||
Skapar ett Program3D-objekt. | Context3D | ||
createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
Skapar ett RectangleTexture-objekt. | Context3D | ||
createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
Skapar ett Texture-objekt. | Context3D | ||
createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Skapar ett VertexBuffer3D-objekt. | Context3D | ||
createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Skapar ett VertexBuffer3D-objekt för instansdata. | Context3D | ||
Skapar ett VideoTexture-objekt. | Context3D | ||
Skickar en händelse till händelseflödet. | EventDispatcher | ||
Frigör alla resurser och interna lagerutrymmen som har att göra med detta Context3D. | Context3D | ||
Ritar upp den aktuella återgivningsbufferten i en bitmapp. | Context3D | ||
Återge de angivna trianglarna med hjälp av de aktuella buffertarna och läget för detta Context3D-objekt. | Context3D | ||
drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
Återge de angivna triangelinstanserna med hjälp av de aktuella bufferterna och läget för Context3D-objektet. | Context3D | ||
Kontrollerar om EventDispatcher-objektet har några avlyssnare registrerade för en viss typ av händelse. | EventDispatcher | ||
Anger om det finns en egenskap angiven för ett objekt. | Object | ||
Anger om en instans av klassen Object finns i prototypkedjan för objektet som anges som parameter. | Object | ||
Visar bakåtåtergivningsbufferten. | Context3D | ||
Anger om den angivna egenskapen finns och är uppräkningsbar. | Object | ||
Tar bort en avlyssnare från EventDispatcher-objektet. | EventDispatcher | ||
Anger de faktorer som används för att blanda utdatafärgen för en ritoperation med den befintliga färgen. | Context3D | ||
Ställer in masken som används när färger skrivs till återgivningsbufferten. | Context3D | ||
Ställ in culling-läge för triangel. | Context3D | ||
Anger den jämförelsetyp som används för djuptestning. | Context3D | ||
Ange fyllningsläget som används för återgivning. | Context3D | ||
Ställer in vertex- och fragment-skuggningsprogram som ska användas för efterföljande återgivning. | Context3D | ||
setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
Ange konstanter som ska användas av skuggningsprogram med värden som lagras i en ByteArray. | Context3D | ||
setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Ställer in konstanter som ska användas i skuggningsprogram med hjälp av värden lagrade i ett Matrix3D. | Context3D | ||
setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
Ställer in konstantindata för skuggningsprogrammen. | Context3D | ||
Anger tillgänglighet för en dynamisk egenskap för slingåtgärder. | Object | ||
Ställer in bakåtåtergivningsbufferten som återgivningsmålet. | Context3D | ||
setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
Anger den angivna texturen som återgivningsmål. | Context3D | ||
Åsidosätt textursamplerläget manuellt. | Context3D | ||
Ställer in en scissor-rektangel, vilket är en typ av ritmask. | Context3D | ||
setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
Ställer in stencilläge och åtgärd. | Context3D | ||
Ställer in stenciljämförelsevärdet som ska användas för stenciltester. | Context3D | ||
Anger texturen som ska användas för ett texturinvärdesregister för ett fragment-program. | Context3D | ||
setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
Anger vilka vertex-datakomponenter som motsvarar ett enskilt invärde för vertex-skuggningsprogram. | Context3D | ||
Returnerar det här objektets strängrepresentation, formaterad i enlighet med språkspecifika konventioner. | Object | ||
Returnerar det angivna objektets strängbeteckning. | Object | ||
Returnerar det angivna objektets primitiva värde. | Object | ||
Kontrollerar om en händelseavlyssnare är registrerad för det här EventDispatcher-objektet eller något av dess överordnade objekt för den angivna händelsetypen. | EventDispatcher |
backBufferHeight | egenskap |
backBufferHeight:int
[skrivskyddad] Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 15, AIR 15 |
Anger höjden på bakåtbufferten, som kan ändras av ett lyckat anrop till metoden configureBackBuffer()
. Höjden kan ändras när webbläsarens zoomningsfaktor ändras, om wantsBestResolutionOnBrowserZoom
har angetts som true
i det senaste lyckade anropet till metoden configureBackBuffer()
. Höjdändringen kan identifieras genom att en händelseavlyssnare registreras för händelsen browserZoomChange.
Implementering
public function get backBufferHeight():int
Relaterade API-element
backBufferWidth | egenskap |
backBufferWidth:int
[skrivskyddad] Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 15, AIR 15 |
Anger bredden på bakåtbufferten, som kan ändras av ett lyckat anrop till metoden configureBackBuffer()
. Bredden kan ändras när webbläsarens zoomningsfaktor ändras, om wantsBestResolutionOnBrowserZoom
har angetts som true
i det senaste lyckade anropet till metoden configureBackBuffer()
. Breddändringen kan identifieras genom att en händelseavlyssnare registreras för händelsen browserZoomChange.
Implementering
public function get backBufferWidth():int
Relaterade API-element
driverInfo | egenskap |
driverInfo:String
[skrivskyddad] Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Den typ av drivrutin för grafikbibliotek som används av det här återgivningssammanhanget. Anger om återgivningen använder ett program, en DirectX-drivrutin eller en OpenGL-drivrutin. Dessutom indikeras om maskinvaruåtergivning misslyckades. Om maskinvaruåtergivning misslyckas kommer programvaruåtergivning att användas i Flash Player för Stage3D och driverInfo
innehåller ett av följande värden:
- "Software Hw_disabled=userDisabled" – Kryssrutan för aktivering av maskinvaruacceleration är inte markerad i inställningsgränssnittet för Adobe Flash Player.
- "Software Hw_disabled=oldDriver" – Det finns kända problem med maskinvarans grafikdrivrutin. En uppdatering av grafikdrivrutinen kan åtgärda detta problem.
- "Software Hw_disabled=unavailable" – Det finns kända problem med maskinvarans grafikdrivrutin eller fel i maskinvarans grafikinitiering.
- "Software Hw_disabled=explicit" – Innehållet begärde uttryckligen programvaruåtergivning genom requestContext3D.
- "Software Hw_disabled=domainMemory" - Innehållet använder domainMemory för vilket en licens krävs när det används med Stage3D maskinvaruåtergivning. Besök adobe.com/go_se/fpl.
Implementering
public function get driverInfo():String
enableErrorChecking | egenskap |
enableErrorChecking:Boolean
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger om fel som upptäcks vid återgivningen rapporteras till programmet.
När enableErrorChecking
är true
, synkroniseras metoderna clear()
och drawTriangles()
och de kan generera fel. När enableErrorChecking
är false
, är som standard metoderna clear()
, och drawTriangles()
asynkrona och inga fel rapporteras. Aktivering av felkontroll minskar återgivningsprestandan. Du ska endast aktivera felkontroll i samband med felsökning.
Implementering
public function get enableErrorChecking():Boolean
public function set enableErrorChecking(value:Boolean):void
Relaterade API-element
maxBackBufferHeight | egenskap |
maxBackBufferHeight:int
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 15, AIR 15 |
Anger högsta tillåtna höjd på bakåtbufferten. Startvärdet är systemgränsen för plattformen. Egenskapen kan anges till ett värde som är mindre än eller lika med, men inte större än, systemgränsen. Egenskapen kan anges till ett värde som är större än eller lika med, men inte mindre än, minimigränsen. Minimigränsen är ett konstant värde, 32, när bakåtbufferten inte har konfigurerats. Minimigränsen är värdet för parametern height i det senaste lyckade anropet till metoden configureBackBuffer()
efter att bakåtbufferten har konfigurerats.
Implementering
public function get maxBackBufferHeight():int
public function set maxBackBufferHeight(value:int):void
maxBackBufferWidth | egenskap |
maxBackBufferWidth:int
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 15, AIR 15 |
Anger högsta tillåtna bredd på bakåtbufferten. Startvärdet är systemgränsen för plattformen. Egenskapen kan anges till ett värde som är mindre än eller lika med, men inte större än, systemgränsen. Egenskapen kan anges till ett värde som är större än eller lika med, men inte mindre än, minimigränsen. Minimigränsen är ett konstant värde, 32, när bakåtbufferten inte har konfigurerats. Minimigränsen är värdet för parametern width i det senaste lyckade anropet till metoden configureBackBuffer()
efter att bakåtbufferten har konfigurerats.
Implementering
public function get maxBackBufferWidth():int
public function set maxBackBufferWidth(value:int):void
profile | egenskap |
supportsVideoTexture | egenskap |
totalGPUMemory | egenskap |
totalGPUMemory:Number
[skrivskyddad] Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 21, AIR 21 |
Returnerar det totala GPU-minnet som tilldelats av Stage3D-datastrukturer i ett program.
När ett GPU-resursobjekt skapas, lagras minnet som används i Context3D. Minnet innehåller indexbuffertar, vertex-buffertar, texturer (utom videotexturer) och program som skapades med detta Context3D.
API:t totalGPUMemory
returnerar det totala minnet som förbrukas av resurserna ovan. Standardvärdet som returneras är 0. Det totala GPU-minnet returneras i bytes. Informationen tillhandahålls endast i läget Direct på mobila enheter och i lägena Direct och GPU på datorer. (Om du använder <renderMode>gpu</renderMode>
på en dator ändras det till <renderMode>direct</renderMode>
)
Implementering
public function get totalGPUMemory():Number
clear | () | metod |
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
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Rensar färg-, djup- och stencil-bufferterna som är associerade med detta Context3D-objekt och fyller dem med de angivna värdena.
Ställ in mask
-parametern för att ange vilken buffert som ska rensas. Använd de konstanter som definierats i Context3DClearMask-klassen för att ställa in mask
-parametern. Använd bitvis OR-operatorn, "|", för att lägga till flera buffertar till masken (eller använd Context3DClearMask.ALL
). Vid återgivning till en bakåtbuffert måste metoden configureBackBuffer()
anropas före eventuella clear()
-anrop.
Obs! Om du anger ett parametervärde som ligger utanför det tillåtna intervallet, kommer numeriska parametervärden att klämmas ihop inom intervallet noll till ett. Detsamma gäller om stencil
är större än 0xff så ges den värdet 0xff.
Parametrar
red:Number (default = 0.0 ) — den röda komponenten i färgen med vilken färgbufferten ska rensas, i intervallet noll till ett.
| |
green:Number (default = 0.0 ) — den gröna komponenten i färgen med vilken färgbufferten ska rensas, i intervallet noll till ett.
| |
blue:Number (default = 0.0 ) — den blåa komponenten i färgen med vilken färgbufferten ska rensas, i intervallet noll till ett.
| |
alpha:Number (default = 1.0 ) — alfakomponenten i färgen med vilken färgbufferten ska rensas, i intervallet noll till ett. Alfakomponenten används inte för övertoning. Den skrivs direkt i buffertalfa.
| |
depth:Number (default = 1.0 ) — värdet med vilket djupbufferten ska rensas, i intervallet noll till ett.
| |
stencil:uint (default = 0 ) — 8-bitars värdet med vilket stencilbufferten ska rensas, i intervallet 0x00 till 0xff.
| |
mask:uint (default = 0xffffffff ) — anger vilka buffertar som ska rensas.
|
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — 3768: Programmeringsgränssnittet för Stage3D kan inte användas under bakgrundskörning.
|
Relaterade API-element
configureBackBuffer | () | metod |
public function configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger visningsportdimensioner och andra attribut för återgivningsbufferten.
Återgivningen använder dubbla buffertar. Bakåtbufferten växlas med den synliga framåtbufferten när metoden present()
anropas. Den minsta buffertstorleken är 32 x 32 pixlar. Den största storleken på bakåtbufferten begränsas av enhetens funktioner och kan också anges av användaren via egenskaperna maxBackBufferWidth
och maxBackBufferHeight
. Det tar lång tid att konfigurera bufferten. Undvik att ändra buffertstorleken och attributen under normala återgivningsoperationer.
Parametrar
width:int — bredden i pixlar på bufferten.
| |||||||||
height:int — höjden i pixlar på bufferten.
| |||||||||
antiAlias:int — ett heltalsvärde som anger den begärda kantutjämningskvaliteten. Värdet motsvarar antalet delexempel som används vid kantutjämning. Om fler delexempel används måste fler beräkningar utföras, men den relativa prestandapåverkan beror på den maskinvara som används för återgivningen. Kantutjämningstypen eller om kantutjämning utförs över huvud taget beror på enheten och återgivningsläget. Kantutjämning stöds inte av programåtergivningssammanhanget.
| |||||||||
enableDepthAndStencil:Boolean (default = true ) — false anger att ingen djup- eller stencilbuffert skapas, medan true anger att en djup- och stencilbuffert skapas. För ett AIR 3.2-program eller senare, som kompilerats med SWF-version 15 eller senare, gäller att om elementet renderMode i programbeskrivningsfilen är direct , så måste elementet depthAndStencil i programbeskrivningsfilen ha samma värde som det här argumentet. Värdet på elementet depthAndStencil är som standard false .
| |||||||||
wantsBestResolution:Boolean (default = false ) — Värdet true innebär att om enheten stöder HiDPI-skärmar försöker det tilldela en större bakåtbuffert än vad som anges i parametrarna width och height. Eftersom detta lägger till fler pixlar och potentiellt ändrar resultatet av skuggningsåtgärder är det inaktiverat som standard. Använd Stage.contentsScaleFactor för att avgöra hur mycket den inbyggda bakåtbufferten ökade.
| |||||||||
wantsBestResolutionOnBrowserZoom:Boolean (default = false ) — true anger att storleken på bakåtbufferten ska öka proportionellt efter ökningen av webbläsarens zoomningsfaktor. Inställningen av det här värdet gäller zoomning i alla webbläsare. Standardvärdet för parametern är false . Ange egenskaperna maxBackBufferWidth och maxBackBufferHeight för att begränsa storleksökningen på bakåtbufferten. Använd backBufferWidth och backBufferHeight för att fastställa den aktuella storleken på bakåtbufferten.
|
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Felaktig indatastorlek: Parametern width eller height är mindre än den minsta tillåtna storleken för bakåtbufferten eller större än den största tillåtna storleken för bakåtbufferten.
| |
Error — 3709: Flaggan depthAndStencil i programbeskrivningen måste matcha den booleska egenskapen enableDepthAndStencil som skickas till configureBackBuffer() i Context3D-objektet.
|
createCubeTexture | () | metod |
public function createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Skapar ett CubeTexture-objekt.
Använd ett CubeTexture-objekt för att skicka kubtexturbitmappar till återgivningssammanhanget och för att referera till en kubtextur under återgivning. En kubtextur består av sex lika stora fyrkantstexturer ordnade i en kubtopologi. Den är användbar för att beskriva miljömappningar.
Du kan inte skapa CubeTexture-objekt med en CubeTexture-konstruktor, utan du ska i stället använda denna metod. Sedan du skapat ett CubeTexture-objekt, skickar du texturbitmappsdata med CubeTexture-objektets uploadFromBitmapData()
-, uploadFromByteArray()
- eller uploadCompressedTextureFromByteArray()-metod
.
Parametrar
size:int — Texturens kantlängd i texeler.
| |
format:String — Texel-formatet för uppräkningslistan för Context3DTextureFormat.
Med texturkomprimering kan du lagra komprimerade texturbilder direkt på GPU:n, vilket kräver mindre GPU-minne och minnesbandbredd. Vanligtvis komprimeras komprimerade texturer offline och överförs till grafikprocessorn i komprimerat format med metoden Texture.uploadCompressedTextureFromByteArray. Flash Player 11.4 och AIR 3.4 på skrivbordsplattformar har stöd för texturkomprimering under körning, vilket kan vara praktiskt i vissa situationer, till exempel vid återgivning av dynamiska texturer från vektorgrafik. Observera att den här funktionen för tillfället inte är tillgänglig på mobila plattformar, och ett ArgumentError-fel (Felmatchat texturformat) genereras i stället. Gör så här för att använda texturkomprimering under körning: 1. Skapa texturobjektet genom att anropa metoden Context3D.createCubeTexture() och skicka antingen flash.display3D.Context3DTextureFormat.COMPRESSED eller flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA som formatparameter. 2. Använd den instans av flash.display3D.textures.Texture som returneras av createCubeTexture() och anropa antingen flash.display3D.textures.CubeTexture.uploadFromBitmapData() eller flash.display3D.textures.CubeTexture.uploadFromByteArray() för att överföra och komprimera texturen i ett steg. | |
optimizeForRenderToTexture:Boolean — Ange det som true om texturen ska användas som återgivningsmål.
| |
streamingLevels:int (default = 0 ) — Den mipmappnivå som måste läsas in innan bilden återges. Med direktuppspelning av texturer kan du läsa in och visa de minsta mip-nivåerna först och visa bilder med allt högre kvalitet efterhand som texturerna läses in. Slutanvändare kan visa bilder med lägre kvalitet i ett program medan bilderna med hög kvalitet läses in.
streamingLevels är som standard 0, vilket innebär att bilden med högst kvalitet i mipmappen måste läsas in innan bilden återges. Den här parametern har lagts till i Flash Player 11.3 och AIR 3.3. Om standardvärdet används bevaras beteendet från tidigare versioner av Flash Player och AIR. Ange Obs! Om du anger den här egenskapen som större än 0 kan det påverka minnesanvändning och prestanda. |
flash.display3D.textures:CubeTexture |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många Texture-objekt skapas eller om mängden minne som tilldelats texturer inte räcker.
| |
ArgumentError — Djuptextur är inte implementerat: Om du försöker skapa en djuptextur.
| |
ArgumentError — Texturstorleken är noll: Om parametern size inte är större än noll.
| |
ArgumentError — Texturen har inte tvåpotens: Om parametern size inte är en tvåpotens.
| |
ArgumentError — Texturen är för stor: Om parametern size är större än 1 024.
| |
Error — Det gick inte att skapa texturen: Om CubeTexture-objektet inte kunde skapas av återgivningssammanhanget (men information om orsaken saknas).
| |
ArgumentError — Ogiltig direktuppspelningsnivå: Om streamingLevels är större än eller lika med log2(size).
|
Relaterade API-element
createIndexBuffer | () | metod |
public function createIndexBuffer(numIndices:int, bufferUsage:String = "staticDraw"):IndexBuffer3D
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Skapar ett IndexBuffer3D-objekt.
Använd ett IndexBuffer3D-objekt för att skicka en uppsättning med triangelindex till återgivningssammanhanget och för att referera till den indexuppsättningen för återgivning. Varje index i indexbufferten refererar till ett motsvarande vertex i en vertex-buffert. Varje uppsättning med tre index identifierar en triangel. Skicka IndexBuffer3D-objektet till metoden drawTriangles()
för att återge en eller flera trianglar definierade i indexbufferten.
Du kan inte skapa IndexBuffer3D-objekt med klasskonstruktorn för IndexBuffer3D, utan du ska använda den här metoden i stället. Sedan du skapat ett IndexBuffer3D-objekt, skickar du indexen med IndexBuffer3D-objektets uploadFromVector()
- eller uploadFromByteArray()
-metod.
Parametrar
numIndices:int — antalet vertex som ska lagras i bufferten.
| |
bufferUsage:String (default = "staticDraw ") — den förväntade buffertanvändningen. Använd en av de konstanter som definieras i Context3DBufferUsage . Maskinvarans drivrutin kan utföra lämplig optimering när den ställs in rätt. Den här parametern är bara tillgänglig efter Flash 12/AIR 4.
|
IndexBuffer3D |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många indexbuffertar skapas eller om mängden minne som tilldelats indexbuffertar inte räcker.
| |
Error — 3768: Programmeringsgränssnittet för Stage3D kan inte användas under bakgrundskörning.
| |
ArgumentError — Bufferten är för stor: när numIndices är större än eller lika med 0xf0000.
|
Relaterade API-element
createProgram | () | metod |
public function createProgram():Program3D
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Skapar ett Program3D-objekt.
Använd ett Program3D-objekt för att skicka skuggningsprogram till återgivningssammanhanget och för att referera till skickade program under återgivning. I ett Program3D-objekt lagras två program, ett vertex-program och ett fragment-program (kallas även pixel-program). Programmen är skrivna i ett binärt shader-assembly-språk.
Du kan inte skapa Program3D-objekt med en Program3D-konstruktor, utan du ska använda den här metoden i stället. Sedan du skapat ett Program3D-objekt, skickar du programmen med Program3D-objektets upload()
-metod.
Program3D |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Antalet program överstiger 4096 eller den totala minnesstorleken överstiger 16 MB (använd dispose för att frigöra Program3D-resurser).
|
Relaterade API-element
Exempel ( Så här använder du exemplet )
renderContext
, är en instans av klassen Context3D. Programmen i exemplet har skrivits i 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 | () | metod |
public function createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11.8, AIR 3.8 |
Skapar ett RectangleTexture-objekt.
Använd ett RectangleTexture-objekt för att skicka texturbitmappar till återgivningssammanhanget och för att referera till en textur under återgivning.
Du kan inte skapa RectangleTexture-objekt med en RectangleTexture-konstruktor. Använd den här metoden i stället. När du har skapat ett RectangleTexture-objekt överför du texturbitmapparna med Texture-metoden uploadFromBitmapData()
eller uploadFromByteArray()
.
Observera att 32-bitars heltalstexturer lagras i ett packat BGRA-format för att matcha Flash BitmapData
-formatet. För flyttalstexturer används ett konventionellt RGBA-format.
Rektangeltexturer skiljer sig från vanliga 2D-texturer genom att deras bredd och höjd inte måste vara tvåpotenser. De innehåller inte heller mipmappar. De är mest användbara vid återgivning till texturer. Om en rektangeltextur används med en sampler som använder mipmappfilter eller upprepad brytning misslyckas drawTriangles-anropet. Rektangeltexturer tillåter inte heller direktuppspelning. De enda texturformat som stöds av rektangeltexturer är BGRA, BGR_PACKED och BGRA_PACKED. Komprimerade texturformat stöds inte av rektangeltexturer.
Parametrar
width:int — Texturbredden i texeler.
| |
height:int — Texturhöjden i texeler.
| |
format:String — Texel-formatet för uppräkningslistan för Context3DTextureFormat.
| |
optimizeForRenderToTexture:Boolean — Ange det som true om texturen ska användas som återgivningsmål.
|
flash.display3D.textures:RectangleTexture |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många Texture-objekt skapas eller om mängden minne som tilldelats texturer inte räcker.
| |
ArgumentError — Texturstorleken är noll: Om någon av parametrarna width eller height är mindre än eller lika med noll.
| |
ArgumentError — Texturen är för stor: Om någon av parametrarna width eller height är större än 2 048.
| |
Error — Det gick inte att skapa texturen: Om Texture-objektet inte kunde skapas av återgivningssammanhanget (men information om orsaken saknas).
| |
Error — Kräver baslinjeprofil eller en mer avancerad profil: om en rektangulär textur skapas med en begränsad baslinjeprofil.
|
Relaterade API-element
createTexture | () | metod |
public function createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Skapar ett Texture-objekt.
Använd ett Texture-objekt för att skicka texturbitmappar till återgivningssammanhanget och för att referera till en textur under återgivning.
Du kan inte skapa Texture-objekt med en Texture-konstruktor, utan du ska i stället använda denna metod. Sedan du skapat ett Texture-objekt, skickar du texturbitmappen med Texture-objektets uploadFromBitmapData()
-, uploadFromByteArray()
- eller uploadCompressedTextureFromByteArray()
-metod.
Observera att 32-bitars heltalstexturer lagras i ett packat BGRA-format för att matcha Flash BitmapData
-formatet. För flyttalstexturer används ett konventionellt RGBA-format.
Parametrar
width:int — Texturbredden i texeler.
| |
height:int — Texturhöjden i texeler.
| |
format:String — Texel-formatet för uppräkningslistan för Context3DTextureFormat.
Med texturkomprimering kan du lagra komprimerade texturbilder direkt på GPU:n, vilket kräver mindre GPU-minne och minnesbandbredd. Vanligtvis komprimeras komprimerade texturer offline och överförs till grafikprocessorn i komprimerat format med metoden Texture.uploadCompressedTextureFromByteArray. Flash Player 11.4 och AIR 3.4 på skrivbordsplattformar har stöd för texturkomprimering under körning, vilket kan vara praktiskt i vissa situationer, till exempel vid återgivning av dynamiska texturer från vektorgrafik. Observera att den här funktionen för tillfället inte är tillgänglig på mobila plattformar, och ett ArgumentError-fel (Felmatchat texturformat) genereras i stället. Gör så här för att använda texturkomprimering under körning: 1. Skapa texturobjektet genom att anropa metoden Context3D.createTexture() och skicka antingen flash.display3D.Context3DTextureFormat.COMPRESSED eller flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA som formatparameter. 2. Använd den instans av flash.display3D.textures.Texture som returneras av createTexture() och anropa antingen flash.display3D.textures.Texture.uploadFromBitmapData() eller flash.display3D.textures.Texture.uploadFromByteArray() för att överföra och komprimera texturen i ett steg. | |
optimizeForRenderToTexture:Boolean — Ange det som true om texturen ska användas som återgivningsmål.
| |
streamingLevels:int (default = 0 ) — Den mipmappnivå som måste läsas in innan bilden återges. Med direktuppspelning av texturer kan du läsa in och visa de minsta mip-nivåerna först och visa bilder med allt högre kvalitet efterhand som texturerna läses in. Slutanvändare kan visa bilder med lägre kvalitet i ett program medan bilderna med hög kvalitet läses in.
streamingLevels är som standard 0, vilket innebär att bilden med högst kvalitet i mipmappen måste läsas in innan bilden återges. Den här parametern har lagts till i Flash Player 11.3 och AIR 3.3. Om standardvärdet används bevaras beteendet från tidigare versioner av Flash Player och AIR. Ange Obs! Om du anger den här egenskapen som större än 0 kan det påverka minnesanvändning och prestanda. |
flash.display3D.textures:Texture |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många Texture-objekt skapas eller om mängden minne som tilldelats texturer inte räcker.
| |
ArgumentError — Djuptextur är inte implementerat: Om du försöker skapa en djuptextur.
| |
ArgumentError — Texturstorleken är noll: Om någon av parametrarna width eller height är mindre än eller lika med noll.
| |
ArgumentError — Texturen har inte tvåpotens: Om någon av parametrarna width eller height inte är en tvåpotens.
| |
ArgumentError — Texturen är för stor: om någon av parametrarna width eller height är större än 2 048 för baslinjeprofil och begränsad baslinjeprofil eller om någon av parametrarna width eller height är större än 4 096 för utökad baslinjeprofil eller en mer avancerad profil.
| |
Error — Det gick inte att skapa texturen: Om Texture-objektet inte kunde skapas av återgivningssammanhanget (men information om orsaken saknas).
| |
ArgumentError — Ogiltig direktuppspelningsnivå: Om streamingLevels är större än eller lika med log2(min(width,height)).
|
Relaterade API-element
createVertexBuffer | () | metod |
public function createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Skapar ett VertexBuffer3D-objekt.
Använd ett VertexBuffer3D-objekt för att skicka en uppsättning med vertex-data till återgivningssammanhanget. En vertex-buffert innehåller de data som behövs för att återge varje punkt i scengeometrin. De dataattribut som är associerade med varje vertex innehåller vanligtvis placerings-, färg- och texturkoordinater, och de används som indata för vertex-skuggningsprogrammet. Identifiera de datavärden som motsvarar en av inmatningarna till vertex-programmet som använder setVertexBufferAt()
-metoden. Du kan ange upp till sextiofyra 32-bitarsvärden för varje vertex.
Du kan inte skapa VertexBuffer3D-objekt med en VertexBuffer3D-konstruktor, utan du ska använda den här metoden i stället. Sedan du skapat ett VertexBuffer3D-objekt, skickar du indexen med VertexBuffer3D-objektets uploadFromVector()
- eller uploadFromByteArray()
-metod.
Parametrar
numVertices:int — antalet vertex som ska lagras i bufferten. Högsta antalet vertex i en enskild buffert är 65535.
| |
data32PerVertex:int — antalet 32-bitars (4 byte) datavärden associerade med varje vertex. Det högsta antalet 32-bitars dataelement per vertex är 64 (eller 256) byte. Observera att endast åtta attributregister är åtkomliga med ett vertex-skuggningsprogram vid en given tidpunkt. Använd SetVertextBufferAt() för att välja attribut från en vertex-buffert.
| |
bufferUsage:String (default = "staticDraw ") — den förväntade buffertanvändningen. Använd en av de konstanter som definieras i Context3DBufferUsage . Maskinvarans drivrutin kan utföra lämplig optimering när den ställs in rätt. Den här parametern är bara tillgänglig efter Flash 12/AIR 4
|
VertexBuffer3D |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många vertex-buffertobjekt skapas eller om mängden minne som tilldelats vertex-buffertar inte räcker.
| |
ArgumentError — Bufferten är för stor: När numVertices är större än 0x10000 eller data32PerVertex är större än 64.
| |
ArgumentError — Buffertens storlek är noll: När numVertices är noll eller data32PerVertex är noll.
| |
ArgumentError — Det gick inte att skapa buffert: Om VertexBuffer3D-objektet inte kunde skapas av återgivningssammanhanget (men ytterligare information om orsaken saknas).
| |
Error — 3768: Programmeringsgränssnittet för Stage3D kan inte användas under bakgrundskörning.
|
Relaterade API-element
Exempel ( Så här använder du exemplet )
setVertexBufferAt()
i exemplet för att ange att de första tre datapunkterna skickas till vertex-programmet som tre flyttalsvärden i va0 och att de andra tre datapunkterna skickas som va1. Ett vertex-program kan ha upp till 8 indatavärden, som även kallas vertex-attributregister, som definieras på det här sättet.
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 | () | metod |
public function createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | AIR 20.0 |
Skapar ett VertexBuffer3D-objekt för instansdata.
Använd ett VertexBuffer3D-objekt när du vill skicka en uppsättning instansdata till återgivningskontexten. Vertex-bufferten innehåller de data som behövs för att återge varje instans i scengeometrin. Vertex-buffertar med instansdata tillhandahåller attribut som är gemensamma för alla vertex i en instans och fungerar som indata till vertex-skuggningsprogrammet. Identifiera de datavärden som motsvarar en uppsättning indata för vertex-programmet med hjälp av metoden setVertexBufferAt()
. Du kan ange upp till sextiofyra 32-bitarsvärden för varje element i vertexbufferten.
Du kan inte skapa VertexBuffer3D-objekt med en VertexBuffer3D-konstruktor, utan du ska använda den här metoden i stället. Sedan du skapat ett VertexBuffer3D-objekt, skickar du indexen med VertexBuffer3D-objektets uploadFromVector()
- eller uploadFromByteArray()
-metod.
Parametrar
numVertices:int — antalet element som ska lagras i bufferten. Högsta antalet element i en enskild buffert är 65535.
| |
data32PerVertex:int — antalet 32-bitars (4 byte) datavärden som associeras med varje element. Det högsta antalet 32-bitars dataelement per vertex är 64 (eller 256) byte.
| |
instancesPerElement:int — antalet instanser som ska använda ett element i vertexbufferten.
| |
bufferUsage:String (default = "staticDraw ") — den förväntade buffertanvändningen. Använd en av de konstanter som definieras i Context3DBufferUsage . Maskinvarans drivrutin kan utföra lämplig optimering när den ställs in rätt. Den här parametern är bara tillgänglig efter Flash 12/AIR 4
|
VertexBuffer3D |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många vertex-buffertobjekt skapas eller om mängden minne som tilldelats vertex-buffertar inte räcker.
| |
ArgumentError — Bufferten är för stor: När numVertices är större än 0x10000 eller data32PerVertex är större än 64.
| |
ArgumentError — Buffertens storlek är noll: När numVertices är noll eller data32PerVertex är noll.
| |
ArgumentError — Det gick inte att skapa buffert: Om VertexBuffer3D-objektet inte kunde skapas av återgivningssammanhanget (men ytterligare information om orsaken saknas).
| |
Error — 3768: Programmeringsgränssnittet för Stage3D kan inte användas under bakgrundskörning.
| |
Error — Utökad standardprofil eller bättre krävs: om den här metoden anropas när den begärda profilen är lägre än den utökade standardprofilen.
| |
Error — Ogiltiga instanser per element: om instancesPerElement inte är större än noll.
|
Relaterade API-element
createVideoTexture | () | metod |
public function createVideoTexture():flash.display3D.textures:VideoTexture
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | AIR 17.0, Flash Player 18.0 |
Skapar ett VideoTexture-objekt.
Använd ett VideoTexture-objekt för att hämta videobildrutor som textur från NetStream- eller Camera-objektet och överföra videobildrutorna till återgivningssammanhanget.
Det går inte att skapa VideoTexture-objektet med VideoTexture-konstruktorn. Använd den här metoden i stället. När du har skapat ett VideoTexture-objekt kopplar du NetStream- eller Camera-objektet för att hämta videobildrutorna med VideoTexture-metoden attachNetStream()
eller attachCamera()
.
Tänk på att den här metoden returnerar null om systemet saknar stöd för den här funktionen.
VideoTexture innehåller inte mipmappar. Om VideoTexture används med en sampler som använder mipmappfilter eller upprepad brytning misslyckas drawTriangles-anropet. VideoTexture kan behandlas som BGRA-textur av skuggningar. Försök att instansiera VideoTexture-objektet misslyckas om Context3D har begärts med programvaruåtergivningsläge.
Högst 4 VideoTexture-objekt kan användas per Context3D-instans. På mobilenheter kan det faktiska antalet VideoTexture-objekt som stöds vara mindre än 4 på grund av plattformens begränsningar.
Returnerarflash.display3D.textures:VideoTexture |
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Resursgräns har överskridits: Om för många Texture-objekt skapas eller om mängden minne som tilldelats texturer inte räcker.
| |
Error — Det gick inte att skapa texturen: Om Texture-objektet inte kunde skapas av återgivningssammanhanget (men information om orsaken saknas).
|
dispose | () | metod |
public function dispose(recreate:Boolean = true):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Frigör alla resurser och interna lagerutrymmen som har att göra med detta Context3D.
Alla indexbuffertar, vertex-buffertar, texturer och program som skapades med detta Context3D tas bort precis som om var och en av dem anropades med dispose()
. Dessutom tas Context3D bort så att alla temporära buffertar och bakåtbufferten frigörs. Om du anropar configureBackBuffer(), clear(), drawTriangles(), createCubeTexture(), createTexture(), createProgram(), createIndexBuffer(), createVertexBuffer() eller drawToBitmapData(), efter ett dispose()-anrop, kommer ett undantag att genereras.
Varning: Om du anropar dispose() för ett Context3D-objekt medan det fortfarande finns en händelseavlyssnare för Events.CONTEXT3D_CREATE inställd på det associerade Stage3D-objektet, kommer dispose()-anropet att simulera en enhetsförlust. Ett nytt Context3D-objekt skapas då för Stage3D-objektet och Events.CONTEXT3D_CREATE-händelsen utlöses ytterligare en gång. Om detta inte är önskvärt tar du bort händelseavlyssnaren från Stage3D-objektet innan du anropar dispose() eller anger parametern recreate som false.
Parametrar
recreate:Boolean (default = true )
|
Relaterade API-element
flash.display.Stage3D
drawToBitmapData | () | metod |
public function drawToBitmapData(destination:BitmapData, srcRect:Rectangle = null, destPoint:Point = null):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | AIR 3 |
Ritar upp den aktuella återgivningsbufferten i en bitmapp.
Det aktuella innehållet i bakåtåtergivningsbufferten kopieras till ett BitmapData-objekt. Detta kan vara en långsam åtgärd som kan ta upp till en sekund. Det ska användas med stor försiktighet. Observera att denna funktion inte kopierar framåtåtergivningsbufferten (den som visas på scenen) utan den som den ritas i. Om du vill hämta den återgivna bilden på scenen ska du anropa drawToBitmapData()
omedelbart före present()
-anropet.
Från och med AIR 25 har två nya parametrar lagts till i API:t drawToBitmapData()
. Detta API har nu tre parametrar. Den första är den befintliga parametern destination:BitmapData
. Den andra parametern är srcRect:Rectangle
, som är målrektangeln för stage3D. Den tredje parametern är destPoint:Point
, som är koordinaten på målbitmappen. Parametrarna srcRect och destPoint är valfria och standardvärdena är (0,0,bitmapWidth,bitmapHeight) respektive (0,0).
När bilden ritas upp kommer den inte att skalförändras för att anpassas till bitmappen. I stället kommer innehållet att klippas till den storlek som gäller för målbitmappen.
I Flash BitmapData-objekt lagras färger som redan är multiplicerade med alfakomponenten. Om till exempel de "rena" RGB-färgskomponenterna för en pixel är (0x0A, 0x12, 0xBB) och alfakomponenten är 0x7F (.5), kommer pixeln att lagras i BitmapData-objektet med RGBA-värdena (0x05, 0x09, 0x5D, 0x7F). Du kan ställa in blandningsfaktoren så att färgerna som återges för bufferten multipliceras med alfa eller utföra åtgärden i fragmentskuggningen. Det återgivna sammanhanget validerar inte att färgerna är lagrade i ett förmultiplicerat format.
Parametrar
destination:BitmapData | |
srcRect:Rectangle (default = null )
| |
destPoint:Point (default = null )
|
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — 3768: Programmeringsgränssnittet för Stage3D kan inte användas under bakgrundskörning.
| |
Error — 3802: Om någon av parametrarna destPoint:Point eller srcRect:Rectangle ligger utanför bitmap-/stage3D-koordinaterna eller om icke-numeriska (NaN) värden används som indata.
|
Exempel ( Så här använder du exemplet )
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 | () | metod |
public function drawTriangles(indexBuffer:IndexBuffer3D, firstIndex:int = 0, numTriangles:int = -1):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Återge de angivna trianglarna med hjälp av de aktuella buffertarna och läget för detta Context3D-objekt.
För varje triangel bearbetas triangelhörnpunkterna med vertex-skuggningsprogram och triangels yta med pixel-skuggningsprogram. Färgresultatet från pixel-programmet för varje pixel ritas på återgivningsmålet beroende på stencil-operationerna, djuptestet, källan och mål-alfa samt på det aktuella blandningsläget. Målet för återgivningen kan vara huvudåtergivningsbufferten eller textur.
Om culling är aktiverad (med metoden setCulling()
), kommer trianglarna att tas bort från scenen innan pixel-programmet körs. Om stencil- och djuptestning är aktiverade, kan resultatpixlar från pixel-programmet tas bort utan att återgivningsmålet uppdateras. Dessutom kan pixel-programmet avstå från att leverera resultat för en färg för en pixel.
De återgivna trianglarna visas inte i visningsporten förrän du anropar metoden present()
. Efter varje present()
-anrop, måste metoden clear()
anropas före det första drawTriangles()
-anropet. I annat fall kommer återgivningen att misslyckas.
När enableErrorChecking
är false
, kommer den här funktionen att returneras omedelbart utan att vänta på något resultat och generera undantag bara om denna COntext3D-instans har kasserats eller om det finns alltför många ritanrop. Om återgivningssammanhangsläget är ogiltigt kommer återgivningen att misslyckas. När egenskapen enableErrorChecking
är true
, returneras den här funktionen efter det att trianglarna har ritats upp, och undantag genereras för alla ritfel och ogiltiga sammanhangslägen.
Parametrar
indexBuffer:IndexBuffer3D — en uppsättning vertex-index som refererar de vertex som ska återges.
| |
firstIndex:int (default = 0 ) — indexet för det första vertex-indexet som valts för att återges. Standard är 0.
| |
numTriangles:int (default = -1 ) — antalet trianglar som ska återges. Varje triangel upptar tre index. Skicka -1 för att rita alla trianglar i index-bufferten. Standard är -1.
|
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Om denna metod anropas alltför många gånger mellan anrop av present() . Högsta antal anrop är 32 768.
Följande fel genereras endast när egenskapen | |
Error — Behöver rensas för ritning: Om bufferten inte har rensats sedan det senaste present() -anropet.
| |
Error — Om ett giltigt Program3D-objekt inte är inställt.
| |
Error — Ingen giltig indexbuffert är inställd: Om ett IndexBuffer3D-objekt inte är inställt.
| |
Error — Tillståndskontroll av parametrar misslyckades: När antalet trianglar som ska ritas eller när firstIndex överstiger tillåtna värden.
| |
RangeError — Inte tillräckligt många index i bufferten: När det inte finns tillräckligt många index i bufferten för att definiera antalet trianglar som ska ritas.
| |
Error — Sampel som binder textur binds även till återgivning: När återgivningsmålet är en textur och när den texturen är tilldelad till ett texturinvärde i det aktuella fragment-programmet.
| |
Error — Sampel binder ogiltig textur: En ogiltig textur anges som invärde för det aktuella fragment-programmet.
| |
Error — Sampler-format matchar inte texturformat: När texturen som är tilldelad som invärdet till det aktuella fragment-programmet har ett annat format än det som är angivet för sampler-registret. När till exempel en 2D-textur är tilldelad till ett kubtextur-sampler.
| |
Error — Sampel binder odefinierad textur: Det aktuella fragment-programmet har åtkomst till ett texturregister som inte har ställts in (med setTextureAt() ).
| |
Error — Samma textur behöver samma sampler-parametrar: Om en textur används för mer än ett sampler-register, måste alla sampler ha samma inställningar. Du kan till exempel inte ange att sampler ska klämma och det andra omsluta.
| |
Error — Texturen är bunden men används inte: En textur är inställd som skuggningsindata, men den används inte.
| |
Error — Flödet används inte: En vertex-buffert är tilldelad till ett vertex-attributinvärde, men vertex-programmet refererar inte till motsvarande register.
| |
Error — Flödet är ogiltigt: Ett VertexBuffer3D-objekt som är tilldelat till ett vertex-programinvärde är inte ett giltigt objekt.
| |
RangeError — Flödet har inte tillräckligt många vertex: En vertex-buffert med data för att rita den angivna triangeln har inte tillräckligt med data.
| |
RangeError — Förskjutning för flödes-vertex utanför tillåtet intervall: Förskjutningen som anges i ett setVertexBufferAt() -anrop är negativet eller ligger utanför bufferten.
| |
Error — Flödet läses men ställs inte in: Ett vertex-attribut som används i det aktuella vertex-programmet är inte inställt (med setVertexBufferAt() ).
|
Relaterade API-element
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
Exempel ( Så här använder du exemplet )
Trianglarna är definierade med vertex-bufferten och index-bufferten. Vertex-bufferten innehåller position och färginformationen för varje triangelhörn. Index-bufferten innehåller index för vertex-bufferten. Tre index behövs för att definiera en triangel. En triangel som till exempel bestäms av de tre första punkterna i vertex-bufferten visas som 0,1,2 i index-bufferten.
I detta enkla exempel utförs inga 3D-omformningar. Endast objekt i det kanoniska visningsområdet (en 2x2x1 stor volym) kan visas och trianglarnas koordinater definieras så att de ligger innanför detta område. När emellertid en vanlig 3D-scen återges projicerar du de objekt som ska återges från världskoordinatsystemet till visningsområdet med hjälp av antingen en perspektivprojektion eller en ortografisk projektion.
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 | () | metod |
public function drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | AIR 20.0 |
Återge de angivna triangelinstanserna med hjälp av de aktuella bufferterna och läget för Context3D-objektet.
Triangelhörnpunkterna för varje triangelinstans bearbetas med vertex-skuggningsprogrammet och trianglarnas ytor bearbetas med pixelskuggningsprogram. Färgresultatet från pixel-programmet för varje pixel ritas på återgivningsmålet beroende på stencil-operationerna, djuptestet, källan och mål-alfa samt på det aktuella blandningsläget. Målet för återgivningen kan vara huvudåtergivningsbufferten eller textur.
Om culling är aktiverad (med metoden setCulling()
), kommer trianglarna att tas bort från scenen innan pixel-programmet körs. Om stencil- och djuptestning är aktiverade, kan resultatpixlar från pixel-programmet tas bort utan att återgivningsmålet uppdateras. Dessutom kan pixel-programmet avstå från att leverera resultat för en färg för en pixel.
De återgivna triangelinstanserna visas inte i visningsporten förrän du anropar metoden present()
. Efter varje present()
-anrop, måste metoden clear()
anropas före det första drawTrianglesInstanced()
-anropet, annars misslyckas återgivningen.
När enableErrorChecking
är false
, kommer den här funktionen att returneras omedelbart utan att vänta på något resultat och generera undantag bara om denna COntext3D-instans har kasserats eller om det finns alltför många ritanrop. Om återgivningssammanhangsläget är ogiltigt kommer återgivningen att misslyckas. När egenskapen enableErrorChecking
är true
, returneras den här funktionen efter det att trianglarna har ritats upp, och undantag genereras för alla ritfel och ogiltiga sammanhangslägen.
Den här metoden kan generera ett undantagsfel om den instansierade bufferten sekvenseras felaktigt med SetVertexAt()
. Med Direct3D 9 måste till exempel indexerade geometridata och antalet instanser som ska ritas alltid ställas in på ”stream zero” med API:t SetStreamSourceFreq()
.
Det innebär att vertexbufferten som skapas med CreateVertexBufferForInstance()
inte bör placeras med det lägsta indexnumret när den ordnas med SetVertexBufferAt()
som indata för vertexskuggningsprogrammet. Den vertexbuffert som genereras med CreateVertexBuffer()
måste placeras med ett lägre indexnummer än det för CreateVertexBufferForInstance()
. I allmänhet måste geometridata placeras före data per instans med SetVertexBufferAt()
.
Parametrar
indexBuffer:IndexBuffer3D — en uppsättning vertex-index som refererar de vertex som ska återges.
| |
numInstances:int — antal instanser som ska återges.
| |
firstIndex:int (default = 0 ) — indexet för det första vertex-indexet som valts för att återges. Standard är 0.
| |
numTriangles:int (default = -1 ) — antalet trianglar som ska återges. Varje triangel upptar tre index. Skicka -1 för att rita alla trianglar i index-bufferten. Standard är -1.
|
Utlöser
Error — Objekt har tagits bort: om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
| |
Error — Om denna metod anropas alltför många gånger mellan anrop av present() . Högsta antal anrop är 32 768.
| |
Error — Utökad standardprofil eller bättre krävs: om den här metoden anropas när den begärda profilen är lägre än den utökade standardprofilen.
| |
Error — Om den här metoden anropas med negativa numInstances.
Följande fel genereras endast när egenskapen | |
Error — Behöver rensas för ritning: Om bufferten inte har rensats sedan det senaste present() -anropet.
| |
Error — Om ett giltigt Program3D-objekt inte är inställt.
| |
Error — Ingen giltig indexbuffert är inställd: Om ett IndexBuffer3D-objekt inte är inställt.
| |
Error — Tillståndskontroll av parametrar misslyckades: När antalet trianglar som ska ritas eller när firstIndex överstiger tillåtna värden.
| |
RangeError — Inte tillräckligt många index i bufferten: När det inte finns tillräckligt många index i bufferten för att definiera antalet trianglar som ska ritas.
| |
Error — Sampel som binder textur binds även till återgivning: När återgivningsmålet är en textur och när den texturen är tilldelad till ett texturinvärde i det aktuella fragment-programmet.
| |
Error — Sampel binder ogiltig textur: En ogiltig textur anges som invärde för det aktuella fragment-programmet.
| |
Error — Sampler-format matchar inte texturformat: När texturen som är tilldelad som invärdet till det aktuella fragment-programmet har ett annat format än det som är angivet för sampler-registret. När till exempel en 2D-textur är tilldelad till ett kubtextur-sampler.
| |
Error — Sampel binder odefinierad textur: Det aktuella fragment-programmet har åtkomst till ett texturregister som inte har ställts in (med setTextureAt() ).
| |
Error — Samma textur behöver samma sampler-parametrar: Om en textur används för mer än ett sampler-register, måste alla sampler ha samma inställningar. Du kan till exempel inte ange att sampler ska klämma och det andra omsluta.
| |
Error — Texturen är bunden men används inte: En textur är inställd som skuggningsindata, men den används inte.
| |
Error — Flödet används inte: En vertex-buffert är tilldelad till ett vertex-attributinvärde, men vertex-programmet refererar inte till motsvarande register.
| |
Error — Flödet är ogiltigt: Ett VertexBuffer3D-objekt som är tilldelat till ett vertex-programinvärde är inte ett giltigt objekt.
| |
RangeError — Flödet har inte tillräckligt många vertex: En vertex-buffert med data för att rita den angivna triangeln har inte tillräckligt med data.
| |
RangeError — Förskjutning för flödes-vertex utanför tillåtet intervall: Förskjutningen som anges i ett setVertexBufferAt() -anrop är negativet eller ligger utanför bufferten.
| |
Error — Flödet läses men ställs inte in: Ett vertex-attribut som används i det aktuella vertex-programmet är inte inställt (med setVertexBufferAt() ).
| |
Error — Vertexbuffertströmmen innehåller inte tillräckligt många element för instanser: Om en vertexbuffertström inte innehåller tillräckligt många element för antalet instanser.
| |
Error — Vertexbuffertströmmen för instanser är felaktigt inställd med lägsta indexattribut: Om den vertexbuffert som genereras med CreateVertexBuffer() får ett högre indexnummer än den vertexbuffert som genereras med CreateVertexBufferForInstance() .
|
Relaterade API-element
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
Exempel ( Så här använder du exemplet )
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 | () | metod |
public function present():void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Visar bakåtåtergivningsbufferten.
Anrop av metoden present()
synliggör resultat från alla återgivningsåtgärder sedan senaste present()
-anropet och en ny återgivningscykel påbörjas. Efter present
-anropet måste du anropa clear()
innan du gör ytterligare ett drawTriangles()
-anrop. I annat fall kommer den här funktionen att alternativt rensa återgivningsbufferten till gult eller grönt eller, om enableErrorChecking
är true
, så kommer ett undantag att genereras.
Anrop av present()
återställer även återgivningsmålet, precis som anrop av setRenderToBackBuffer()
.
Utlöser
Error — Behöver rensa före ritning: Om clear() inte har anropats efter det föregående present() -anropet. (Två efterföljande present() -anrop är inte tillåtna utan att ett clear() -anrop görs däremellan.)
| |
Error — 3768: Programmeringsgränssnittet för Stage3D kan inte användas under bakgrundskörning.
|
setBlendFactors | () | metod |
public function setBlendFactors(sourceFactor:String, destinationFactor:String):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger de faktorer som används för att blanda utdatafärgen för en ritoperation med den befintliga färgen.
Utdatafärgen (källfärgen) för pixelskuggningsprogrammet kombineras med befintlig färg (målfärg) på den pixeln enligt följande formel:
resultatfärg = (källfärg * sourceFactor) + (målfärg * destinationFactor)
Målfärgen är den aktuella färgen i återgivningsbufferten för den pixeln. Det är således resultatet av det senaste clear()
-anropet och eventuella mellanliggande drawTriangles()
-anrop.
Använd setBlendFactors()
för att ställa in de faktorer som ska användas för att multiplicera käll- och målfärgerna innan de läggs samman. Standardblandningsfaktorn är, sourceFactor = Context3DBlendFactor.ONE
och destinationFactor = Context3DBlendFactor.ZERO
, vilket resulterar i att källfärgen skriver över målfärgen (med andra ord, de båda färgerna blandas inte). För normal alfablandning använder du sourceFactor = Context3DBlendFactor.SOURCE_ALPHA
och destinationFactor = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA
.
Använd konstanterna som definierats i klassen Context3DBlendFactor för att ställa in parametrar för den här funktionen.
Parametrar
sourceFactor:String — Den faktor som källfärgen ska multipliceras med. Är som standard Context3DBlendFactor.ONE .
| |
destinationFactor:String — Den faktor som målfärgen ska multipliceras med. Är som standard Context3DBlendFactor.ZERO .
|
Utlöser
Error — Ogiltig uppräkning: När sourceFactor eller destinationFactor inte är ett av de erkända värdena som definieras i klassen Context3DBlendFactor.
|
Relaterade API-element
Exempel ( Så här använder du exemplet )
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 | () | metod |
public function setColorMask(red:Boolean, green:Boolean, blue:Boolean, alpha:Boolean):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in masken som används när färger skrivs till återgivningsbufferten.
Endast färgkomponenterna för vilka motsvarande färgmaskparametrar är true
uppdateras när en färg skrivs till återgivningsbufferten. Om du till exempel anropar setColorMask(true, false, false, false)
skrivs endast den röda komponenten av färgen till bufferten tills nästa gång du ändrar färgmasken. Färgmasken påverkar inte beteendet för metoden clear()
.
Parametrar
red:Boolean — ange false för att blockera ändringar i den röda kanalen.
| |
green:Boolean — ange false för att blockera ändringar i den gröna kanalen.
| |
blue:Boolean — ange false för att blockera ändringar i den blå kanalen.
| |
alpha:Boolean — ange false för att blockera ändringar i alfakanalen.
|
Exempel ( Så här använder du exemplet )
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 | () | metod |
public function setCulling(triangleFaceToCull:String):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställ in culling-läge för triangel.
Trianglar kan uteslutas från scenen tidigt i återgivningstillvägagångssättet baserat på deras orientering i förhållande till visningsplanet. Ange vertex-ordningen på ett konsekvent sätt (medurs eller moturs) som om den sågs från utsidan av modellen för att plockning ska ske korrekt.
Parametrar
triangleFaceToCull:String — cullingläget. Använd en av konstanterna som definieras i Context3DTriangleFace-klassen.
|
Utlöser
Error — Ogiltig uppräkning: När triangleFaceToCull inte är något av de värden som definieras i klassen Context3DTriangleFace.
|
Relaterade API-element
setDepthTest | () | metod |
public function setDepthTest(depthMask:Boolean, passCompareMode:String):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger den jämförelsetyp som används för djuptestning.
Djupet för utdata för källpixeln från pixelskuggningsprogrammet jämförs med det aktuella värdet i djupbufferten. Om jämförelsen resulterar i false
, kommer källpixeln att ignoreras. Om det är true
bearbetas källpixeln i nästa steg i återgivningstillvägagångssättet, stenciltestet. Dessutom uppdateras djupbufferten med djupet på källpixeln så länge som parametern depthMask
är true
.
Ställer in testet som ska användas för att jämföra djupvärden för källan och målpixlar. Källpixeln blandas med målpixeln när jämförelsen är true. Jämförelseoperatorn används som en infix-operator mellan käll- och målpixelvärdena, i den ordningen.
Parametrar
depthMask:Boolean — måldjupvärdet kommer att uppdateras från källpixeln vid true.
| |
passCompareMode:String — åtgärden för djupjämförelsetestet. Ett av värdena för Context3DCompareMode.
|
Relaterade API-element
setFillMode | () | metod |
public function setFillMode(fillMode:String):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | AIR 16 |
Ange fyllningsläget som används för återgivning. Gränssnittet är endast tillgängligt för datorprogrammet AIR.
Parametrar
fillMode:String — om värdet är WIREFRAME, visas objektet i ett nät rader. om värdet är SOLID, visas objektet i heltäckande skuggade polygoner.
|
Relaterade API-element
setProgram | () | metod |
public function setProgram(program:Program3D):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in vertex- och fragment-skuggningsprogram som ska användas för efterföljande återgivning.
Parametrar
program:Program3D — Program3D-objektet som representerar de vertex- och fragment-program som ska användas.
|
Relaterade API-element
Exempel ( Så här använder du exemplet )
renderContext
, är en instans av klassen Context3D. Programmen i exemplet har skrivits i 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 | () | metod |
public function setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11.1, AIR 3.1 |
Ange konstanter som ska användas av skuggningsprogram med värden som lagras i en ByteArray
.
Anger konstanter som det går att komma åt från vertex- eller fragment-programmet.
Parametrar
programType:String — en Context3DProgramType.
| |
firstRegister:int — indexet för den första skuggningsprogramkonstanten som ska ställas in.
| |
numRegisters:int — antalet register som ska anges. Varje register läses som fyra flyttal.
| |
data:ByteArray — ByteArray-källobjektet
| |
byteArrayOffset:uint — en förskjutning in i ByteArray för läsning
|
Utlöser
TypeError — kNullPointerError när data är null.
| |
RangeError — kConstantRegisterOutOfBounds när försök görs att ställa in fler än maximalt antal skuggningskonstanter.
| |
RangeError — kBadInputSize om byteArrayOffset är större än eller lika med längden på data eller antalet element i data - byteArrayOffset är mindre än numRegisters *16
|
Relaterade API-element
setProgramConstantsFromMatrix | () | metod |
public function setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in konstanter som ska användas i skuggningsprogram med hjälp av värden lagrade i ett Matrix3D
.
Använd den här funktionen för att skicka en matris till ett skuggningsprogram. Funktionen ställer in fyra konstantregister som används i vertex- eller fragment-program. Matrisen är tilldelad till registren rad för rad. Den första konstanten är tilldelad till den översta raden i matrisen. Du kan ange 128 register för ett vertex-program och 28 för ett fragment-program.
Parametrar
programType:String — Typen av skuggningsprogram, antingen Context3DProgramType.VERTEX eller Context3DProgramType.FRAGMENT .
| |
firstRegister:int — index för det första konstantregistret som ska ställas in. Eftersom Matrix3D har 16 värden, ställs fyra register in.
| |
matrix:Matrix3D — matrisen som innehåller de konstanta värdena.
| |
transposedMatrix:Boolean (default = false ) — om true kopieras matrisposterna till registret i omvänd ordning. Standardvärdet är false .
|
Utlöser
TypeError — Null-pekarfel: När matrix är null.
| |
RangeError — Konstantregister utanför tillåtet intervall: När försök görs att ställa in fler än maximalt antal skuggningskonstantregister.
|
Lär dig mer
Relaterade API-element
setProgramConstantsFromVector | () | metod |
public function setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in konstantindata för skuggningsprogrammen.
Ställer in en array med konstanter som ska användas i ett vertex- eller fragment-skuggningsprogram. Konstanter som ställs in i Program3D kan användas i skuggningsprogrammen som konstantregister. Varje konstantregister består av fyra flyttalsvärden (x, y, z, w). Därför krävs det för varje register fyra poster i datavektorn. Antalet register som du kan ställa in för vertexprogram och fragmentprogram beror på Context3DProfile
.
Parametrar
programType:String — Typen av skuggningsprogram, antingen Context3DProgramType.VERTEX eller Context3DProgramType.FRAGMENT .
| |
firstRegister:int — index för det första konstantregistret som ska ställas in.
| |
data:Vector.<Number> — värden för flyttalskonstanter. Det måste åtminstone finnas fyra numRegisters -element i data .
| |
numRegisters:int (default = -1 ) — antalet konstanter som ska ställas in. Ange -1, standardvärdet, för att ange tillräckligt många register för att kunna använda alla tillgängliga data.
|
Utlöser
TypeError — Null-pekarfel: När data är null.
| |
RangeError — Konstantregister utanför tillåtet intervall: När försök görs att ställa in fler än maximalt antal skuggningskonstantregister.
| |
RangeError — Felaktig indatastorlek: När antalet element i data är mindre än numRegisters *4
|
Lär dig mer
Relaterade API-element
setRenderToBackBuffer | () | metod |
public function setRenderToBackBuffer():void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in bakåtåtergivningsbufferten som återgivningsmålet. Efterföljande anrop av metoderna drawTriangles()
och clear()
kommer att resultera i uppdateringar av bakåtbufferten. Använd den här metoden för att återta normal återgivning sedan metoden setRenderToTexture()
har använts.
setRenderToTexture | () | metod |
public function setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger den angivna texturen som återgivningsmål.
Efterföljande anrop till metoderna drawTriangles()
och clear()
uppdaterar den angivna texturen i stället för bakåtbufferten. Mipmappar skapas automatiskt. Använd setRenderToBackBuffer()
för att återta normal återgivning till bakåtbufferten.
Det krävs ingen rensning innan du ritar. Om ingen rensningsåtgärd utförs bevaras återgivningsinnehållet. Djupbufferten och stencilbufferten rensas inte heller. Rensning tvingas dock fram vid den första ritåtgärden. Vid anrop av present()
återställs målet till bakåtbufferten.
Parametrar
texture:flash.display3D.textures:TextureBase — måltexturen som ska återges till. Ange som null för att återta återgivning till bakåtbufferten (även setRenderToBackBuffer() och present återställer målet till bakåtbufferten).
| |
enableDepthAndStencil:Boolean (default = false ) — om true är djup- och stenciltestning tillgänglig. Om false ignoreras alla djup- och stencillägen för efterföljande ritoperationer.
| |
antiAlias:int (default = 0 ) — kantutjämningskvaliteten. Använd 0 för att inaktivera kantutjämning. Ett högre värde förbättrar kantutjämningskvaliteten, men fler beräkningar krävs. Värdet ignoreras för tillfället av mobilplattformen och programåtergivningssammanhanget.
| |
surfaceSelector:int (default = 0 ) — ange vilka element av texturen som ska uppdateras. Texturobjekt har ingen yta så du måste ange 0, standardvärdet. CubeTexture-objekt har sex ytor så du måste ange ett heltal mellan 0 och 5.
| |
colorOutputIndex:int (default = 0 ) — Registret för utdatafärgen. Måste vara 0 för begränsat läge eller baslinjeläge. I annat fall anges registret för utdatafärgen.
|
Utlöser
ArgumentError — för ett icke matchande surfaceSelector -parameter. Värdet måste vara 0 för 2D-texturer och 0 till 5 för kubmappningar.
| |
ArgumentError — texture är inte härledd från klassen TextureBase (antingen klasserna Texture eller CubeTexture).
| |
ArgumentError — colorOutputIndex måste vara ett heltal från 0 till 3.
| |
ArgumentError — det här anropet kräver ett Context3D som har skapats med standardprofilen eller en mer avancerad profil.
|
Relaterade API-element
setSamplerStateAt | () | metod |
public function setSamplerStateAt(sampler:int, wrap:String, filter:String, mipfilter:String):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11.6, AIR 3.6 |
Åsidosätt textursamplerläget manuellt.
Textursamplerläget ställs vanligtvis in när setProgram
anropas. Du kan emellertid åsidosätta textursamplerläget med den här funktionen. Om du inte vill att programmet ska ändra samplerläget anger du biten ignoresamnpler
i AGAL och använder den här funktionen.
Parametrar
sampler:int — sampler. Samplerregistret som ska användas. Mappar till samplerregistret i AGAL.
| |
wrap:String — Brytningsläge. Definieras i Context3DWrapMode . Standardvärdet är repeat.
| |
filter:String — Texturfiltreringsläge. Definieras i Context3DTextureFilter . Standardvärdet är nearest.
| |
mipfilter:String — Mipmappfilter. Definieras i Context3DMipFilter . Standardvärdet är none.
|
Utlöser
Error — sampler utanför intervall
| |
Error — brytning, filter, dålig uppräkning av mip-filter
| |
Error — Objektet har tagits bort: Om detta Context3D-objekt har tagits bort genom ett anrop av dispose() eller genom att underliggande återgivningsmaskinvara har förlorats.
|
Relaterade API-element
setScissorRectangle | () | metod |
public function setScissorRectangle(rectangle:Rectangle):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in en scissor-rektangel, vilket är en typ av ritmask. Renderaren ritar endast i området innanför scissor-rektangeln. Scissor-hantering påverkar inte rensningsåtgärder.
Skicka null
för att stänga av scissor-hantering.
Parametrar
rectangle:Rectangle — Rektangeln som det ska ritas i. Ange rektangelpositionen och mått i pixlar. Koordinatsystemsorigo är det övre vänstra hörnet i visningsporten, med de positiva värdena ökande neråt och åt höger (samma som koordinatsystemet för visning i Flash).
|
Exempel ( Så här använder du exemplet )
Trianglarna är definierade med vertex-bufferten och index-bufferten. Vertex-bufferten innehåller position och färginformationen för varje triangelhörn. Index-bufferten innehåller index för vertex-bufferten. Tre index behövs för att definiera en triangel. En triangel som till exempel bestäms av de tre första punkterna i vertex-bufferten visas som 0,1,2 i index-bufferten.
I detta enkla exempel utförs inga 3D-omformningar. Endast objekt i det kanoniska visningsområdet (en 2x2x2 stor kubvolym centrerad vid origo) visas. När emellertid en vanlig 3D-scen återges, projicerar du objekten som ska återges till visningsområdet med hjälp av antingen en perspektivprojektion eller en ortografisk projektion.
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 | () | metod |
public function setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in stencilläge och åtgärd.
Ett 8-bitars stencilreferensvärde kan associeras med varje ritanrop. Under återgivning kan referensvärdet testas mot tidigare lagrade värden i bildrutebufferten. Resultatet av testet kan kontrollera ritåtgärden och om eller hur det lagrade stencilvärdet uppdateras. Dessutom kontrolleras med djuptestning om stenciltestning utförs. En misslyckad djuptest kan även användas för att kontrollera åtgärder som vidtas i stencilbufferten.
I pixelbearbetningsflödet är det djuptestning som utförs först. Om djuptestet misslyckas kan en uppdateringsåtgärd för stencilbufferten utföras, men ingen ytterligare utvärdering av stencilbuffertvärdet ska göras. Om djuptestet lyckas kommer stenciltestet att utföras. Andra åtgärder kan vidtas beroende på resultatet av stenciltestet.
Stencilreferensvärdet ställs in med setStencilReferenceValue()
.
Parametrar
triangleFace:String (default = "frontAndBack ") — triangelorienteringarna som är tillåtna för att bidra till stencilåtgärden. En av Context3DTriangleFace.
| |
compareMode:String (default = "always ") — testoperatorn som används för att jämföra det aktuella stencilreferensvärdet och målpixelstencilvärdet. Uppdatering av målpixelfärg och djup utförs när jämförelsen är true. Stencilåtgärder utförs enligt begäran från följande åtgärdsparametrar. Jämförelseoperatorn används som en infix-operator mellan det aktuella referensvärdet och målreferensvärdet, i den ordningen (i pseudokod: skicka om stencilReference OPERATOR stencilbuffert ). Använd en av konstanterna som definieras i Context3DCompareMode-klassen.
| |
actionOnBothPass:String (default = "keep ") — åtgärd som ska vidtas när både djup- och stenciljämförelser skickas. Använd en av konstanterna som definieras i Context3DStencilAction-klassen.
| |
actionOnDepthFail:String (default = "keep ") — åtgärd som ska vidtas när djupjämförelse misslyckas. Använd en av konstanterna som definieras i Context3DStencilAction-klassen.
| |
actionOnDepthPassStencilFail:String (default = "keep ") — åtgärd som ska vidtas när djupjämförelse skickas och stenciljämförelse misslyckas. Använd en av konstanterna som definieras i Context3DStencilAction-klassen.
|
Utlöser
Error — Ogiltig uppräkning: När triangleFace inte är ett av de värden som definieras i klassen Context3DTriangleFace.
| |
Error — Ogiltig uppräkning: När compareMode inte är ett av de värden som definieras i klassen Context3DCompareMode.
| |
Error — Ogiltig uppräkning: När actionOnBothPass , actionOnDepthFail eller actionOnDepthPassStencilFail inte är ett av de värden som definieras i klassen Context3DStencilAction.
|
Relaterade API-element
Exempel ( Så här använder du exemplet )
- Stencilbufferten rensas till 0.
- Ange att stencilåtgärden ska ökas stegvis när stenciltestet blir godkänt.
- Ange stencilens referensvärde som 0.
- Rita den triangelformade masken. Oavsett var triangeln ritas godkänns stenciltestet, eftersom stencilbufferten har rensats till 0 och referensvärdet är 0. Följaktligen ökas stencilbufferten till 1 där triangelmasken ritas.
- Ändra stencilåtgärden till KEEP så att efterföljande ritåtgärder inte förändrar stencilbufferten.
- Rita en helskärmsrektangel (flerfärgad). Eftersom stencilens referensvärde fortfarande är 0 godkänns inte stenciltestet i det maskerade området. Följaktligen ritas rektangeln överallt utom i det maskerade området.
- Ändra stencilens referensvärde till 1.
- Rita en helskärmsrektangel till (röd). Nu underkänns stenciltestet i alla områden utom det maskerade området, som ökats till 1. Följaktligen ritas rektangeln bara i det maskerade området.
För musen över exemplet om du vill visa huvudstegen i sekvensen.
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 | () | metod |
public function setStencilReferenceValue(referenceValue:uint, readMask:uint = 255, writeMask:uint = 255):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Ställer in stenciljämförelsevärdet som ska användas för stenciltester.
Endast de lägre åtta bitarna av referensvärdet används. Även stencilbuffertvärdet är åtta bitar långt. Använd readMask
och writeMask
för att använda stencilbufferten som ett bit-fält.
Parametrar
referenceValue:uint — ett 8-bitars referensvärde som används i jämförelsetester för referensvärden.
| |
readMask:uint (default = 255 ) — en 8-bitars mask för att tillämpas på både det aktuella stencilbuffertvärdet och referensvärdet före jämförelsen.
| |
writeMask:uint (default = 255 ) — en 8-bitars mask för att tillämpas på referensvärdet före uppdatering av stencilbufferten.
|
Relaterade API-element
setTextureAt | () | metod |
public function setTextureAt(sampler:int, texture:flash.display3D.textures:TextureBase):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger texturen som ska användas för ett texturinvärdesregister för ett fragment-program.
Ett fragment-program kan läsa information från upp till åtta texturobjekt. Använd den här funktionen för att tilldela ett Texture- eller CubeTexture-objekt till samplerregistren som används i fragment-programmet.
Obs! Om du ändrar det aktiva fragment-programmet (med setProgram
) till ett skuggningsprogram som använder färre texturer, ska du ställa in null
för register som inte används:
setTextureAt( 7, null );
Parametrar
sampler:int — registerindex för sampler, ett värde mellan 0 och 7.
| |
texture:flash.display3D.textures:TextureBase — texturobjektet som ska göras tillgängligt, antingen en Texture- eller en CubeTexture-instans.
|
Lär dig mer
Relaterade API-element
CubeTexture
setVertexBufferAt | () | metod |
public function setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
Språkversion: | ActionScript 3.0 |
Körningsmiljöversioner: | Flash Player 11, AIR 3 |
Anger vilka vertex-datakomponenter som motsvarar ett enskilt invärde för vertex-skuggningsprogram.
Använd metoden setVertexBufferAt
för att identifiera vilka datakomponenter, som definieras för varje vertex i en VertexBuffer3D-buffert, som tillhör vilka invärden i vertex-programmet. Utvecklaren av vertex-program bestämmer hur mycket data som behövs per vertex. Dessa data mappas från en eller flera VertexBuffer3D
-direktuppspelningar till attributregistret för vertex-skuggningsprogrammet.
Den minsta dataenheten som används i vertex-skuggningen är 32-bitars data. Förskjutningar till vertex-direktuppspelningen anges i multiplar om 32-bitar.
Som ett exempel kan en programmerare definiera varje vertex med följande data:position: x float32 y float32 z float32 color: r unsigned byte g unsigned byte b unsigned byte a unsigned byteOm vertexen definierades i ett
VertexBuffer3D
-objekt, kan den tilldelas till en vertex-skuggning med följande kod:
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
Parametrar
index:int — index för attributregistret i vertex-skuggningen (0 till 7).
| |
buffer:VertexBuffer3D — bufferten som innehåller de käll-vertex-data som ska föras till vertex-skuggningen.
| |
bufferOffset:int (default = 0 ) — en förskjutning från början av data för ett enskilt vertex där läsning av detta attribut ska börja. I exemplet ovan har data en förskjutning på 0 eftersom det är det första attributet, färg har en förskjutning på 3 eftersom färgattributet följer de tre 32-bitars positionsvärdena. Förskjutningen anges i 32-bitars enheter.
| |
format:String (default = "float4 ") — ett värde från klassen Context3DVertexBufferFormat som anger datatypen för detta attribut.
|
Utlöser
Error — Ogiltig uppräkning: När formatet inte är ett av de värden som definieras i klassen Context3DVertexBufferFormat.
| |
RangeError — Attributregister utanför tillåtet intervall: När parametern index ligger utanför intervallet 0 till 7. (Maximalt åtta vertex-attributregister kan användas i ett skuggningsprogram.)
|
Lär dig mer
Relaterade API-element
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 ); } } }
Tue Jun 12 2018, 01:40 PM Z