패키지 | flash.display3D |
클래스 | public final class Context3D |
상속 | Context3D EventDispatcher Object |
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
렌더링 컨텍스트에는 드로잉 표면 및 관련 리소스와 상태가 포함됩니다. 가능한 경우 렌더링 컨텍스트는 하드웨어 GPU(그래픽 처리 장치)를 사용합니다. 그렇지 않은 경우 렌더링 컨텍스트는 소프트웨어를 사용합니다. 플랫폼에서 Context3D를 통한 렌더링이 지원되지 않는 경우 Stage 객체의 stage3Ds
속성은 빈 목록을 포함합니다.
Context3D 렌더링 컨텍스트는 OpenGL ES 2와 매우 비슷한 프로그래밍 가능한 파이프라인이지만 다양한 하드웨어 및 GPU 인터페이스와 호환되도록 추상화되어 있습니다. 이 렌더링 파이프라인은 3D 그래픽용으로 설계되었지만 반드시 3차원으로 렌더링해야 하는 것은 아닙니다. 따라서 적절한 꼭지점 및 픽셀 조각 프로그램을 제공하면 2D 렌더러를 만들 수 있습니다. 3D와 2D 두 경우 유일하게 지원되는 기하 요소는 삼각형입니다.
Stage3D 객체의 requestContext3D()
메서드를 호출하여 Context3D 클래스의 인스턴스를 가져옵니다. 스테이지 당 Context3D 객체 수는 제한되어 있습니다. Stage.stage3Ds
목록의 각 Stage3D마다 하나입니다. 컨텍스트를 만들면 Stage3D 객체가 context3DCreate
이벤트를 전달합니다. GPU를 사용하는 다른 응용 프로그램이 포커스를 얻을 때와 같이 필요에 따라 언제든지 렌더링 컨텍스트를 삭제하고 다시 만들 수 있습니다. 코드에서는 여러 context3DCreate
이벤트를 수신할 수 있다고 가정해야 합니다. 연관된 Stage3D 인스턴스의 x
및 y
속성을 사용하여 스테이지에 렌더링 영역을 배치합니다.
Context3D 객체를 가져온 후 장면을 렌더링하고 표시하려면 일반적으로 다음과 같은 단계를 따릅니다.
-
configureBackBuffer()
를 호출하여 기본 디스플레이 버퍼 특성을 구성합니다. - 다음을 포함한 렌더링 리소스를 만들고 초기화합니다.
- 장면의 도형을 정의하는 꼭지점 및 인덱스 버퍼
- 장면을 렌더링하는 꼭지점 및 픽셀 프로그램(셰이더)
- 텍스처
- 프레임을 렌더링합니다.
- 장면에 있는 객체 또는 객체 컬렉션의 렌더링 상태를 적절히 설정합니다.
-
drawTriangles()
메서드를 호출하여 삼각형 세트를 렌더링합니다. - 다음 객체 그룹의 렌더링 상태를 변경합니다.
-
drawTriangles()
를 호출하여 객체를 정의하는 삼각형을 그립니다. - 장면이 완전히 렌더링될 때까지 반복합니다.
-
present()
메서드를 호출하여 렌더링된 장면을 스테이지에 표시합니다.
렌더링에는 다음과 같은 제한 사항이 적용됩니다.
리소스 제한:
리소스 | 허용 개수 | 총 메모리 |
---|---|---|
Vertex buffers
| 4096 | 256MB |
Index buffers
| 4096 | 128MB |
Programs
| 4096 | 16MB |
Textures
| 4096 | 128MB |
Cube textures
| 4096 | 256MB |
AGAL 제한: 프로그램당 opcode 200개입니다.
그리기 호출 제한: present()
호출당 drawTriangles()
호출 32,768회입니다.
텍스처에는 다음과 같은 제한 사항이 적용됩니다.
AIR 32비트의 텍스처 제한:
Texture | 최대 크기 | 총 GPU 메모리 |
---|---|---|
일반 텍스처(기준선 확장 이하)
| 2048 x 2048 | 512MB |
일반 텍스처(기준선 확장 이상)
| 4096x4096 | 512MB |
사각형 텍스처(기준선 확장 이하)
| 2048 x 2048 | 512MB |
사각형 텍스처(기준선 확장 이상)
| 4096x4096 | 512MB |
정육면체 텍스처
| 1024x1024 | 256MB |
AIR 64비트의 텍스처 제한(데스크톱):
Texture | 최대 크기 | 총 GPU 메모리 |
---|---|---|
일반 텍스처(기준선 확장 이하)
| 2048 x 2048 | 512MB |
일반 텍스처(표준으로 확장된 기준선)
| 4096x4096 | 512MB |
일반 텍스처(표준 확장 이상)
| 4096x4096 | 2048MB |
사각형 텍스처(기준선 확장 이하)
| 2048 x 2048 | 512MB |
사각형 텍스처(표준으로 확장된 기준선)
| 4096x4096 | 512MB |
사각형 텍스처(표준 확장 이상)
| 4096x4096 | 2048MB |
정육면체 텍스처
| 1024x1024 | 256MB |
밉맵에 필요한 텍스처 메모리를 비롯하여 텍스처의 절대 제한은 512MB입니다. 하지만 정육면체 텍스처의 경우 메모리 제한은 256MB입니다.
Context3D 생성자를 사용하여 Context3D 객체를 만들 수는 없습니다. 이 객체는 Stage3D 인스턴스의 속성으로 생성되고 제공됩니다. Context3D 클래스는 Flash Player와 AIR에서 실행될 때 데스크톱 플랫폼과 모바일 플랫폼에서 모두 사용할 수 있습니다.
관련 API 요소
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
속성 | 정의 주체 | ||
---|---|---|---|
backBufferHeight : int [읽기 전용]
백 버퍼의 높이를 지정합니다. 이 값은 configureBackBuffer() 메서드 호출이 성공할 경우 변경될 수 있습니다. | Context3D | ||
backBufferWidth : int [읽기 전용]
백 버퍼의 너비를 지정합니다. 이 값은 configureBackBuffer() 메서드 호출이 성공할 경우 변경될 수 있습니다. | Context3D | ||
constructor : Object
지정된 객체 인스턴스의 클래스 객체 또는 생성자 함수에 대한 참조입니다. | Object | ||
driverInfo : String [읽기 전용]
이 렌더링 컨텍스트에서 사용되는 그래픽 라이브러리 드라이버의 유형입니다. | Context3D | ||
enableErrorChecking : Boolean
렌더러에서 발견한 오류를 응용 프로그램에 보고할지 여부를 지정합니다. | Context3D | ||
maxBackBufferHeight : int
백 버퍼의 최대 높이를 지정합니다. | Context3D | ||
maxBackBufferWidth : int
백 버퍼의 최대 너비를 지정합니다. | Context3D | ||
profile : String [읽기 전용]
이 Context3D 객체에 사용되는 기능 지원 프로파일입니다. | Context3D | ||
supportsVideoTexture : Boolean [정적] [읽기 전용]
Context3D가 비디오 텍스처를 지원할 경우 명시됩니다. | Context3D | ||
totalGPUMemory : Number [읽기 전용]
응용 프로그램의 Stage3D 데이터 구조에서 할당된 총 GPU 메모리를 반환합니다. GPU 리소스 객체가 만들어질 때마다, 활용된 메모리가 Context3D에 저장됩니다. | Context3D |
메서드 | 정의 주체 | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
리스너에서 이벤트 알림을 받을 수 있도록 EventDispatcher 객체에 이벤트 리스너 객체를 등록합니다. | 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
이 Context3D 객체에 연결된 색상, 심도 및 스텐실 버퍼를 지우고 지정된 값으로 채웁니다. | Context3D | ||
configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
렌더링 버퍼의 뷰포트 크기 및 기타 특성을 설정합니다. | Context3D | ||
createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
CubeTexture 객체를 만듭니다. | Context3D | ||
IndexBuffer3D 객체를 만듭니다. | Context3D | ||
Program3D 객체를 만듭니다. | Context3D | ||
createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
Rectangle Texture 객체를 만듭니다. | Context3D | ||
createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
Texture 객체를 만듭니다. | Context3D | ||
createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
VertexBuffer3D 객체를 만듭니다. | Context3D | ||
createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
인스턴스 데이터에 대해 VertexBuffer3D 객체를 만듭니다. | Context3D | ||
VideoTexture 객체를 만듭니다. | Context3D | ||
이벤트를 이벤트 흐름으로 전달합니다. | EventDispatcher | ||
이 Context3D에 연결된 모든 리소스와 내부 저장소를 해제합니다. | Context3D | ||
비트맵에 현재 렌더링 버퍼를 그립니다. | Context3D | ||
현재 버퍼 및 이 Context3D 객체의 상태를 사용하여 지정된 삼각형을 렌더링합니다. | Context3D | ||
drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
현재 버퍼 및 이 Context3D 객체의 상태를 사용하여 지정된 인스턴스화된 삼각형을 렌더링합니다. | Context3D | ||
EventDispatcher 객체에 특정 유형의 이벤트에 대한 리스너가 등록되어 있는지 여부를 확인합니다. | EventDispatcher | ||
지정된 속성이 객체에 정의되어 있는지 여부를 나타냅니다. | Object | ||
Object 클래스의 인스턴스가 매개 변수로 지정된 객체의 프로토타입 체인에 있는지 여부를 나타냅니다. | Object | ||
백 렌더링 버퍼를 표시합니다. | Context3D | ||
지정된 속성이 존재하고 열거 가능한지 여부를 나타냅니다. | Object | ||
EventDispatcher 객체에서 리스너를 제거합니다. | EventDispatcher | ||
기존 색상을 사용한 그리기 작업의 출력 색상을 블렌딩하는 데 사용하는 인수를 지정합니다. | Context3D | ||
렌더링 버퍼에 색상을 기록할 때 사용하는 마스크를 설정합니다. | Context3D | ||
삼각형 컬링 모드를 설정합니다. | Context3D | ||
심도 테스트에 사용되는 비교 유형을 설정합니다. | Context3D | ||
렌더링에 사용되는 채우기 모드를 설정합니다. | Context3D | ||
후속 렌더링에 사용할 꼭지점 및 조각 셰이더 프로그램을 설정합니다. | Context3D | ||
setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
ByteArray에 저장된 값을 사용하여 셰이더 프로그램에 사용할 상수를 설정합니다. | Context3D | ||
setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Matrix3D에 저장된 값을 사용하여 셰이더 프로그램에 사용할 상수를 설정합니다. | Context3D | ||
setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
셰이더 프로그램에 대한 상수 입력을 설정합니다. | Context3D | ||
루프 작업에서 동적 속성을 사용할 수 있는지 여부를 설정합니다. | Object | ||
백 렌더링 버퍼를 렌더링 대상으로 설정합니다. | Context3D | ||
setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
지정된 텍스처를 렌더링 대상으로 설정합니다. | Context3D | ||
텍스처 샘플러 상태를 수동으로 재정의합니다. | Context3D | ||
드로잉 마스크의 한 유형인 자르기 사각형을 설정합니다. | Context3D | ||
setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
스텐실 모드 및 작업을 설정합니다. | Context3D | ||
스텐실 테스트에 사용되는 스텐실 비교 값을 설정합니다. | Context3D | ||
조각 프로그램의 텍스처 입력 레지스터에 사용할 텍스처를 지정합니다. | Context3D | ||
setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
단일 꼭지점 셰이더 프로그램 입력에 해당하는 꼭지점 데이터 구성 요소를 지정합니다. | Context3D | ||
로캘별 규칙에 따라 서식이 지정된 이 객체의 문자열 표현을 반환합니다. | Object | ||
지정된 객체의 문자열 표현을 반환합니다. | Object | ||
지정된 객체의 프리미티브 값을 반환합니다. | Object | ||
이 EventDispatcher 객체 또는 조상 객체에 지정한 이벤트 유형에 대한 이벤트 리스너가 등록되어 있는지 여부를 확인합니다. | EventDispatcher |
backBufferHeight | 속성 |
backBufferHeight:int
[읽기 전용] 언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 15, AIR 15 |
백 버퍼의 높이를 지정합니다. 이 값은 configureBackBuffer()
메서드 호출이 성공할 경우 변경될 수 있습니다. 가장 최근에 configureBackBuffer()
메서드 호출이 성공했을 때 wantsBestResolutionOnBrowserZoom
이 true
로 설정된 경우 브라우저 확대/축소 인수 변경 시 높이가 수정될 수도 있습니다. 브라우저 확대/축소 변경 이벤트에 대한 이벤트 리스너를 등록하면 높이 변경을 감지할 수 있습니다.
구현
public function get backBufferHeight():int
관련 API 요소
backBufferWidth | 속성 |
backBufferWidth:int
[읽기 전용] 언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 15, AIR 15 |
백 버퍼의 너비를 지정합니다. 이 값은 configureBackBuffer()
메서드 호출이 성공할 경우 변경될 수 있습니다. 가장 최근에 configureBackBuffer()
메서드 호출이 성공했을 때 wantsBestResolutionOnBrowserZoom
이 true
로 설정된 경우 브라우저 확대/축소 인수 변경 시 너비가 수정될 수도 있습니다. 브라우저 확대/축소 변경 이벤트에 대한 이벤트 리스너를 등록하면 너비 변경을 감지할 수 있습니다.
구현
public function get backBufferWidth():int
관련 API 요소
driverInfo | 속성 |
driverInfo:String
[읽기 전용] 언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
이 렌더링 컨텍스트에서 사용되는 그래픽 라이브러리 드라이버의 유형입니다. 렌더링 시 소프트웨어, DirectX 드라이버 또는 OpenGL 드라이버 중 어느 것을 사용하는지를 나타냅니다. 하드웨어 렌더링이 실패했는지도 나타냅니다. 하드웨어 렌더링이 실패하면 Flash Player에서 Stage3D에 대해 소프트웨어 렌더링을 사용하고 driverInfo
에 다음 값 중 하나가 포함됩니다.
- "Software Hw_disabled=userDisabled" - Adobe Flash Player 설정 UI에서 [하드웨어 가속 사용] 체크 상자가 선택되지 않았습니다.
- "Software Hw_disabled=oldDriver" - 하드웨어 그래픽 드라이버에 알려진 문제가 있습니다. 그래픽 드라이버를 업데이트하면 이 문제가 해결될 수도 있습니다.
- "Software Hw_disabled=unavailable" - 하드웨어 그래픽 드라이버에 알려진 문제가 있거나 하드웨어 그래픽 초기화가 실패했습니다.
- "Software Hw_disabled=explicit" - 내용이 requestContext3D를 통해 소프트웨어 렌더링을 명시적으로 요청했습니다.
- "Software Hw_disabled=domainMemory" - 내용이 domainMemory를 사용하며, 이는 Stage3D 하드웨어 렌더링과 함께 사용되는 경우 라이센스가 필요합니다. 자세한 내용은 adobe.com/go/fpl_kr을 참조하십시오.
구현
public function get driverInfo():String
enableErrorChecking | 속성 |
enableErrorChecking:Boolean
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
렌더러에서 발견한 오류를 응용 프로그램에 보고할지 여부를 지정합니다.
enableErrorChecking
이 true
이면 clear()
및 drawTriangles()
메서드가 동기적이며 오류를 발생시킬 수 있습니다. enableErrorChecking
이 기본값인 false
이면 clear()
및 drawTriangles()
메서드가 비동기적이며 오류를 보고하지 않습니다. 오류 검사를 활성화하면 렌더링 성능이 저하됩니다. 디버깅 시에만 오류 검사를 활성화해야 합니다.
구현
public function get enableErrorChecking():Boolean
public function set enableErrorChecking(value:Boolean):void
관련 API 요소
maxBackBufferHeight | 속성 |
maxBackBufferHeight:int
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 15, AIR 15 |
백 버퍼의 최대 높이를 지정합니다. 이 초기 값은 플랫폼에 대한 시스템 제한 값입니다. 이 속성 값은 시스템 제한 값보다 작거나 동일하게 설정해야 합니다. 시스템 제한 값보다 크게 설정할 수 없습니다. 이 속성 값은 최소값 제한 값보다 크거나 동일하게 설정해야 합니다. 최소값 제한 값보다 작게 설정할 수 없습니다. 백 버퍼가 구성되지 않은 경우 최소값 제한 값은 상수, 32입니다. 백 버퍼 구성 후 마지막으로 configureBackBuffer()
메서드 호출을 성공했을 때 높이 매개 변수의 값이 최소값 제한 값이 됩니다.
구현
public function get maxBackBufferHeight():int
public function set maxBackBufferHeight(value:int):void
maxBackBufferWidth | 속성 |
maxBackBufferWidth:int
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 15, AIR 15 |
백 버퍼의 최대 너비를 지정합니다. 이 초기 값은 플랫폼에 대한 시스템 제한 값입니다. 이 속성 값은 시스템 제한 값보다 작거나 동일하게 설정해야 합니다. 시스템 제한 값보다 크게 설정할 수 없습니다. 이 속성 값은 최소값 제한 값보다 크거나 동일하게 설정해야 합니다. 최소값 제한 값보다 작게 설정할 수 없습니다. 백 버퍼가 구성되지 않은 경우 최소값 제한 값은 상수, 32입니다. 백 버퍼 구성 후 마지막으로 configureBackBuffer()
메서드 호출을 성공했을 때 너비 매개 변수의 값이 최소값 제한 값이 됩니다.
구현
public function get maxBackBufferWidth():int
public function set maxBackBufferWidth(value:int):void
profile | 속성 |
supportsVideoTexture | 속성 |
totalGPUMemory | 속성 |
totalGPUMemory:Number
[읽기 전용] 언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 21, AIR 21 |
응용 프로그램의 Stage3D 데이터 구조에서 할당된 총 GPU 메모리를 반환합니다.
GPU 리소스 객체가 만들어질 때마다, 활용된 메모리가 Context3D에 저장됩니다. 이 메모리에는 인덱스 버퍼, 꼭지점 버퍼, 텍스처(비디오 텍스처 제외) 및 이 Context3D를 통해 만들어진 프로그램이 포함됩니다.
API totalGPUMemory
는 위 리소스에서 사용하는 총 메모리를 사용자에게 반환합니다. 반환되는 기본값은 0입니다. 반환되는 총 GPU 메모리는 바이트 단위입니다. 정보는 모바일의 직접 모드와 데스크톱의 직접 및 GPU 모드에서만 제공됩니다. 데스크톱에서 <renderMode>gpu</renderMode>
를 사용하면 <renderMode>direct</renderMode>
로 폴백됩니다.
구현
public function get totalGPUMemory():Number
clear | () | 메서드 |
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
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
이 Context3D 객체에 연결된 색상, 심도 및 스텐실 버퍼를 지우고 지정된 값으로 채웁니다.
mask
매개 변수를 설정하여 지울 버퍼를 지정합니다. Context3DClearMask 클래스에 정의된 상수를 사용하여 mask
매개 변수를 설정합니다. bitwise OR 연산자("|")를 사용하여 mask에 여러 버퍼를 추가하거나 Context3DClearMask.ALL
을 사용합니다. 백 버퍼로 렌더링할 경우에는 clear()
를 호출하기 전에 configureBackBuffer()
메서드를 호출해야 합니다.
참고: 허용 범위에서 벗어나는 매개 변수 값을 지정하면 숫자 매개 변수 값이 0에서 1 사이의 범위로 잘리며 오류는 발생하지 않습니다. 마찬가지로 stencil
은 0xff보다 큰 경우 0xff로 설정됩니다.
매개 변수
red:Number (default = 0.0 ) — 색상 버퍼를 지우는 데 사용할 색상의 빨강 요소이며 범위는 0에서 1 사이입니다.
| |
green:Number (default = 0.0 ) — 색상 버퍼를 지우는 데 사용할 색상의 녹색 요소이며 범위는 0에서 1 사이입니다.
| |
blue:Number (default = 0.0 ) — 색상 버퍼를 지우는 데 사용할 색상의 파랑 요소이며 범위는 0에서 1 사이입니다.
| |
alpha:Number (default = 1.0 ) — 색상 버퍼를 지우는 데 사용할 색상의 알파 요소이며 범위는 0에서 1 사이입니다. 알파 구성 요소는 블렌딩에 사용되지 않습니다. 버퍼 알파에 직접 기록됩니다.
| |
depth:Number (default = 1.0 ) — 심도 버퍼를 지우는 데 사용할 값이며 범위는 0에서 1 사이입니다.
| |
stencil:uint (default = 0 ) — 스텐실 버퍼를 지우는 데 사용할 8비트 값이며 범위는 0x00에서 0xff 사이입니다.
| |
mask:uint (default = 0xffffffff ) — 지울 버퍼를 지정합니다.
|
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 3768: 백그라운드에서 실행되는 동안 Stage3D API는 사용할 수 없습니다.
|
관련 API 요소
configureBackBuffer | () | 메서드 |
public function configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
렌더링 버퍼의 뷰포트 크기 및 기타 특성을 설정합니다.
렌더링에는 이중 버퍼가 사용됩니다. present()
메서드를 호출하면 백 버퍼와 표시되는 전면 버퍼가 교체됩니다. 버퍼의 최소 크기는 32x32 픽셀입니다. 백 버퍼의 최대 크기는 장치 기능에 따라 제한되며, maxBackBufferWidth
및 maxBackBufferHeight
속성을 통해 사용자가 설정할 수도 있습니다. 버퍼 구성은 속도가 느린 작업입니다. 일반적인 렌더링 작업 중에는 버퍼 크기 또는 특성을 변경하지 마십시오.
매개 변수
width:int — 버퍼의 폭입니다(픽셀 단위).
| |||||||||
height:int — 버퍼의 높이입니다(픽셀 단위).
| |||||||||
antiAlias:int — 요청된 앤티앨리어싱 품질을 지정하는 정수 값입니다. 이 값은 앤티앨리어싱에 사용되는 부분 샘플 수와 관련됩니다. 부분 샘플을 많이 사용할수록 많은 계산을 수행해야 하지만, 상대적인 성능 영향은 특정 렌더링 하드웨어에 따라 다릅니다. 앤티앨리어싱의 유형과 앤티앨리어싱이 수행되는지 여부는 장치 및 렌더링 모드에 따라 다릅니다. 소프트웨어 렌더링 컨텍스트에서는 앤티앨리어싱이 전혀 지원되지 않습니다.
| |||||||||
enableDepthAndStencil:Boolean (default = true ) — false 는 심도 또는 스텐실 버퍼가 생성되지 않는다는 것을 나타내고 true 는 심도 및 스텐실 버퍼가 생성된다는 것을 나타냅니다. SWF 버전 15 이상으로 컴파일된 AIR 3.2 이상 응용 프로그램의 경우 응용 프로그램 설명자 파일의 renderMode 요소가 direct 이면 응용 프로그램 설명자 파일의 depthAndStencil 요소 값도 이 인수와 동일해야 합니다. 기본적으로 depthAndStencil 요소의 값은 false 입니다.
| |||||||||
wantsBestResolution:Boolean (default = false ) — true 이면 장치가 HiDPI 화면을 지원하는 경우 폭 및 높이 매개 변수로 나타낸 것보다 큰 백 버퍼의 할당을 시도하게 됩니다. 이렇게 되면 픽셀이 추가되고 셰이더 작업 결과가 바뀔 수 있기 때문에 기본값에 의해 해제되는 것입니다. 기본 백 버퍼가 확장된 정도를 확인하려면 Stage.contentsScaleFactor를 사용합니다.
| |||||||||
wantsBestResolutionOnBrowserZoom:Boolean (default = false ) — true : 백 버퍼의 크기가 브라우저 확대/축소 인수의 증가와 비례하여 증가합니다. 이 값은 여러 브라우저 확대/축소와 일관되게 설정되어야 합니다. 이 매개 변수의 기본값은 false 입니다. 백 버퍼 크기 증가를 제한하려면 maxBackBufferWidth 및 maxBackBufferHeight 속성을 설정하십시오. 백 버퍼의 현재 크기를 결정하려면 backBufferWidth 및 backBufferHeight 를 사용하십시오.
|
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 잘못된 입력 크기: width 또는 height 매개 변수가 최소 백 버퍼 허용 크기보다 작거나, 허용되는 최대 백 버퍼 크기보다
| |
Error — 3709: 응용 프로그램 설명자의 depthAndStencil 플래그는 Context3D 객체의 configureBackBuffer() 로 전달되는 enableDepthAndStencil 부울과 일치해야 합니다.
|
createCubeTexture | () | 메서드 |
public function createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
CubeTexture 객체를 만듭니다.
CubeTexture 객체를 사용하여 정육면체 텍스처 비트맵을 렌더링 컨텍스트에 업로드하고 렌더링 도중 정육면체 텍스처를 참조합니다. 정육면체 텍스처는 정육면체 토폴로지로 정렬된 동일한 크기의 사각형 텍스처 6개로 구성되고 환경 맵을 설명하는 데 유용합니다.
CubeTexture 생성자를 사용하여 CubeTexture 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. CubeTexture 객체를 만든 후에는 CubeTexture uploadFromBitmapData()
, uploadFromByteArray()
또는 uploadCompressedTextureFromByteArray()
메서드를 사용하여 텍스처 비트맵 데이터를 업로드합니다.
매개 변수
size:int — 텍스처 가장자리 길이입니다(텍셀 단위).
| |
format:String — Context3DTextureFormat 열거 목록의 텍셀 형식입니다.
텍스처 압축을 사용하면 GPU에서 직접 압축된 형식으로 텍스처 이미지를 저장할 수 있으므로 GPU 메모리와 메모리 대역폭이 절약됩니다. 일반적으로 압축된 텍스처는 오프라인으로 압축되고 Texture.uploadCompressedTextureFromByteArray 메서드를 사용하여 압축된 형태로 GPU에 업로드됩니다. 데스크톱 플랫폼의 Flash Player 11.4 및 AIR 3.4에서는 런타임 텍스처 압축에 대한 지원이 추가되었으며, 이는 벡터 아트에서 동적 텍스처를 렌더링하는 경우 등 일부 상황에서 유용할 수 있습니다. 이 기능은 현재 모바일 플랫폼에서는 사용할 수 없으며, 대신에 ArgumentError(텍스처 형식 불일치)가 발생합니다. 런타임 텍스처 압축을 사용하려면 다음 단계를 수행하십시오. 1. Context3D.createCubeTexture() 메서드를 호출하고, 형식 매개 변수로 flash.display3D.Context3DTextureFormat.COMPRESSED 또는 flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA를 전달하여 텍스처 객체를 만듭니다. 2. createCubeTexture()가 반환하는 flash.display3D.textures.Texture 인스턴스를 사용하여 flash.display3D.textures.CubeTexture.uploadFromBitmapData() 또는 flash.display3D.textures.CubeTexture.uploadFromByteArray()를 호출함으로써 한 번에 텍스처를 업로드하고 압축합니다. | |
optimizeForRenderToTexture:Boolean — 텍스처가 렌더링 대상으로 사용될 가능성이 있는 경우 true 로 설정합니다.
| |
streamingLevels:int (default = 0 ) — 이미지가 렌더링되기 전에 로드해야 하는 밉 맵 레벨입니다. 텍스처 스트리밍을 사용하면 우선 최소 밉 레벨을 로드 및 표시한 후, 텍스처가 로드되는 동안 점진적으로 더 높은 품질의 이미지를 표시할 수 있습니다. 최종 사용자는 높은 품질의 이미지가 로드되는 동안 응용 프로그램에서 낮은 품질의 이미지를 볼 수 있습니다.
기본적으로 streamingLevels는 0이며, 이는 이미지가 렌더링되기 전에 MIP 맵의 최고 품질 이미지를 로드해야 함을 의미합니다. 이 매개 변수는 Flash Player 11.3 및 AIR 3.3에서 추가되었습니다. 기본값을 사용하면 이전 버전의 Flash Player 및 AIR의 비헤이비어가 유지됩니다. 텍스처 스트리밍을 활성화하려면 참고: 이 속성을 0보다 큰 값으로 설정하면 메모리 사용과 성능에 영향을 줄 수 있습니다. |
flash.display3D.textures:CubeTexture |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: Texture 객체가 너무 많이 만들어졌거나 텍스처에 할당된 메모리의 양을 초과한 경우입니다.
| |
ArgumentError — 깊이 텍스처가 구현되지 않음: 깊이 텍스처를 만들려고 한 경우입니다.
| |
ArgumentError — 텍스처 크기가 0임: size 매개 변수가 0보다 크지 않은 경우입니다.
| |
ArgumentError — 텍스처가 2의 거듭제곱이 아님: size 매개 변수가 2의 거듭제곱이 아닌 경우입니다.
| |
ArgumentError — 텍스처가 너무 큼: size 매개 변수가 1024보다 큰 경우입니다.
| |
Error — 텍스처 만들기 실패: 렌더링 컨텍스트에서 CubeTexture 객체를 만들 수 없는 경우입니다(원인 정보가 제공되지 않음).
| |
ArgumentError — 잘못된 스트리밍 레벨: streamingLevels 가 log2(크기)보다 크거나 같은 경우입니다.
|
관련 API 요소
createIndexBuffer | () | 메서드 |
public function createIndexBuffer(numIndices:int, bufferUsage:String = "staticDraw"):IndexBuffer3D
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
IndexBuffer3D 객체를 만듭니다.
IndexBuffer3D 객체를 사용하여 삼각형 인덱스 집합을 렌더링 컨텍스트에 업로드하고 렌더링을 위해 해당 인덱스 집합을 참조합니다. 인덱스 버퍼의 각 인덱스는 꼭지점 버퍼에서 해당 꼭지점을 참조합니다. 삼각형은 각각 세 개의 인덱스 집합으로 식별됩니다. IndexBuffer3D 객체를 drawTriangles()
메서드에 전달하여 인덱스 버퍼에 정의된 하나 이상의 삼각형을 렌더링합니다.
IndexBuffer3D 클래스 생성자를 사용하여 IndexBuffer3D 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. IndexBuffer3D 객체를 만든 후에는 IndexBuffer3D uploadFromVector()
또는 uploadFromByteArray()
메서드를 사용하여 인덱스를 업로드합니다.
매개 변수
numIndices:int — 버퍼에 저장할 꼭지점 수입니다.
| |
bufferUsage:String (default = "staticDraw ") — 예상 버퍼 사용량입니다. Context3DBufferUsage 에 정의된 상수 중 하나를 사용합니다. 올바로 설정하면 하드웨어 드라이버가 최적화 작업을 제대로 수행할 수 있습니다. 이 매개 변수는 Flash 12 및 AIR 4 이후부터만 사용할 수 있습니다.
|
IndexBuffer3D |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: 인덱스 버퍼가 너무 많이 만들어졌거나 인덱스 버퍼에 할당된 메모리의 양을 초과한 경우입니다.
| |
Error — 3768: 백그라운드에서 실행되는 동안 Stage3D API는 사용할 수 없습니다.
| |
ArgumentError — 버퍼가 너무 큼: numIndices 가 0xf0000보다 크거나 같은 경우입니다.
|
관련 API 요소
createProgram | () | 메서드 |
public function createProgram():Program3D
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
Program3D 객체를 만듭니다.
Program3D 객체를 사용하여 셰이더 프로그램을 렌더링 컨텍스트에 업로드하고 업로드한 프로그램을 렌더링 도중 참조합니다. Program3D 객체는 두 개의 프로그램인 꼭지점 프로그램과 조각 프로그램(픽셀 프로그램이라고도 함)을 저장합니다. 프로그램은 이진 셰이더 어셈블리 언어로 기록됩니다.
Program3D 생성자를 사용하여 Program3D 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. Program3D 객체를 만든 후에는 Program3D upload()
메서드를 사용하여 프로그램을 업로드합니다.
Program3D |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 프로그램 수가 4096을 초과하거나 총 메모리 크기가 16MB를 초과합니다(dispose 를 사용하여 Program3D 리소스 해제).
|
관련 API 요소
예제 ( 예제 사용 방법 )
renderContext
객체는 Context3D 클래스의 인스턴스입니다. 예제의 프로그램은 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 | () | 메서드 |
public function createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11.8, AIR 3.8 |
Rectangle Texture 객체를 만듭니다.
RectangleTexture 객체를 사용하여 텍스처 비트맵을 렌더링 컨텍스트에 업로드하고 렌더링 도중 텍스처를 참조합니다.
RectangleTexture 생성자를 사용하여 RectangleTexture 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. RectangleTexture 객체를 만든 후에는 Texture uploadFromBitmapData()
또는 uploadFromByteArray()
메서드를 사용하여 텍스처 비트맵을 업로드합니다.
32비트 정수 텍스처는 Flash BitmapData
형식과 일치하도록 압축된 BGRA 형식으로 저장됩니다. 부동 소수점 텍스처는 기본 RGBA 형식을 사용합니다.
사각형 텍스처는 폭과 높이가 2의 거듭제곱일 필요가 없다는 점에서 일반 2D 텍스처와 다릅니다. 또한 밉 맵을 포함하지 않습니다. 이러한 텍스처는 텍스처 케이스에 렌더링하는 경우에 매우 유용합니다. 사각형 텍스처를 밉 맵 필터링 또는 반복 래핑을 사용하는 견본과 함께 사용되면 drawTriangles 호출이 실패합니다. 또한 사각형 텍스처는 스트리밍을 허용하지 않습니다. 사각형 텍스처가 지원하는 텍스처 형식은 BGRA, BGR_PACKED, BGRA_PACKED뿐입니다. 압축된 텍스처 형식은 사각형 텍스처에서 지원되지 않습니다.
매개 변수
width:int — 텍스처 폭입니다(텍셀 단위).
| |
height:int — 텍스처 높이입니다(텍셀 단위).
| |
format:String — Context3DTextureFormat 열거 목록의 텍셀 형식입니다.
| |
optimizeForRenderToTexture:Boolean — 텍스처가 렌더링 대상으로 사용될 가능성이 있는 경우 true 로 설정합니다.
|
flash.display3D.textures:RectangleTexture |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: Texture 객체가 너무 많이 만들어졌거나 텍스처에 할당된 메모리의 양을 초과한 경우입니다.
| |
ArgumentError — 텍스처 크기가 0임: width 또는 height 매개 변수가 0보다 작거나 0인 경우입니다.
| |
ArgumentError — 텍스처가 너무 큼: width 또는 height 매개 변수가 2048보다 큰 경우입니다.
| |
Error — 텍스처 만들기 실패: 렌더링 컨텍스트에서 Texture 객체를 만들 수 없는 경우입니다(원인 정보가 제공되지 않음).
| |
Error — 기준선 프로파일 이상 필요: 사각형 텍스처가 기준선 제한 프로파일로 만들어진 경우입니다.
|
관련 API 요소
createTexture | () | 메서드 |
public function createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
Texture 객체를 만듭니다.
Texture 객체를 사용하여 텍스처 비트맵을 렌더링 컨텍스트에 업로드하고 렌더링 도중 텍스처를 참조합니다.
Texture 생성자를 사용하여 Texture 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. Texture 객체를 만든 후에는 Texture uploadFromBitmapData()
, uploadFromByteArray()
또는 uploadCompressedTextureFromByteArray()
메서드를 사용하여 텍스처 비트맵을 업로드합니다.
32비트 정수 텍스처는 Flash BitmapData
형식과 일치하도록 압축된 BGRA 형식으로 저장됩니다. 부동 소수점 텍스처는 기본 RGBA 형식을 사용합니다.
매개 변수
width:int — 텍스처 폭입니다(텍셀 단위).
| |
height:int — 텍스처 높이입니다(텍셀 단위).
| |
format:String — Context3DTextureFormat 열거 목록의 텍셀 형식입니다.
텍스처 압축을 사용하면 GPU에서 직접 압축된 형식으로 텍스처 이미지를 저장할 수 있으므로 GPU 메모리와 메모리 대역폭이 절약됩니다. 일반적으로 압축된 텍스처는 오프라인으로 압축되고 Texture.uploadCompressedTextureFromByteArray 메서드를 사용하여 압축된 형태로 GPU에 업로드됩니다. 데스크톱 플랫폼의 Flash Player 11.4 및 AIR 3.4에서는 런타임 텍스처 압축에 대한 지원이 추가되었으며, 이는 벡터 아트에서 동적 텍스처를 렌더링하는 경우 등 일부 상황에서 유용할 수 있습니다. 이 기능은 현재 모바일 플랫폼에서는 사용할 수 없으며, 대신에 ArgumentError(텍스처 형식 불일치)가 발생합니다. 런타임 텍스처 압축을 사용하려면 다음 단계를 수행하십시오. 1. Context3D.createTexture() 메서드를 호출하고, 형식 매개 변수로 flash.display3D.Context3DTextureFormat.COMPRESSED 또는 flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA를 전달하여 텍스처 객체를 만듭니다. 2. createTexture()가 반환하는 flash.display3D.textures.Texture 인스턴스를 사용하여 flash.display3D.textures.Texture.uploadFromBitmapData() 또는 flash.display3D.textures.Texture.uploadFromByteArray()를 호출함으로써 한 번에 텍스처를 업로드하고 압축합니다. | |
optimizeForRenderToTexture:Boolean — 텍스처가 렌더링 대상으로 사용될 가능성이 있는 경우 true 로 설정합니다.
| |
streamingLevels:int (default = 0 ) — 이미지가 렌더링되기 전에 로드해야 하는 밉 맵 레벨입니다. 텍스처 스트리밍을 사용하면 우선 최소 밉 레벨을 로드 및 표시한 후, 텍스처가 로드되는 동안 점진적으로 더 높은 품질의 이미지를 표시할 수 있습니다. 최종 사용자는 높은 품질의 이미지가 로드되는 동안 응용 프로그램에서 낮은 품질의 이미지를 볼 수 있습니다.
기본적으로 streamingLevels는 0이며, 이는 이미지가 렌더링되기 전에 MIP 맵의 최고 품질 이미지를 로드해야 함을 의미합니다. 이 매개 변수는 Flash Player 11.3 및 AIR 3.3에서 추가되었습니다. 기본값을 사용하면 이전 버전의 Flash Player 및 AIR의 비헤이비어가 유지됩니다. 텍스처 스트리밍을 활성화하려면 참고: 이 속성을 0보다 큰 값으로 설정하면 메모리 사용과 성능에 영향을 줄 수 있습니다. |
flash.display3D.textures:Texture |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: Texture 객체가 너무 많이 만들어졌거나 텍스처에 할당된 메모리의 양을 초과한 경우입니다.
| |
ArgumentError — 깊이 텍스처가 구현되지 않음: 깊이 텍스처를 만들려고 한 경우입니다.
| |
ArgumentError — 텍스처 크기가 0임: width 또는 height 매개 변수가 0보다 작거나 0인 경우입니다.
| |
ArgumentError — 텍스처가 2의 거듭제곱이 아님: width 및 height 매개 변수가 모두 2의 거듭제곱이 아닌 경우입니다.
| |
ArgumentError — 텍스처가 너무 큼: 기준선 및 기준선 제한 프로파일에 대해 width 또는 height 매개 변수가 2048보다 크거나, 프로파일 기준선 확장 이상에 대해 width 또는 height 매개 변수가 4096보다 큰 경우입니다.
| |
Error — 텍스처 만들기 실패: 렌더링 컨텍스트에서 Texture 객체를 만들 수 없는 경우입니다(원인 정보가 제공되지 않음).
| |
ArgumentError — 잘못된 스트리밍 레벨: streamingLevels 가 log2(min(width,height))보다 크거나 같은 경우입니다.
|
관련 API 요소
createVertexBuffer | () | 메서드 |
public function createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
VertexBuffer3D 객체를 만듭니다.
VertexBuffer3D 객체를 사용하여 꼭지점 데이터 집합을 렌더링 컨텍스트에 업로드합니다. 꼭지점 버퍼는 장면의 도형에서 각 포인트를 렌더링하는 데 필요한 데이터를 포함합니다. 일반적으로 각 꼭지점과 연결된 데이터 특성에는 위치, 색상 및 텍스처 좌표가 포함되며 이러한 특성은 꼭지점 셰이더 프로그램에 대한 입력으로 사용됩니다. setVertexBufferAt()
메서드를 사용하여 꼭지점 프로그램의 입력 중 하나에 해당하는 데이터 값을 식별합니다. 각 꼭지점에 대해 최대 64개의 32비트 값을 지정할 수 있습니다.
VertexBuffer3D 생성자를 사용하여 VertexBuffer3D 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. VertexBuffer3D 객체를 만든 후에는 VertexBuffer3D uploadFromVector()
또는 uploadFromByteArray()
메서드를 사용하여 꼭지점 데이터를 업로드합니다.
매개 변수
numVertices:int — 버퍼에 저장할 꼭지점 수입니다. 단일 버퍼에 있는 최대 꼭지점 수는 65535입니다.
| |
data32PerVertex:int — 각 꼭지점과 연결된 32비트(4바이트) 데이터 값의 수입니다. 꼭지점당 최대 32비트 데이터 요소 수는 64(또는 256바이트)입니다. 참고로, 꼭지점 셰이더 프로그램은 어느 시점에서든 8개의 특성 레지스터에만 액세스할 수 있습니다. SetVertextBufferAt() 을 사용하여 꼭지점 버퍼 내에서 특성을 선택합니다.
| |
bufferUsage:String (default = "staticDraw ") — 예상 버퍼 사용량입니다. Context3DBufferUsage 에 정의된 상수 중 하나를 사용합니다. 올바로 설정하면 하드웨어 드라이버가 최적화 작업을 제대로 수행할 수 있습니다. 이 매개 변수는 Flash 12 및 AIR 4 이후부터만 사용할 수 있습니다.
|
VertexBuffer3D |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: 꼭지점 버퍼 객체가 너무 많이 만들어졌거나 꼭지점 버퍼에 할당된 메모리의 양을 초과한 경우입니다.
| |
ArgumentError — 버퍼가 너무 큼: numVertices 가 0x10000보다 크거나 data32PerVertex 가 64보다 큰 경우입니다.
| |
ArgumentError — 버퍼에 0인 크기가 있음: numVertices 가 0이거나 data32PerVertex 가 0인 경우입니다.
| |
ArgumentError — 텍스처 만들기 실패: 렌더링 컨텍스트에서 VertexBuffer3D 객체를 만들 수 없는 경우입니다(추가적인 원인 정보가 제공되지 않음).
| |
Error — 3768: 백그라운드에서 실행되는 동안 Stage3D API는 사용할 수 없습니다.
|
관련 API 요소
예제 ( 예제 사용 방법 )
setVertexBufferAt()
메서드를 호출하여 처음 세 개의 데이터 포인트가 세 개의 부동 소수점 값(va0)으로 꼭지점 프로그램에 전달되고 그 다음 세 개의 데이터 포인트가 va1로 전달되도록 지정합니다. 꼭지점 프로그램에는 이와 같이 정의된 입력을 8개까지 지정할 수 있으며, 이러한 입력을 꼭지점 특성 레지스터라고도 합니다.
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 | () | 메서드 |
public function createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 20.0 |
인스턴스 데이터에 대해 VertexBuffer3D 객체를 만듭니다.
VertexBuffer3D 객체를 사용하여 인스턴스 데이터 집합을 렌더링 컨텍스트에 업로드합니다. 꼭지점 버퍼에는 장면 도형에서 각 인스턴스를 렌더링하는 데 필요한 데이터가 포함됩니다. 인스턴스 데이터가 포함된 꼭지점 버퍼는 인스턴스의 모든 꼭지점에 공통되는 특성을 제공하며, 꼭지점 셰이더 프로그램에 대한 입력으로 사용됩니다. setVertexBufferAt()
메서드를 사용하여 꼭지점 프로그램의 입력 중 하나에 해당하는 데이터 값을 식별합니다. 꼭지점 버퍼의 각 요소에 대해 최대 64개의 32비트 값을 지정할 수 있습니다.
VertexBuffer3D 생성자를 사용하여 VertexBuffer3D 객체를 만들 수는 없으며 대신 이 메서드를 사용합니다. VertexBuffer3D 객체를 만든 후에는 VertexBuffer3D uploadFromVector()
또는 uploadFromByteArray()
메서드를 사용하여 꼭지점 데이터를 업로드합니다.
매개 변수
numVertices:int — 버퍼에 저장할 요소의 수입니다. 단일 버퍼의 최대 요소 수는 65535입니다.
| |
data32PerVertex:int — 각 요소와 연결된 32비트(4바이트) 데이터 값의 수입니다. 꼭지점당 최대 32비트 데이터 요소 수는 64(또는 256바이트)입니다.
| |
instancesPerElement:int — 꼭지점 버퍼의 요소 하나를 사용할 인스턴스의 수입니다.
| |
bufferUsage:String (default = "staticDraw ") — 예상 버퍼 사용량입니다. Context3DBufferUsage 에 정의된 상수 중 하나를 사용합니다. 올바로 설정하면 하드웨어 드라이버가 최적화 작업을 제대로 수행할 수 있습니다. 이 매개 변수는 Flash 12 및 AIR 4 이후부터만 사용할 수 있습니다.
|
VertexBuffer3D |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: 꼭지점 버퍼 객체가 너무 많이 만들어졌거나 꼭지점 버퍼에 할당된 메모리의 양을 초과한 경우입니다.
| |
ArgumentError — 버퍼가 너무 큼: numVertices 가 0x10000보다 크거나 data32PerVertex 가 64보다 큰 경우입니다.
| |
ArgumentError — 버퍼에 0인 크기가 있음: numVertices 가 0이거나 data32PerVertex 가 0인 경우입니다.
| |
ArgumentError — 텍스처 만들기 실패: 렌더링 컨텍스트에서 VertexBuffer3D 객체를 만들 수 없는 경우입니다(추가적인 원인 정보가 제공되지 않음).
| |
Error — 3768: 백그라운드에서 실행되는 동안 Stage3D API는 사용할 수 없습니다.
| |
Error — 표준 확장 프로파일 이상 필요: 요청된 프로파일이 표준 확장 프로파일 미만일 때 이 메서드가 호출되는 경우입니다.
| |
Error — 잘못된 요소당 인스턴스 수: instancesPerElement가 0보다 크지 않은 경우입니다.
|
관련 API 요소
createVideoTexture | () | 메서드 |
public function createVideoTexture():flash.display3D.textures:VideoTexture
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 17.0, Flash Player 18.0 |
VideoTexture 객체를 만듭니다.
VideoTexture 객체를 사용하여 NetStream 객체 또는 Camera 객체에서 텍스처로 비디오 프레임을 가져온 후 이 비디오 프레임을 렌더링 컨텍스트로 업로드합니다.
VideoTexture 생성자를 사용하여 VideoTexture 객체를 만들 수 없습니다. 대신 이 메서드를 사용하십시오. VideoTexture 객체를 생성하고 NetStream 객체 또는 Camera 객체를 연결한 후 VideoTexture attachNetStream()
또는 attachCamera()
메서드를 사용하여 비디오 프레임을 가져옵니다.
시스템이 이 기능을 지원하지 않을 경우 이 메서드는 null을 반환합니다.
VideoTexture에는 밉맵이 포함되지 않습니다. 사각형 텍스처를 밉 맵 필터링 또는 반복 래핑을 사용하는 견본과 함께 사용하면 drawTriangles 호출이 실패합니다. VideoTexture는 셰이더에 의해 BGRA 텍스처로 다뤄질 수 있습니다. 소프트웨어 렌더링 모드에서 Context3D가 요청된 경우 VideoTexture 객체를 인스턴스화하려고 시도하면 실패하게 됩니다.
Context3D 인스턴스당 최대 4개의 VideoTexture 객체를 사용할 수 있습니다. 모바일에서 지원되는 VideoTexture 객체의 실제 수는 플랫폼의 제한으로 인해 4개 미만일 수도 있습니다.
반환값flash.display3D.textures:VideoTexture |
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 리소스 제한 초과: Texture 객체가 너무 많이 만들어졌거나 텍스처에 할당된 메모리의 양을 초과한 경우입니다.
| |
Error — 텍스처 만들기 실패: 렌더링 컨텍스트에서 Texture 객체를 만들 수 없는 경우입니다(원인 정보가 제공되지 않음).
|
dispose | () | 메서드 |
public function dispose(recreate:Boolean = true):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
이 Context3D에 연결된 모든 리소스와 내부 저장소를 해제합니다.
각 항목에서 개별적으로 dispose()
를 호출하는 경우와 같이 이 Context3D를 통해 만들어진 모든 인덱스 버퍼, 꼭지점 버퍼, 텍스처 및 프로그램은 삭제됩니다. 또한 Context3D 자체가 삭제되어 모든 임시 버퍼 및 백 버퍼가 지워집니다. dispose()를 호출한 후 configureBackBuffer(), clear(), drawTriangles(), createCubeTexture(), createTexture(), createProgram(), createIndexBuffer(), createVertexBuffer() 또는 drawToBitmapData()를 호출하면 런타임에 예외가 발생합니다.
경고: 연결된 Stage3D 객체에 Events.CONTEXT3D_CREATE에 대한 이벤트 리스너가 설정된 상태에서 Context3D에 대해 dispose()를 호출하면 dispose() 호출이 장치 손실을 시뮬레이션합니다. 이렇게 하면 Stage3D에 새 Context3D가 만들어지고 Events.CONTEXT3D_CREATE 이벤트가 다시 발생합니다. 이를 원치 않으면 dispose()를 호출하기 전에 Stage3D 객체에서 이벤트 리스너를 제거하거나 recreate 매개 변수를 false로 설정합니다.
매개 변수
recreate:Boolean (default = true )
|
관련 API 요소
flash.display.Stage3D
drawToBitmapData | () | 메서드 |
public function drawToBitmapData(destination:BitmapData, srcRect:Rectangle = null, destPoint:Point = null):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 3 |
비트맵에 현재 렌더링 버퍼를 그립니다.
백 렌더링 버퍼의 현재 내용이 BitmapData 객체에 복사됩니다. 이 작업은 최대 1초가 걸리는 매우 느린 작업이므로 사용에 주의합니다. 이 함수는 스테이지에 표시되는 전면 렌더링 버퍼가 아니라 그려지는 버퍼를 복사합니다. 스테이지에 표시되는 렌더링된 이미지를 캡처하려면 present()
를 호출하기 직전에 drawToBitmapData()
를 호출합니다.
AIR 25부터는 API drawToBitmapData()
에 두 개의 매개 변수가 새로 도입되었습니다. 따라서 이제 이 API에서는 세 개의 매개 변수를 사용합니다. 첫 번째는 기존 매개 변수인 destination:BitmapData
입니다. 두 번째 매개 변수는 stage3D의 대상 사각형인 srcRect:Rectangle
입니다. 세 번째 매개 변수는 대상 비트맵의 좌표에 해당하는 destPoint:Point
입니다. 매개 변수 srcRect 및 destPoint는 선택 사항이며 각각 (0,0,bitmapWidth,bitmapHeight) 및 (0,0)으로 기본값이 지정됩니다.
이미지는 그려질 때 비트맵에 맞게 크기가 조절되지 않습니다. 대신에 내용이 대상 비트맵의 크기로 클리핑됩니다.
Flash BitmapData 객체는 알파 구성 요소가 이미 곱해진 색상을 저장합니다. 예를 들어 픽셀의 "순수" rgb 구성 요소가 (0x0A, 0x12, 0xBB)이고 알파 구성 요소가 0x7F(.5)인 경우 해당 픽셀은 rgba 값 (0x05, 0x09, 0x5D, 0x7F)와 함께 BitmapData 객체에 저장됩니다. 버퍼에 렌더링되는 색상에 알파를 곱하도록 블렌드 인수를 설정하거나 조각 셰이더에서 해당 작업을 수행할 수 있습니다. 렌더링 컨텍스트는 색상이 미리 곱한 형식으로 저장되었는지 검증하지 않습니다.
매개 변수
destination:BitmapData | |
srcRect:Rectangle (default = null )
| |
destPoint:Point (default = null )
|
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — 3768: 백그라운드에서 실행되는 동안 Stage3D API는 사용할 수 없습니다.
| |
Error — 3802: 매개 변수 destPoint:Point 또는 srcRect:Rectangle 중 하나가 bitmap/stage3D 좌표 경계를 벗어나거나, 숫자가 아닌(NaN) 값이 입력으로 전달되는 경우입니다.
|
예제 ( 예제 사용 방법 )
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 | () | 메서드 |
public function drawTriangles(indexBuffer:IndexBuffer3D, firstIndex:int = 0, numTriangles:int = -1):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
현재 버퍼 및 이 Context3D 객체의 상태를 사용하여 지정된 삼각형을 렌더링합니다.
각 삼각형의 꼭지점은 꼭지점 셰이더 프로그램에 의해 처리되고 삼각형 표면은 픽셀 셰이더 프로그램에 의해 처리됩니다. 각 픽셀에 대해 픽셀 프로그램의 출력 색상이 렌더링 대상에 그려집니다. 스텐실 작업, 심도 테스트, 소스 및 대상 알파, 현재 블렌드 모드가 여기에 영향을 줍니다. 렌더링 대상은 기본 렌더링 버퍼 또는 텍스트처일 수 있습니다.
setCulling()
메서드로 컬링을 활성화하면 픽셀 프로그램이 실행되기 전에 삼각형이 장면에서 삭제될 수 있습니다. 스텐실 및 심도 테스트를 활성화하면 픽셀 프로그램의 출력 픽셀이 렌더링 대상을 업데이트하지 않고 삭제될 수 있습니다. 또한 픽셀 프로그램은 픽셀의 색상이 출력되지 않도록 결정할 수 있습니다.
렌더링된 삼각형은 present()
메서드를 호출할 때까지 뷰포트에 표시되지 않습니다. 각각의 present()
를 호출한 후에는 첫 번째 drawTriangles()
를 호출하기 전에 clear()
메서드를 호출해야 하며 그렇지 않으면 렌더링이 실패합니다.
enableErrorChecking
이 false
이면 이 함수가 결과를 기다리지 않고 즉시 반환되며, 이 COntext3D 인스턴스가 삭제되었거나 그리기 호출이 너무 많은 경우에만 예외가 발생합니다. 렌더링 컨텍스트 상태가 유효하지 않은 경우 렌더링이 실패하며 오류는 발생하지 않습니다. enableErrorChecking
속성이 true
이면 삼각형이 그려진 후 이 함수가 반환되며 드로잉 오류 또는 잘못된 컨텍스트 상태에 대해 예외가 발생합니다.
매개 변수
indexBuffer:IndexBuffer3D — 렌더링할 꼭지점을 참조하는 꼭지점 인덱스 집합입니다.
| |
firstIndex:int (default = 0 ) — 렌더링하도록 선택된 첫 번째 꼭지점 인덱스의 인덱스입니다. 기본값은 0입니다.
| |
numTriangles:int (default = -1 ) — 렌더링할 삼각형 수입니다. 각 삼각형에는 세 개의 인덱스가 사용됩니다. 인덱스 버퍼에서 모든 삼각형을 그리려면 -1을 전달합니다. 기본값은 -1입니다.
|
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — present() 호출 간에 이 메서드를 너무 많이 호출한 경우입니다. 최대 호출 횟수는 32,768입니다.
다음 오류는 | |
Error — 그리기 전에 지워야 함: 마지막 present() 호출 이후 버퍼가 지워지지 않은 경우입니다.
| |
Error — 유효한 Program3D 객체가 설정되지 않은 경우입니다.
| |
Error — 유효한 인덱스 버퍼가 설정되지 않음: IndexBuffer3D 객체가 설정되지 않은 경우입니다.
| |
Error — 매개 변수에 대한 상태 검사에 실패함: 그릴 삼각형 수나 firstIndex 가 허용되는 값을 초과한 경우입니다.
| |
RangeError — 버퍼에 있는 인덱스가 충분하지 않음: 버퍼에 있는 인덱스가 충분하지 않아서 그릴 삼각형 수를 정의할 수 없는 경우입니다.
| |
Error — 샘플에서 바인딩하는 텍스처가 렌더링에도 바인딩된 되어 있음: 렌더링 대상이 텍스처이고 해당 텍스처가 현재 조각 프로그램의 텍스처 입력에 할당된 경우입니다.
| |
Error — 샘플에서 잘못된 텍스처를 바인딩함: 잘못된 텍스처가 현재 조각 프로그램의 입력으로 지정된 경우입니다.
| |
Error — 샘플러 형식이 텍스처 형식과 일치하지 않음: 현재 조각 프로그램에 대한 입력으로 할당된 텍스처의 형식이 샘플러 레지스터에 지정된 형식과 다른 경우입니다. 예를 들어 2D 텍스처가 정육면체 텍스처 샘플러에 할당된 경우입니다.
| |
Error — 샘플에서 정의되지 않은 텍스처를 바인딩함: 현재 조각 프로그램이 setTextureAt() 을 사용하여 설정되지 않은 텍스처 레지스터에 액세스합니다.
| |
Error — 텍스처가 같으면 샘플러 매개 변수도 같아야 함: 텍스처가 둘 이상의 샘플러 레지스터에 사용될 경우 모든 샘플러의 설정이 동일해야 합니다. 예를 들어 한 샘플러는 clamp로 설정하고 다른 샘플러는 wrap으로 설정할 수 없습니다.
| |
Error — 텍스처가 바인딩되었지만 사용되지 않음: 텍스처가 셰이더 입력으로 설정되었지만 사용되지 않습니다.
| |
Error — 스트림이 사용되지 않음: 꼭지점 버퍼가 꼭지점 특성 입력에 할당되었지만 꼭지점 프로그램이 해당 레지스터를 참조하지 않습니다.
| |
Error — 스트림이 유효하지 않음: 꼭지점 프로그램 입력에 할당된 VertexBuffer3D 객체가 유효한 객체가 아닙니다.
| |
RangeError — 스트림에 꼭지점이 충분하지 않음: 지정된 삼각형을 그리기 위한 데이터를 제공하는 꼭지점 버퍼에 데이터가 충분하지 않습니다.
| |
RangeError — 스트림 꼭지점 오프셋이 경계를 벗어남: setVertexBufferAt() 호출에 지정된 오프셋이 음수이거나 버퍼의 끝을 지났습니다.
| |
Error — 스트림이 읽히지만 설정되지 않음: 현재 꼭지점 프로그램에 사용되는 꼭지점 특성이 setVertexBufferAt() 를 사용하여 설정되지 않았습니다.
|
관련 API 요소
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
예제 ( 예제 사용 방법 )
삼각형은 꼭지점 버퍼와 인덱스 버퍼를 사용하여 정의됩니다. 꼭지점 버퍼는 각 삼각형 꼭지점의 위치와 색상 정보를 포함합니다. 인덱스 버퍼는 꼭지점 버퍼에 대한 인덱스를 포함합니다. 세 개의 인덱스가 삼각형 하나를 정의합니다. 예를 들어 꼭지점 버퍼의 처음 세 점으로 구성된 삼각형은 인덱스 버퍼에서 0,1,2로 나열됩니다.
이 간단한 예제에서는 3D 변형을 수행하지 않습니다. 정규 시야 영역 내의 객체(2x2x1 단위 볼륨)만 표시할 수 있으며 삼각형의 좌표는 이 영역 내에 있도록 정의됩니다. 그러나 일반적인 3D 장면을 렌더링할 때는 렌더링할 객체를 원근 또는 직각 투영을 사용하여 "월드" 좌표계에서 이 시야 영역에 투영합니다.
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 | () | 메서드 |
public function drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 20.0 |
현재 버퍼 및 이 Context3D 객체의 상태를 사용하여 지정된 인스턴스화된 삼각형을 렌더링합니다.
각 인스턴스의 각 삼각형에 대해 삼각형 꼭지점은 꼭지점 셰이더 프로그램에 의해 처리되고 삼각형 표면은 픽셀 셰이더 프로그램에 의해 처리됩니다. 각 픽셀에 대해 픽셀 프로그램의 출력 색상이 렌더링 대상에 그려집니다. 스텐실 작업, 심도 테스트, 소스 및 대상 알파, 현재 블렌드 모드가 여기에 영향을 줍니다. 렌더링 대상은 기본 렌더링 버퍼 또는 텍스트처일 수 있습니다.
setCulling()
메서드로 컬링을 활성화하면 픽셀 프로그램이 실행되기 전에 삼각형이 장면에서 삭제될 수 있습니다. 스텐실 및 심도 테스트를 활성화하면 픽셀 프로그램의 출력 픽셀이 렌더링 대상을 업데이트하지 않고 삭제될 수 있습니다. 또한 픽셀 프로그램은 픽셀의 색상이 출력되지 않도록 결정할 수 있습니다.
렌더링된 인스턴스화된 삼각형은 present()
메서드를 호출할 때까지 뷰포트에 표시되지 않습니다. 각 present()
호출 후에는 첫 번째 drawTrianglesInstanced()
호출 전에 clear()
메서드를 호출해야 합니다. 그러지 않으면 렌더링이 실패합니다.
enableErrorChecking
이 false
이면 이 함수가 결과를 기다리지 않고 즉시 반환되며, 이 COntext3D 인스턴스가 삭제되었거나 그리기 호출이 너무 많은 경우에만 예외가 발생합니다. 렌더링 컨텍스트 상태가 유효하지 않은 경우 렌더링이 실패하며 오류는 발생하지 않습니다. enableErrorChecking
속성이 true
이면 삼각형이 그려진 후 이 함수가 반환되며 드로잉 오류 또는 잘못된 컨텍스트 상태에 대해 예외가 발생합니다.
인스턴스화된 버퍼가 SetVertexAt()
으로 잘못 시퀀싱되는 경우 이 메서드에서 예외가 발생할 수 있습니다. 예를 들어 Direct 3D 9의 경우 인덱싱된 도형 데이터와 그릴 인스턴스의 수를 항상 SetStreamSourceFreq()
API를 통해 스트림 0에 설정해야 합니다.
따라서 CreateVertexBufferForInstance()
를 사용하여 생성된 꼭지점 버퍼는 SetVertexBufferAt()
을 통해 꼭지점 셰이더 프로그램의 입력으로 정렬되는 경우 최소 인덱스 수로 배치되어서는 안 됩니다. CreateVertexBuffer()
를 사용하여 생성된 꼭지점 버퍼는 CreateVertexBufferForInstance()
의 경우보다 작은 인덱스 수로 배치해야 합니다. 일반적으로 도형 데이터는 SetVertexBufferAt()
을 통해 인스턴스별 데이터 앞에 배치해야 합니다.
매개 변수
indexBuffer:IndexBuffer3D — 렌더링할 꼭지점을 참조하는 꼭지점 인덱스 집합입니다.
| |
numInstances:int — 렌더링할 인스턴스의 수입니다.
| |
firstIndex:int (default = 0 ) — 렌더링하도록 선택된 첫 번째 꼭지점 인덱스의 인덱스입니다. 기본값은 0입니다.
| |
numTriangles:int (default = -1 ) — 렌더링할 삼각형 수입니다. 각 삼각형에는 세 개의 인덱스가 사용됩니다. 인덱스 버퍼에서 모든 삼각형을 그리려면 -1을 전달합니다. 기본값은 -1입니다.
|
오류
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
| |
Error — present() 호출 간에 이 메서드를 너무 많이 호출한 경우입니다. 최대 호출 횟수는 32,768입니다.
| |
Error — 표준 확장 프로파일 이상 필요: 요청된 프로파일이 표준 확장 프로파일 미만일 때 이 메서드가 호출되는 경우입니다.
| |
Error — 이 메서드가 음수 numInstances를 사용하여 호출되는 경우입니다.
다음 오류는 | |
Error — 그리기 전에 지워야 함: 마지막 present() 호출 이후 버퍼가 지워지지 않은 경우입니다.
| |
Error — 유효한 Program3D 객체가 설정되지 않은 경우입니다.
| |
Error — 유효한 인덱스 버퍼가 설정되지 않음: IndexBuffer3D 객체가 설정되지 않은 경우입니다.
| |
Error — 매개 변수에 대한 상태 검사에 실패함: 그릴 삼각형 수나 firstIndex 가 허용되는 값을 초과한 경우입니다.
| |
RangeError — 버퍼에 있는 인덱스가 충분하지 않음: 버퍼에 있는 인덱스가 충분하지 않아서 그릴 삼각형 수를 정의할 수 없는 경우입니다.
| |
Error — 샘플에서 바인딩하는 텍스처가 렌더링에도 바인딩된 되어 있음: 렌더링 대상이 텍스처이고 해당 텍스처가 현재 조각 프로그램의 텍스처 입력에 할당된 경우입니다.
| |
Error — 샘플에서 잘못된 텍스처를 바인딩함: 잘못된 텍스처가 현재 조각 프로그램의 입력으로 지정된 경우입니다.
| |
Error — 샘플러 형식이 텍스처 형식과 일치하지 않음: 현재 조각 프로그램에 대한 입력으로 할당된 텍스처의 형식이 샘플러 레지스터에 지정된 형식과 다른 경우입니다. 예를 들어 2D 텍스처가 정육면체 텍스처 샘플러에 할당된 경우입니다.
| |
Error — 샘플에서 정의되지 않은 텍스처를 바인딩함: 현재 조각 프로그램이 setTextureAt() 을 사용하여 설정되지 않은 텍스처 레지스터에 액세스합니다.
| |
Error — 텍스처가 같으면 샘플러 매개 변수도 같아야 함: 텍스처가 둘 이상의 샘플러 레지스터에 사용될 경우 모든 샘플러의 설정이 동일해야 합니다. 예를 들어 한 샘플러는 clamp로 설정하고 다른 샘플러는 wrap으로 설정할 수 없습니다.
| |
Error — 텍스처가 바인딩되었지만 사용되지 않음: 텍스처가 셰이더 입력으로 설정되었지만 사용되지 않습니다.
| |
Error — 스트림이 사용되지 않음: 꼭지점 버퍼가 꼭지점 특성 입력에 할당되었지만 꼭지점 프로그램이 해당 레지스터를 참조하지 않습니다.
| |
Error — 스트림이 유효하지 않음: 꼭지점 프로그램 입력에 할당된 VertexBuffer3D 객체가 유효한 객체가 아닙니다.
| |
RangeError — 스트림에 꼭지점이 충분하지 않음: 지정된 삼각형을 그리기 위한 데이터를 제공하는 꼭지점 버퍼에 데이터가 충분하지 않습니다.
| |
RangeError — 스트림 꼭지점 오프셋이 경계를 벗어남: setVertexBufferAt() 호출에 지정된 오프셋이 음수이거나 버퍼의 끝을 지났습니다.
| |
Error — 스트림이 읽히지만 설정되지 않음: 현재 꼭지점 프로그램에 사용되는 꼭지점 특성이 setVertexBufferAt() 를 사용하여 설정되지 않았습니다.
| |
Error — 꼭지점 버퍼 스트림에 인스턴스를 위한 충분한 요소가 포함되지 않음: 꼭지점 버퍼 스트림에 인스턴스의 수를 위한 충분한 요소가 포함되지 않는 경우입니다.
| |
Error — 인스턴스에 대한 버퍼 꼭지점 스트림의 최소 인덱스 특성 레지스터가 잘못 설정됨: CreateVertexBuffer() 를 사용하여 생성된 꼭지점 버퍼에 지정된 인덱스 수가 CreateVertexBufferForInstance() 를 사용하여 생성된 꼭지점 버퍼의 인덱스 수보다 큰 경우입니다.
|
관련 API 요소
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
예제 ( 예제 사용 방법 )
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 | () | 메서드 |
public function present():void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
백 렌더링 버퍼를 표시합니다.
present()
메서드를 호출하면 마지막 present()
를 호출한 이후의 모든 렌더링 작업 결과를 볼 수 있고 새 렌더링 주기가 시작됩니다. present
를 호출한 후 다른 drawTriangles()
호출을 수행하기 전에 clear()
를 호출해야 합니다. 그렇지 않으면 이 함수는 렌더링 버퍼를 노란색 및 녹색으로 번갈아가며 지우거나, enableErrorChecking
이 true
로 설정된 경우 예외가 발생합니다.
또한 present()
를 호출하면 setRenderToBackBuffer()
를 호출하는 것과 같이 렌더링 대상이 재설정됩니다.
오류
Error — 그리기 전에 지워야 함: 이전의 present() 를 호출한 이후에 clear() 가 호출되지 않은 경우입니다. present() 두 개를 연속해서 호출할 수는 없으며 중간에 clear() 를 호출해야 합니다.
| |
Error — 3768: 백그라운드에서 실행되는 동안 Stage3D API는 사용할 수 없습니다.
|
setBlendFactors | () | 메서드 |
public function setBlendFactors(sourceFactor:String, destinationFactor:String):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
기존 색상을 사용한 그리기 작업의 출력 색상을 블렌딩하는 데 사용하는 인수를 지정합니다.
픽셀 셰이더 프로그램의 출력(소스) 색상은 다음 공식에 따라 해당 픽셀에서 기존(대상) 색상과 결합니다.
result color = (source color * sourceFactor) + (destination color * destinationFactor)
대상 색상은 렌더링 버퍼에 있는 해당 픽셀의 현재 색상입니다. 그러므로 이는 가장 최근의 clear()
호출과 모든 중간 drawTriangles()
호출의 결과입니다.
소스 색상과 대상 색상을 서로 더하기 전에 곱하는 데 사용할 인수를 설정하려면 setBlendFactors()
를 사용합니다. 기본 블렌드 인수는 sourceFactor = Context3DBlendFactor.ONE
및 destinationFactor = Context3DBlendFactor.ZERO
이며 결과적으로 소스 색상이 대상 색상을 덮어씁니다. 다시 말해 두 색상이 혼합되지 않습니다. 일반 알파 블렌딩에는 sourceFactor = Context3DBlendFactor.SOURCE_ALPHA
및 destinationFactor = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA
를 사용합니다.
이 함수의 매개 변수를 설정하려면 Context3DBlendFactor 클래스에 정의된 상수를 사용합니다.
매개 변수
sourceFactor:String — 소스 색상에 곱하는 인수입니다. 기본값은 Context3DBlendFactor.ONE 입니다.
| |
destinationFactor:String — 대상 색상에 곱하는 인수입니다. 기본값은 Context3DBlendFactor.ZERO 입니다.
|
오류
Error — 잘못된 열거형: sourceFactor 또는 destinationFactor 가 인식되는 값 중 하나가 아닌 경우입니다. 인식되는 값은 Context3DBlendFactor 클래스에 정의되어 있습니다.
|
관련 API 요소
예제 ( 예제 사용 방법 )
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 | () | 메서드 |
public function setColorMask(red:Boolean, green:Boolean, blue:Boolean, alpha:Boolean):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
렌더링 버퍼에 색상을 기록할 때 사용하는 마스크를 설정합니다.
해당하는 색상 마스크 매개 변수가 true
인 색상 구성 요소만 색상이 렌더링 버퍼에 기록될 때 업데이트됩니다. 예를 들어 setColorMask( true, false, false, false )
를 호출하면 색상 마스크를 다시 변경할 때까지 색상의 빨강 구성 요소만 버퍼에 기록됩니다. 색상 마스크는 clear()
메서드의 비헤이비어에 영향을 미치지 않습니다.
매개 변수
red:Boolean — 빨강 채널에 대한 변경을 차단하려면 false 를 설정합니다.
| |
green:Boolean — 녹색 채널에 대한 변경을 차단하려면 false 를 설정합니다.
| |
blue:Boolean — 파랑 채널에 대한 변경을 차단하려면 false 를 설정합니다.
| |
alpha:Boolean — 알파 채널에 대한 변경을 차단하려면 false 를 설정합니다.
|
예제 ( 예제 사용 방법 )
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 | () | 메서드 |
public function setCulling(triangleFaceToCull:String):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
삼각형 컬링 모드를 설정합니다.
뷰 평면 기준 방향에 기초하여 렌더링 파이프라인의 초기에 삼각형이 장면에서 제외될 수 있습니다. 올바르게 컬링하도록 모델 외부에서 볼 때처럼 꼭지점 순서를 일관되게(시계 방향 또는 시계 반대 방향) 지정합니다.
매개 변수
triangleFaceToCull:String — 컬링 모드입니다. Context3DTriangleFace 클래스에 정의된 상수 중 하나를 사용합니다.
|
오류
Error — 잘못된 열거형 오류: triangleFaceToCull 이 Context3DTriangleFace 클래스에 정의된 값 중 하나가 아닌 경우입니다.
|
관련 API 요소
setDepthTest | () | 메서드 |
public function setDepthTest(depthMask:Boolean, passCompareMode:String):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
심도 테스트에 사용되는 비교 유형을 설정합니다.
픽셀 셰이더 프로그램의 소스 픽셀 출력 심도가 심도 버퍼에 있는 현재 값과 비교됩니다. 비교가 false
로 평가되면 소스 픽셀은 삭제되고, true
이면 렌더링 파이프라인의 다음 단계인 스텐실 테스트에서 소스 픽셀이 처리됩니다. 또한 depthMask
매개 변수가 true
로 설정되어 있는 한 심도 버퍼는 소스 픽셀의 심도로 업데이트됩니다.
소스 및 대상 픽셀의 심도 값을 비교하는 데 사용되는 테스트를 설정합니다. 비교가 true인 경우 소스 픽셀은 대상 픽셀과 합성됩니다. 비교 연산자는 소스 및 대상 픽셀 값 사이의 중위 연산자로 해당 순서대로 적용됩니다.
매개 변수
depthMask:Boolean — true인 경우 소스 픽셀에서 대상 심도 값이 업데이트됩니다.
| |
passCompareMode:String — 심도 비교 테스트 작업입니다. Context3DCompareMode 값 중 하나입니다.
|
관련 API 요소
setFillMode | () | 메서드 |
setProgram | () | 메서드 |
public function setProgram(program:Program3D):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
후속 렌더링에 사용할 꼭지점 및 조각 셰이더 프로그램을 설정합니다.
매개 변수
program:Program3D — 사용할 꼭지점 및 조각 프로그램을 나타내는 Program3D 객체입니다.
|
관련 API 요소
예제 ( 예제 사용 방법 )
renderContext
객체는 Context3D 클래스의 인스턴스입니다. 예제의 프로그램은 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 | () | 메서드 |
public function setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11.1, AIR 3.1 |
ByteArray
에 저장된 값을 사용하여 셰이더 프로그램에 사용할 상수를 설정합니다.
꼭지점 또는 조각 프로그램에서 액세스할 수 있는 상수를 설정합니다.
매개 변수
programType:String — Context3DProgramType 중 하나입니다.
| |
firstRegister:int — 설정할 첫 번째 셰이더 프로그램 상수의 인덱스입니다.
| |
numRegisters:int — 설정할 레지스터 수입니다. 모든 레지스터는 네 개의 float 값으로 읽힙니다.
| |
data:ByteArray — 소스 ByteArray 객체
| |
byteArrayOffset:uint — 읽기를 위한 ByteArray에 대한 오프셋
|
오류
TypeError — data 가 null인 경우 kNullPointerError입니다.
| |
RangeError — 최대 셰이더 상수 수를 초과하여 설정하려고 한 경우 kConstantRegisterOutOfBounds입니다.
| |
RangeError — byteArrayOffset 이 data 의 길이보다 크거나 같거나, data - byteArrayOffset 의 요소 수가 numRegisters *16보다 작은 경우 kBadInputSize입니다.
|
관련 API 요소
setProgramConstantsFromMatrix | () | 메서드 |
public function setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
Matrix3D
에 저장된 값을 사용하여 셰이더 프로그램에 사용할 상수를 설정합니다.
이 함수를 사용하여 행렬을 셰이더 프로그램에 전달합니다. 이 함수는 꼭지점 또는 조각 프로그램에 사용되는 네 개의 상수 레지스터를 설정합니다. 행렬은 레지스터에 행별로 할당됩니다. 첫 번째 상수 레지스터에는 행렬의 맨 위 행이 할당됩니다. 꼭지점 프로그램에 128개의 레지스터를 설정하고 조각 프로그램에 28개의 레지스터를 설정할 수 있습니다.
매개 변수
programType:String — 셰이더 프로그램의 유형인 Context3DProgramType.VERTEX 또는 Context3DProgramType.FRAGMENT 입니다.
| |
firstRegister:int — 설정할 첫 번째 상수 레지스터의 인덱스입니다. Matrix3D에 16개의 값이 있으므로 네 개의 레지스터가 설정됩니다.
| |
matrix:Matrix3D — 상수 값을 포함하는 행렬입니다.
| |
transposedMatrix:Boolean (default = false ) — true 인 경우 행렬 항목은 전치된 순서로 레지스터에 복사됩니다. 기본값은 false 입니다.
|
오류
TypeError — Null 포인터 오류: matrix 가 null인 경우입니다.
| |
RangeError — 상수 레지스터가 경계를 벗어남: 최대 개수의 셰이더 상수 레지스터를 초과하여 설정하려는 경우입니다.
|
추가 정보
관련 API 요소
setProgramConstantsFromVector | () | 메서드 |
public function setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
셰이더 프로그램에 대한 상수 입력을 설정합니다.
꼭지점 또는 조각 셰이더 프로그램에서 액세스할 상수 배열을 설정합니다. Program3D에서 설정된 상수는 셰이더 프로그램 내에서 상수 레지스터로 액세스합니다. 각 상수 레지스터는 4개의 부동 소수점 값(x, y, z, w)으로 구성됩니다. 따라서 모든 레지스터는 데이터 벡터에 네 개의 항목이 필요합니다. 꼭지점 프로그램 및 프래그먼트 프로그램에 대해 설정할 수 있는 레지스터 수는 Context3DProfile
에 따라 다릅니다.
매개 변수
programType:String — 셰이더 프로그램의 유형인 Context3DProgramType.VERTEX 또는 Context3DProgramType.FRAGMENT 입니다.
| |
firstRegister:int — 설정할 첫 번째 상수 레지스터의 인덱스입니다.
| |
data:Vector.<Number> — 부동 소수점 상수 값입니다. data 에는 최소한 네 개의 numRegisters 요소가 있어야 합니다.
| |
numRegisters:int (default = -1 ) — 설정할 상수 수입니다. 사용 가능한 모든 데이터를 사용하도록 충분한 레지스터를 설정하려면 기본값인 -1을 지정합니다.
|
오류
TypeError — Null 포인터 오류: data 가 null 인 경우입니다.
| |
RangeError — 상수 레지스터가 경계를 벗어남: 최대 개수의 셰이더 상수 레지스터를 초과하여 설정하려는 경우입니다.
| |
RangeError — 잘못된 입력 크기: data 의 요소 수가 numRegisters *4보다 작은 경우입니다.
|
추가 정보
관련 API 요소
setRenderToBackBuffer | () | 메서드 |
public function setRenderToBackBuffer():void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
백 렌더링 버퍼를 렌더링 대상으로 설정합니다. 이후에 drawTriangles()
및 clear()
메서드를 호출하면 백 버퍼가 업데이트됩니다. setRenderToTexture()
메서드를 사용한 후 이 메서드를 사용하여 일반 렌더링을 다시 시작합니다.
setRenderToTexture | () | 메서드 |
public function setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
지정된 텍스처를 렌더링 대상으로 설정합니다.
이후에 drawTriangles()
및 clear()
메서드를 호출하면 백 버퍼 대신에 지정된 텍스처가 업데이트됩니다. 밉맵은 자동으로 만들어집니다. setRenderToBackBuffer()
를 사용하여 백 버퍼로의 일반 렌더링을 다시 시작합니다.
그리기 전에 어떠한 지우기도 필요 없습니다. 지우기 작업이 없는 경우 내용 렌더링이 유지됩니다. 심도 버퍼 및 스텐실 버퍼 또한 지워지지 않게 됩니다. 하지만 처음에 그리는 경우 지우기가 적용됩니다. present()
를 호출하면 대상이 백 버퍼로 재설정됩니다.
매개 변수
texture:flash.display3D.textures:TextureBase — 렌더링할 대상 텍스처입니다. 백 버퍼로 렌더링을 다시 시작하려면 null 로 설정합니다(setRenderToBackBuffer() 및 present 도 대상을 백 버퍼로 재설정함).
| |
enableDepthAndStencil:Boolean (default = false ) — true 이면 심도 및 스텐실 테스트를 사용할 수 있습니다. false 이면 후속 그리기 작업에서 모든 심도 및 스텐실 상태가 무시됩니다.
| |
antiAlias:int (default = 0 ) — 앤티앨리어싱 품질입니다. 앤티앨리어싱을 비활성화하려면 0을 사용합니다. 값이 높을수록 앤티앨리어싱 품질이 향상되지만 더 많은 계산이 필요합니다. 값은 현재 모바일 플랫폼 및 소프트웨어 렌더링 컨텍스트에서 무시됩니다.
| |
surfaceSelector:int (default = 0 ) — 업데이트할 텍스처의 요소를 지정합니다. 텍스트 객체에 하나의 표면이 있으므로 기본값인 0을 지정해야 합니다. CubeTexture 객체에는 6개의 표면이 있으므로 0부터 5까지의 정수를 지정할 수 있습니다.
| |
colorOutputIndex:int (default = 0 ) — 출력 색상 레지스터입니다. 제한된 모드 또는 기준선 모드의 경우 0이어야 합니다. 그렇지 않으면 출력 색상 레지스터를 지정합니다.
|
오류
ArgumentError — surfaceSelector 매개 변수가 일치하지 않는 경우입니다. 값은 2D 텍스처의 경우 0이고, 정육면체 맵의 경우 0에서 5 사이여야 합니다.
| |
ArgumentError — texture 는 TextureBase 클래스(Texture 또는 CubeTexture 클래스)에서 파생되지 않습니다.
| |
ArgumentError — colorOutputIndex 는 0부터 3까지의 정수여야 합니다.
| |
ArgumentError — 이 호출에는 표준 프로파일 이상으로 만든 Context3D 가 필요합니다.
|
관련 API 요소
setSamplerStateAt | () | 메서드 |
public function setSamplerStateAt(sampler:int, wrap:String, filter:String, mipfilter:String):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11.6, AIR 3.6 |
텍스처 샘플러 상태를 수동으로 재정의합니다..
텍스처 샘플링 상태는 일반적으로 setProgram
이 호출될 때 설정됩니다. 그러나 이 함수를 사용하여 텍스처 샘플러 상태를 재정의할 수 있습니다. 프로그램이 샘플러 상태를 변경하지 않도록 하려면 AGAL에서 ignoresamnpler
비트를 설정하고 이 함수를 사용하십시오.
매개 변수
sampler:int — 사용할 샘플러 레지스터입니다. AGAL의 샘플러 레지스터에 매핑됩니다.
| |
wrap:String — 래핑 모드입니다. Context3DWrapMode 에서 정의됩니다. 기본값은 repeat입니다.
| |
filter:String — 텍스처 필터링 모드입니다. Context3DTextureFilter 에서 정의됩니다. 기본값은 nearest입니다.
| |
mipfilter:String — 밉 맵 필터입니다. Context3DMipFilter 에서 정의됩니다. 기본값은 none입니다.
|
오류
Error — 샘플러가 범위를 벗어남
| |
Error — 래핑, 필터, 밉필터의 잘못된 열거형
| |
Error — 객체 삭제됨: dispose() 를 호출했거나 기본 렌더링 하드웨어가 손실되어 이 Context3D 객체가 삭제된 경우입니다.
|
관련 API 요소
setScissorRectangle | () | 메서드 |
public function setScissorRectangle(rectangle:Rectangle):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
드로잉 마스크의 한 유형인 자르기 사각형을 설정합니다. 렌더러는 자르기 사각형 안의 영역에만 그립니다. 자르기는 지우기 작업에 영향을 주지 않습니다.
자르기를 해제하려면 null
을 전달합니다.
매개 변수
rectangle:Rectangle — 안에 그릴 사각형입니다. 사각형 위치와 크기를 픽셀 단위로 지정합니다. 좌표계 원점은 뷰포트의 왼쪽 위 모서리이고 양수 값이 증가할수록 오른쪽 아래로 내려갑니다(일반 Flash 표시 좌표계와 동일).
|
예제 ( 예제 사용 방법 )
삼각형은 꼭지점 버퍼와 인덱스 버퍼를 사용하여 정의됩니다. 꼭지점 버퍼는 각 삼각형 꼭지점의 위치와 색상 정보를 포함합니다. 인덱스 버퍼는 꼭지점 버퍼에 대한 인덱스를 포함합니다. 세 개의 인덱스가 삼각형 하나를 정의합니다. 예를 들어 꼭지점 버퍼의 처음 세 점으로 구성된 삼각형은 인덱스 버퍼에서 0,1,2로 나열됩니다.
이 간단한 예제에서는 3D 변형을 수행하지 않습니다. 정규화된 시야 영역(원점을 중심으로 하는 2x2x2 정육면체) 내의 객체만 표시됩니다. 그러나 일반적인 3D 장면을 렌더링할 때는 렌더링할 객체를 원근 또는 직각 투영을 사용하여 이 시야 영역에 투영합니다.
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 | () | 메서드 |
public function setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
스텐실 모드 및 작업을 설정합니다.
8비트 스텐실 참조 값은 각 그리기 호출과 연결할 수 있습니다. 렌더링 도중 이전에 프레임 버퍼에 저장된 값과 비교하여 참조 값을 테스트할 수 있습니다. 테스트의 결과로 그리기 액션을 제어하고 저장된 스텐실 값의 업데이트 여부 또는 방법을 제어할 수 있습니다. 또한 심도 테스트는 스텐실 테스트가 수행되는지 여부를 제어합니다. 실패한 심도 테스트를 사용하여 스텐실 버퍼에 수행할 액션을 제어할 수도 있습니다.
픽셀 처리 파이프라인에서 심도 테스트가 먼저 수행됩니다. 심도 테스트에 실패할 경우 스텐실 버퍼 업데이트 액션이 수행될 수 있지만 스텐실 버퍼 값의 평가를 더 이상 수행할 수 없습니다. 심도 테스트에 성공할 경우 스텐실 테스트가 수행됩니다. 스텐실 테스트의 결과에 따라 대체 액션이 수행될 수 있습니다.
스텐실 참조 값은 setStencilReferenceValue()
를 사용하여 설정합니다.
매개 변수
triangleFace:String (default = "frontAndBack ") — 스텐실 작업을 구성하도록 허용되는 삼각형의 방향입니다. Context3DTriangleFace 중 하나입니다.
| |
compareMode:String (default = "always ") — 현재 스텐실 참조 값과 대상 픽셀 스텐실 값을 비교하는 데 사용되는 테스트 연산자입니다. 비교가 true인 경우 대상 픽셀 색상 및 심도 업데이트가 수행됩니다. 스텐실 액션은 다음 액션 매개 변수에서 요청 시 수행됩니다. 비교 연산자는 현재 및 대상 참조 값 사이의 중위 연산자로 해당 순서대로 적용됩니다(의사 코드: if stencilReference OPERATOR stencilBuffer then pass ). Context3DCompareMode 클래스에 정의된 상수 중 하나를 사용합니다.
| |
actionOnBothPass:String (default = "keep ") — 심도 및 스텐실 비교에 모두 성공할 경우 수행할 액션입니다. Context3DStencilAction 클래스에 정의된 상수 중 하나를 사용합니다.
| |
actionOnDepthFail:String (default = "keep ") — 심도 비교에 실패할 경우 수행할 액션입니다. Context3DStencilAction 클래스에 정의된 상수 중 하나를 사용합니다.
| |
actionOnDepthPassStencilFail:String (default = "keep ") — 심도 비교에 성공하고 스텐실 비교에 실패할 경우 수행할 액션입니다. Context3DStencilAction 클래스에 정의된 상수 중 하나를 사용합니다.
|
오류
Error — 잘못된 열거형 오류: triangleFace 가 Context3DTriangleFace 클래스에 정의된 값 중 하나가 아닌 경우입니다.
| |
Error — 잘못된 열거형 오류: compareMode 가 Context3DCompareMode 클래스에 정의된 값 중 하나가 아닌 경우입니다.
| |
Error — 잘못된 열거형 오류: actionOnBothPass , actionOnDepthFail 또는 actionOnDepthPassStencilFail 이 Context3DStencilAction 클래스에 정의된 값 중 하나가 아닌 경우입니다.
|
관련 API 요소
예제 ( 예제 사용 방법 )
- 스텐실 버퍼를 0으로 지웁니다.
- 스텐실 테스트에 통과하면 스텐실 액션을 increment로 설정합니다.
- 스텐실 참조 값을 0으로 설정합니다.
- 삼각형 마스크를 그립니다. 스텐실 버퍼가 0으로 지워졌고 참조 값이 0이므로 삼각형이 그려질 때마다 스텐실 테스트에 통과합니다. 따라서 스텐실 버퍼는 삼각형 마스크가 그려지는 경우 1로 증가합니다.
- 후속 그리기 작업으로 인해 스텐실 버퍼가 변경되지 않도록 스텐실 액션을 keep으로 변경합니다.
- 전체 화면 사각형(여러 색상 지정)을 그립니다. 스텐실 참조 값이 여전히 0이므로 마스크 처리된 영역에서는 스텐실 테스트가 실패합니다. 따라서 사각형이 마스크 처리된 영역을 제외한 모든 영역에 그려집니다.
- 스텐실 참조 값을 1으로 변경합니다.
- 다른 전체 화면 사각형(빨간색)을 그립니다. 이제 1로 증가한 마스크 처리된 영역을 제외한 모든 영역에서 스텐실 테스트가 실패합니다. 따라서 사각형은 마스크 처리된 영역에만 그려집니다.
예제 위에 마우스를 갖다 대면 주요 단계를 순서대로 확인할 수 있습니다.
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 | () | 메서드 |
public function setStencilReferenceValue(referenceValue:uint, readMask:uint = 255, writeMask:uint = 255):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
스텐실 테스트에 사용되는 스텐실 비교 값을 설정합니다.
참조 값의 하위 8비트만 사용됩니다. 스텐실 버퍼 값도 역시 8비트 길이입니다. 비트 필드로 스텐실 버퍼를 사용하려면 readMask
및 writeMask
를 사용합니다.
매개 변수
referenceValue:uint — 참조 값 비교 테스트에 사용되는 8비트 참조 값입니다.
| |
readMask:uint (default = 255 ) — 비교 이전에 현재 스텐실 버퍼 값과 참조 값 모두에 적용할 8비트 마스크입니다.
| |
writeMask:uint (default = 255 ) — 스텐실 버퍼를 업데이트하기 전에 참조 값에 적용할 8비트 마스크입니다.
|
관련 API 요소
setTextureAt | () | 메서드 |
public function setTextureAt(sampler:int, texture:flash.display3D.textures:TextureBase):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
조각 프로그램의 텍스처 입력 레지스터에 사용할 텍스처를 지정합니다.
조각 프로그램은 최대 8개의 텍스처 객체에서 정보를 읽을 수 있습니다. 이 함수를 사용하여 조각 프로그램에 사용되는 샘플러 레지스터 중 하나에 Texture 또는 CubeTexture 객체를 할당합니다.
참고: setProgram
을 사용하여 활성 조각 프로그램을 더 적은 텍스처를 사용하는 셰이더로 변경할 경우 사용되지 않는 레지스터를 null
로 설정합니다.
setTextureAt( 7, null );
매개 변수
sampler:int — 0부터 7까지의 값인 샘플러 레지스터 인덱스입니다.
| |
texture:flash.display3D.textures:TextureBase — 사용 가능하게 만들 텍스처 객체입니다(Texture 또는 CubeTexture 인스턴스).
|
추가 정보
관련 API 요소
CubeTexture
setVertexBufferAt | () | 메서드 |
public function setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | Flash Player 11, AIR 3 |
단일 꼭지점 셰이더 프로그램 입력에 해당하는 꼭지점 데이터 구성 요소를 지정합니다.
setVertexBufferAt
메서드를 사용하여 VertexBuffer3D 버퍼의 각 꼭지점에 정의된 데이터의 구성 요소와 해당 구성 요소가 속해 있는 꼭지점 프로그램에 대한 입력을 식별합니다. 꼭지점 프로그램의 개발자는 꼭지점당 필요한 데이터 양을 결정합니다. 해당 데이터는 하나 이상의 VertexBuffer3D
스트림에서 꼭지점 셰이더 프로그램의 특성 레지스터에 매핑됩니다.
꼭지점 셰이더가 사용하는 가장 작은 데이터 단위는 32비트 데이터입니다. 꼭지점 스트림에 대한 오프셋은 32비트의 배수로 지정됩니다.
예를 들어 프로그래머가 다음 데이터를 사용하여 각 꼭지점을 정의한다고 가정할 수 있습니다.position: x float32 y float32 z float32 color: r unsigned byte g unsigned byte b unsigned byte a unsigned byte꼭지점이
buffer
라는 VertexBuffer3D 객체에 정의되었다는 가정하에 다음 코드를 사용하여 꼭지점 셰이더에 할당할 수 있습니다.
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
매개 변수
index:int — 꼭지점 셰이더에 있는 특성 레지스터의 인덱스입니다(0-7).
| |
buffer:VertexBuffer3D — 꼭지점 셰이더에 제공할 소스 꼭지점 데이터를 포함하는 버퍼입니다.
| |
bufferOffset:int (default = 0 ) — 이 특성의 읽기를 시작할 단일 꼭지점의 데이터 시작 부분에서의 오프셋입니다. 위 예제에서 위치 데이터는 첫 번째 특성이므로 오프셋이 0이고 색상 특성 뒤에 세 개의 32비트 위치 값이 오므로 색상의 오프셋은 3입니다. 이 오프셋은 32비트 단위로 지정됩니다.
| |
format:String (default = "float4 ") — 이 특성의 데이터 유형을 지정하는 Context3DVertexBufferFormat 클래스 값입니다.
|
오류
Error — 잘못된 열거형: 형식이 Context3DVertexBufferFormat 클래스에 정의된 값 중 하나가 아닌 경우입니다.
| |
RangeError — 특성 레지스터가 경계를 벗어남: index 매개 변수가 0-7 범위를 벗어난 경우입니다. 최대 8개의 꼭지점 특성 레지스터가 셰이더에 사용될 수 있습니다.
|
추가 정보
관련 API 요소
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, 03:17 PM Z