Пакет | flash.display3D |
Класс | public final class Context3D |
Наследование | Context3D EventDispatcher Object |
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11, AIR 3 |
Контекст визуализации включает поверхность рисунка, а также связанные с ней ресурсы и состояние. Когда это возможно, контекст визуализации использует аппаратный графический процессор. В противном случае используется программное обеспечение. (Если платформа не поддерживает визуализацию через Context3D, свойство stage3Ds
объекта Stage содержит пустой список.)
Контекст визуализации Context3D — это программируемый канал, который очень похож на OpenGL ES 2, но является абстрактным, что делает его совместимым с разными интерфейсами оборудования и графических процессоров. Хотя канал визуализации разработан для 3D-графики, визуализация не обязательно должна быть трехмерной. Таким образом можно создать 2D-визуализатор, предоставив соответствующие программы вершинных и пиксельных фрагментных шейдеров. И при 3D-, и при 2D-визуализации единственным поддерживаемым геометрическим примитивом является треугольник.
Получите экземпляр класса Context3D, вызвав метод requestContext3D()
для объекта Stage3D. В одной рабочей области может существовать ограниченное число объектов Context3D; по одному для каждого объекта Stage3D в списке Stage.stage3Ds
. Когда создается контекст, объект Stage3D отправляет событие context3DCreate
. Контекст визуализации можно в любое время уничтожать и воссоздавать, например, когда фокус получает другое приложение, использующее графический процессор. В коде необходимо предусмотреть получение нескольких событий context3DCreate
. Расположите область визуализации в рабочей области с использованием свойств x
и y
связанного экземпляра Stage3D.
Чтобы визуализировать и отобразить сцену (после получения объекта Context3D), обычно требуется выполнить следующие действия.
- Настройте атрибуты буфера главного дисплея, вызвав метод
configureBackBuffer()
. - Создайте и инициализируйте ресурсы визуализации, включая:
- буферы вершин и индексов, определяющие геометрию сцены;
- вершинные и пиксельные программы (шейдеры) для визуализации сцены;
- текстуры;
- Визуализируйте кадр.
- Задайте необходимое состояние средства визуализации для объекта или коллекции объектов в сцене.
- Вызовите метод
drawTriangles()
для визуализации набора треугольников. - Измените состояние визуализации для следующей группы объектов.
- Вызовите метод
drawTriangles()
для отрисовки треугольников, определяющих объекты. - Повторяйте эти действия, пока сцена не будет визуализирована полностью.
- Вызовите метод
present()
для отображения визуализированной сцены на рабочей области.
При визуализации применяются перечисленные ниже ограничения.
Ограничение ресурсов:
Ресурс | Разрешенное число | Общая память |
---|---|---|
Vertex buffers
| 4096 | 256 МБ |
Index buffers
| 4096 | 128 МБ |
Programs
| 4096 | 16 МБ |
Textures
| 4096 | 128 МБ |
Cube textures
| 4096 | 256 МБ |
Ограничения AGAL: 200 кодов операций на программу.
Ограничение вызова методов рисования: 32 768 вызовов метода drawTriangles()
на каждый вызов present()
.
К текстурам применяются перечисленные ниже ограничения.
Ограничения текстур для 32-разрядной версии AIR:
Текстура | Максимальный размер | Общая память графического процессора |
---|---|---|
Обычная текстура (ниже базового расширенного профиля)
| 2048 x 2048 | 512 МБ |
Обычная текстура (базовый расширенный профиль и профиль более высокого уровня)
| 4096 x 4096 | 512 МБ |
Прямоугольная текстура (ниже базового расширенного профиля)
| 2048 x 2048 | 512 МБ |
Прямоугольная текстура (базовый расширенный профиль и профиль более высокого уровня)
| 4096 x 4096 | 512 МБ |
Кубическая текстура
| 1024 x 1024 | 256 МБ |
Ограничения текстур для 64-разрядной версии AIR (настольный ПК):
Текстура | Максимальный размер | Общая память графического процессора |
---|---|---|
Обычная текстура (ниже базового расширенного профиля)
| 2048 x 2048 | 512 МБ |
Обычная текстура (от базового расширенного профиля до стандартного)
| 4096 x 4096 | 512 МБ |
Обычная текстура (расширенный стандартный профиль и профиль более высокого уровня)
| 4096 x 4096 | 2048 МБ |
Прямоугольная текстура (ниже базового расширенного профиля)
| 2048 x 2048 | 512 МБ |
Прямоугольная текстура (от базового расширенного профиля до стандартного)
| 4096 x 4096 | 512 МБ |
Прямоугольная текстура (стандартный расширенный профиль и профиль более высокого уровня)
| 4096 x 4096 | 2048 МБ |
Кубическая текстура
| 1024 x 1024 | 256 МБ |
512 MБ — это абсолютный предел для текстур, включая память текстур, необходимую для множественных отображений. Однако для граней кубической текстуры, ограничение памяти составляет 256 МБ.
Нельзя создавать объекты 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 приложения. Когда ресурсный объект графического процессора создан, использованная память хранится в 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 не установлен флажок «Включить аппаратное ускорение».
- "Software Hw_disabled=oldDriver". Существуют известные проблемы с драйвером графики аппаратных средств. Эту проблему можно решить обновлением графического драйвера.
- "Software Hw_disabled=unavailable". Известные проблемы с драйвером графики аппаратных средств или сбой инициализации графического адаптера.
- "Software Hw_disabled=explicit". Содержимое явно запросило программную визуализацию с помощью события requestContext3D.
- "Software Hw_disabled=domainMemory" — в содержимом используется параметр domainMemory, для которого требуется лицензия при использовании с аппаратной визуализацией Stage3D. Перейдите по адресу adobe.com/go/fpl_ru.
Реализация
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 приложения.
Когда ресурсный объект графического процессора создан, использованная память хранится в Context3D. Эта память включает в себя буферы индексов, буферы вершин, текстуры (за исключением текстур видео) и программы, созданные при помощи этого объекта Context3D.
API-интерфейсtotalGPUMemory
возвращает пользователю общий объем памяти, использованной вышеперечисленными ресурсами. Возвращенное значение по умолчанию равно 0. Общий объем возвращенной памяти графического процессора измеряется в байтах. Информация предоставляется только в режиме direct на мобильных устройствах и в режимах direct и 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
. Используйте побитовый оператор OR (ИЛИ), «|», для добавления нескольких буферов в маску (или используйте Context3DClearMask.ALL
). При визуализации в заднем буфере метод configureBackBuffer()
должен вызываться перед любыми вызовами метода clear()
.
Примечание. Если для параметра задается значение за пределами разрешенного диапазона, числовые значения параметра ограничиваются до диапазона от 0 до 1 (без уведомления). Подобным образом, если значение stencil
больше 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 — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — 3768: API-интерфейс Stage3D не может использоваться во время выполнения в фоновом режиме.
|
Связанные элементы 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 создает буфер глубины и трафаретов. Для приложения AIR 3.2 или более поздней версии, скомпилированного с использованием SWF 15 или более поздней версии: если значение элемента renderMode в файле дескриптора приложения равно direct , то значение элемента depthAndStencil в файле дескриптора приложения должно совпадать со значением данного аргумента. По умолчанию значение элемента depthAndStencil равно false .
| |||||||||
wantsBestResolution:Boolean (default = false ) — true обозначает, что в случае, если устройство поддерживает экраны HiDPI, оно попытается выделить более крупный задний буфер, для которого указаны параметры ширины и высоты. Так как это значение добавляет больше пикселей и может изменить результат операций шейдера, оно выключено по умолчанию. Используйте Stage.contentsScaleFactor, чтобы определить, насколько был расширен встроенный задний буфер.
| |||||||||
wantsBestResolutionOnBrowserZoom:Boolean (default = false ) — Значение true указывает, что размер заднего буфера должен увеличиваться пропорционально увеличению коэффициенту масштабирования браузера. Это значение не изменяется при изменении масштаба браузера. По умолчанию параметр имеет значение false . Воспользуйтесь свойствами maxBackBufferWidth и maxBackBufferHeight , чтобы ограничить увеличение размера заднего буфера. Свойства backBufferWidth и backBufferHeight помогут определить текущий размер заднего буфера.
|
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Неверный размер ввода: ширины или высоты меньше, чем минимально допустимого размера буфера невидимых поверхностей или больше его максимально допустимого размера.
| |
Error — 3709: значение флага depthAndStencil в дескрипторе приложения должно совпадать с булевым значением параметра enableDepthAndStencil , переданным в метод configureBackBuffer() объекта Context3D.
|
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 для загрузки растровых изображений кубических текстур в контекст визуализации и для ссылки на кубическую текстуру во время визуализации. Кубическая текстура состоит из шести равных по размеру квадратных текстур, упорядоченных в кубической топологии; они используются для описания окрестных наложений.
Нельзя создавать объекты CubeTexture с использованием конструктора CubeTexture; для этого используется этот метод. После создания объекта CubeTexture загрузите данные растровых изображений текстуры с использованием методов uploadFromBitmapData()
, uploadFromByteArray()
или uploadCompressedTextureFromByteArray()
объекта CubeTexture.
Параметры
size:int — Длина краев текстуры в текстурных пикселях.
| |
format:String — Формат текстурного пикселя списка перечисления Context3DTextureFormat.
Благодаря сжатию текстур можно хранить изображения текстур в сжатом формате непосредственно в графическом процессоре, тем самым экономя память графического процессора и пропускную способность памяти. Как правило, сжатые текстуры сжимаются в автономном режиме и загружаются в графический процессор в сжатой форме с помощью метода Texture.uploadCompressedTextureFromByteArray. В средах Flash Player 11.4 и AIR 3.4 на настольных платформах появилась поддержка сжатия текстур во время выполнения, что может быть удобно в некоторых случаях, например при визуализации динамических текстур из векторной графики. Обратите внимание, что эта функция в настоящее время недоступна на мобильных платформах и при попытке её использования будет возникать исключение ArgumentError (Несоответствие формата текстуры). Для использования сжатия текстур во время выполнения необходимо выполнить следующее. 1. Создайте объект текстуры. Для этого вызовите метод Context3D.createCubeTexture(), передав flash.display3D.Context3DTextureFormat.COMPRESSED или flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA в качестве параметра формата. 2. Используя экземпляр flash.display3D.textures.Texture, возвращенный методом createCubeTexture(), вызовите либо flash.display3D.textures.CubeTexture.uploadFromBitmapData(), либо flash.display3D.textures.CubeTexture.uploadFromByteArray() для одновременной загрузки и сжатия текстуры. | |
optimizeForRenderToTexture:Boolean — Задайте значение true , если текстура, скорее всего, будет использоваться в качестве цели визуализации.
| |
streamingLevels:int (default = 0 ) — Уровень множественных отображений, который должен быть загружен перед визуализацией изображения. Потоковая передача текстур дает возможность загрузить и отобразить вначале наименьшие уровни, а затем, по мере загрузки текстур, отображать все более качественные изображения. Конечные пользователи могут просматривать в приложении изображения более низкого качества, пока загружаются более качественные изображения.
По умолчанию значение streamingLevels — 0, то есть перед визуализацией изображения должно загрузиться изображение самого высокого качества во множественном отображении. Этот параметр был добавлен в версиях Flash Player 11.3 и AIR 3.3. Его значение по умолчанию соответствует поведению предыдущих версий Flash Player и AIR. Установите для Примечание. Установка для этого свойства значения больше 0 может влиять на интенсивность использования памяти и производительность. |
flash.display3D.textures:CubeTexture |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много объектов Texture или превышен объем выделенной для текстур памяти.
| |
ArgumentError — Текстура глубины не реализована: если предпринимается попытка создать текстуру глубины.
| |
ArgumentError — Размер текстуры равен нулю: если параметр size не больше нуля.
| |
ArgumentError — Текстура не равна степени двойки: если параметр size не равен степени двойки.
| |
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 загрузите индексы с использованием методов uploadFromVector()
или uploadFromByteArray()
объекта IndexBuffer3D.
Параметры
numIndices:int — количество вершин, которое будет храниться в буфере.
| |
bufferUsage:String (default = "staticDraw ") — прогнозируемая интенсивность использования буфера. Используйте одну из констант, определенных в Context3DBufferUsage . Драйвер оборудования может, при правильной настройке, провести соответствующую оптимизацию. Этот параметр доступен только в версиях позднее Flash 12/AIR 4.
|
IndexBuffer3D |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много буферов индексов или превышен объем выделенной для буферов индексов памяти.
| |
Error — 3768: API-интерфейс Stage3D не может использоваться во время выполнения в фоновом режиме.
| |
ArgumentError — Слишком большой буфер: когда значение numIndices больше или равно 0xf0000.
|
Связанные элементы API
createProgram | () | метод |
public function createProgram():Program3D
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11, AIR 3 |
Создается объект Program3D.
Используйте объект Program3D для загрузки шейдерных программ в контекст визуализации и для создания ссылки на загруженные программы во время визуализации. В объекте Program3D хранятся две программы: вершинная программа и фрагментная программа (которая также называется пиксельной программой). Программы пишутся на бинарном языке сборки шейдера.
Нельзя создавать объекты Program3D с использованием конструктора Program3D; для этого используется этот метод. После создания объекта Program3D загрузите программы с использованием метода upload()
объекта Program3D.
Program3D |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Общее число программ превышает 4096 или общий объем памяти превышает 16 МБ (используйте метод dispose для освобождения ресурсов объекта Program3D).
|
Связанные элементы API
Пример ( Использование этого примера )
renderContext
является экземпляром класса Context3D. Программы в примере записаны на языке Adobe Graphics Assembly Language (AGAL).
//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 загрузите данные растровых изображений текстуры с использованием методов uploadFromBitmapData()
или uploadFromByteArray()
объекта Texture.
Обратите внимание, что 32-разрядные целочисленные текстуры хранятся в упакованном формате BGRA для соответствия формату BitmapData
среды Flash. В текстурах с плавающей запятой используется общепринятый RGBA.
Прямоугольные текстуры отличаются от обычных двумерных текстур тем, что их ширина и высота могут не равняться степени двойки. Кроме того, они не содержат множественные отображения. Наиболее полезно их использовать при визуализации в текстуру. Если прямоугольная текстура используется с образцом, в котором применяется фильтрация множественного отображения или повторяющееся завертывание, произойдет сбой вызова drawTriangles. Прямоугольная текстура также не допускает потоковую передачу. Прямоугольные текстуры поддерживают только форматы текстур BGRA, BGR_PACKED, BGRA_PACKED. Форматы сжатых текстур не поддерживаются прямоугольными текстурами.
Параметры
width:int — Ширина текстуры в текстурных пикселях.
| |
height:int — Высота текстуры в текстурных пикселях.
| |
format:String — Формат текстурного пикселя списка перечисления Context3DTextureFormat.
| |
optimizeForRenderToTexture:Boolean — Задайте значение true , если текстура, скорее всего, будет использоваться в качестве цели визуализации.
|
flash.display3D.textures:RectangleTexture |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много объектов Texture или превышен объем выделенной для текстур памяти.
| |
ArgumentError — Размер текстуры равен нулю: если оба параметра width и height не больше нуля.
| |
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 загрузите данные растровых изображений текстуры с использованием методов uploadFromBitmapData()
, uploadFromByteArray()
или uploadCompressedTextureFromByteArray()
объекта Texture.
Обратите внимание, что 32-разрядные целочисленные текстуры хранятся в упакованном формате BGRA для соответствия формату BitmapData
среды Flash. В текстурах с плавающей запятой используется общепринятый RGBA.
Параметры
width:int — Ширина текстуры в текстурных пикселях.
| |
height:int — Высота текстуры в текстурных пикселях.
| |
format:String — Формат текстурного пикселя списка перечисления Context3DTextureFormat.
Благодаря сжатию текстур можно хранить изображения текстур в сжатом формате непосредственно в графическом процессоре, тем самым экономя память графического процессора и пропускную способность памяти. Как правило, сжатые текстуры сжимаются в автономном режиме и загружаются в графический процессор в сжатой форме с помощью метода Texture.uploadCompressedTextureFromByteArray. В средах Flash Player 11.4 и AIR 3.4 на настольных платформах появилась поддержка сжатия текстур во время выполнения, что может быть удобно в некоторых случаях, например при визуализации динамических текстур из векторной графики. Обратите внимание, что эта функция в настоящее время недоступна на мобильных платформах и при попытке её использования будет возникать исключение ArgumentError (Несоответствие формата текстуры). Для использования сжатия текстур во время выполнения необходимо выполнить следующее. 1. Создайте объект текстуры. Для этого вызовите метод Context3D.createTexture(), передав flash.display3D.Context3DTextureFormat.COMPRESSED или flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA в качестве параметра формата. 2. Используя экземпляр flash.display3D.textures.Texture, возвращенный методом createTexture(), вызовите либо flash.display3D.textures.Texture.uploadFromBitmapData(), либо flash.display3D.textures.Texture.uploadFromByteArray() для одновременной загрузки и сжатия текстуры. | |
optimizeForRenderToTexture:Boolean — Задайте значение true , если текстура, скорее всего, будет использоваться в качестве цели визуализации.
| |
streamingLevels:int (default = 0 ) — Уровень множественных отображений, который должен быть загружен перед визуализацией изображения. Потоковая передача текстур дает возможность загрузить и отобразить вначале наименьшие уровни, а затем, по мере загрузки текстур, отображать все более качественные изображения. Конечные пользователи могут просматривать в приложении изображения более низкого качества, пока загружаются более качественные изображения.
По умолчанию значение streamingLevels — 0, то есть перед визуализацией изображения должно загрузиться изображение самого высокого качества во множественном отображении. Этот параметр был добавлен в версиях Flash Player 11.3 и AIR 3.3. Его значение по умолчанию соответствует поведению предыдущих версий Flash Player и AIR. Установите для Примечание. Установка для этого свойства значения больше 0 может влиять на интенсивность использования памяти и производительность. |
flash.display3D.textures:Texture |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много объектов Texture или превышен объем выделенной для текстур памяти.
| |
ArgumentError — Текстура глубины не реализована: если предпринимается попытка создать текстуру глубины.
| |
ArgumentError — Размер текстуры равен нулю: если оба параметра width и height не больше нуля.
| |
ArgumentError — Текстура не равна степени двойки: если оба параметра width и height не равны степени двойки.
| |
ArgumentError — Слишком большая текстура: если любой из параметров width или height больше 2048 для базового и ограниченного базового профиля, или если любой из параметров width и height больше 4096 для базового расширенного профиля или профиля более высокого уровня.
| |
Error — Не удалось создать текстуру: если контексту визуализации не удалось создать объект Texture (но информация о причине недоступна).
| |
ArgumentError — Недопустимый потоковый уровень: если значение streamingLevels больше или равно log2(min(ширина,высота)).
|
Связанные элементы API
createVertexBuffer | () | метод |
public function createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11, AIR 3 |
Создается объект VertexBuffer3D.
Используйте объект VertexBuffer3D для загрузки набора данных вершин в контекст визуализации. В буфере вершин содержатся данные, необходимые для визуализации каждой точки в геометрии сцены. Атрибуты данных, связанные с каждой вершиной, как правило, включают положение, цвет и координаты текстуры и используются в качестве входных данных для вершинной шейдерной программы. Определите значения данных, соответствующие одному из входных значений вершинной программы, с помощью метода setVertexBufferAt()
. Можно указать до шестидесяти четырех 32-разрядных значений для каждой вершины.
Нельзя создавать объекты VertexBuffer3D с использованием конструктора VertexBuffer3D; для этого используется данный метод. После создания объекта IndexBuffer3D загрузите индексы с использованием методов uploadFromVector()
или uploadFromByteArray()
объекта IndexBuffer3D.
Параметры
numVertices:int — количество вершин, которое будет храниться в буфере. Максимальное количество вершин в отдельном буфере равно 65535.
| |
data32PerVertex:int — количество 32-разрядных (4-байтовых) значений данных, связанных с каждой вершиной. Максимальное количество элементов 32-разрядных данных для каждой вершины равно 64 (или 256 байтам). Обратите внимание, что только восемь регистров атрибутов единовременно доступны вершинной шейдерной программе. Используйте метод SetVertextBufferAt() для выбора атрибутов из буфера вершин.
| |
bufferUsage:String (default = "staticDraw ") — прогнозируемая интенсивность использования буфера. Используйте одну из констант, определенных в Context3DBufferUsage . Драйвер оборудования может, при правильной настройке, провести соответствующую оптимизацию. Этот параметр доступен только в версиях позднее Flash 12/AIR 4.
|
VertexBuffer3D |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много объектов буферов вершин или превышен объем выделенной для буферов вершин памяти.
| |
ArgumentError — Слишком большой буфер: если numVertices больше 0x10000 или data32PerVertex больше 64.
| |
ArgumentError — Буфер имеет нулевой размер: если значение numVertices или data32PerVertex равно нулю.
| |
ArgumentError — Не удалось создать буфер: если контексту визуализации не удалось создать объект VertexBuffer3D (но дополнительная информация о причине недоступна).
| |
Error — 3768: API-интерфейс Stage3D не может использоваться во время выполнения в фоновом режиме.
|
Связанные элементы API
Пример ( Использование этого примера )
setVertexBufferAt()
вызывается для указания того, что первые три точки данных передаются в вершинную программу в качестве 3 значений с плавающей точкой в 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()
. Можно указать до шестидесяти четырех 32-разрядных значений для каждого элемента буфера вершин.
Нельзя создавать объекты VertexBuffer3D с использованием конструктора VertexBuffer3D; для этого используется данный метод. После создания объекта IndexBuffer3D загрузите индексы с использованием методов uploadFromVector()
или uploadFromByteArray()
объекта IndexBuffer3D.
Параметры
numVertices:int — количество элементов, которое будет храниться в буфере. Максимальное количество элементов в отдельном буфере равно 65535.
| |
data32PerVertex:int — количество 32-разрядных (4-байтовых) значений данных, связанных с каждым элементом. Максимальное количество элементов 32-разрядных данных для каждой вершины равно 64 (или 256 байтам).
| |
instancesPerElement:int — количество экземпляров, которое будет использовать один элемент буфера вершин.
| |
bufferUsage:String (default = "staticDraw ") — прогнозируемая интенсивность использования буфера. Используйте одну из констант, определенных в Context3DBufferUsage . Драйвер оборудования может, при правильной настройке, провести соответствующую оптимизацию. Этот параметр доступен только в версиях позднее Flash 12/AIR 4.
|
VertexBuffer3D |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много объектов буферов вершин или превышен объем выделенной для буферов вершин памяти.
| |
ArgumentError — Слишком большой буфер: если numVertices больше 0x10000 или data32PerVertex больше 64.
| |
ArgumentError — Буфер имеет нулевой размер: если значение numVertices или data32PerVertex равно нулю.
| |
ArgumentError — Не удалось создать буфер: если контексту визуализации не удалось создать объект VertexBuffer3D (но дополнительная информация о причине недоступна).
| |
Error — 3768: API-интерфейс Stage3D не может использоваться во время выполнения в фоновом режиме.
| |
Error — Требуется стандартный расширенный профиль или более высокого уровня: если этот метод вызывается, когда запрашивается профиль, уровень которого ниже стандартного расширенного.
| |
Error — Недопустимое количество экземпляров для элемента: если instancesPerElement не больше нуля.
|
Связанные элементы 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 для получения видеокадров с помощью метода attachNetStream()
или attachCamera()
.
Обратите внимание этот метод возвращает значение «null», если система не поддерживает эту функцию.
Объект VideoTexture не содержит множественные отображения. Если объект VideoTexture используется с образцом, в котором применяется фильтрация множественного отображения или повторяющееся завертывание, произойдет сбой вызова drawTriangles. Объект VideoTexture можно обрабатывать шейдерами как текстуру BGRA. Создать экземпляр объекта VideoTexture не удастся, если эффект Context3D был запрошен в режиме визуализации с помощью ПО.
Для каждого экземпляра Context3D доступно не более четырех объектов VideoTexture. На мобильных устройствах фактическое количество поддерживаемых объектов VideoTexture может быть меньше четырех из-за ограничений платформы.
Возвращаетflash.display3D.textures:VideoTexture |
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Превышен лимит ресурсов: если создано слишком много объектов Texture или превышен объем выделенной для текстур памяти.
| |
Error — Не удалось создать текстуру: контексту визуализации не удалось создать объект Texture (но информация о причине недоступна).
|
dispose | () | метод |
public function dispose(recreate:Boolean = true):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11, AIR 3 |
Освобождает все ресурсы и внутреннее хранилище, связанные с данным объектом Context3D.
Все буферы индексов, буферы вершин, текстуры и программы, созданные посредством этого объекта Context3D, очищаются аналогично вызову для каждого из этих элементов метода dispose()
. Кроме того, очищается сам объект Context3D, освобождая все временные буферы и предшествующий буфер. Вызов методов configureBackBuffer(), clear(), drawTriangles(), createCubeTexture(), createTexture(), createProgram(), createIndexBuffer(), createVertexBuffer() или drawToBitmapData() после вызова метода dispose() приведет к созданию исключения.
Внимание! При вызове метода dispose() для объекта Context3D, когда еще существует прослушиватель события Events.CONTEXT3D_CREATE для связанного объекта Stage3D, симулируется потеря устройства. В результате создается новый объект Context3D для Stage3D и повторно отправляется событие Events.CONTEXT3D_CREATE. Если такое поведение нежелательно, следует удалить прослушиватель события у объекта Stage3D перед вызовом dispose(), либо задать параметру 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. Потенциально это очень медленная операция, выполнение которой может занять около секунды. Используйте с осторожностью. Обратите внимание, что эта функция копирует не передний буфер визуализации (отображаемый в рабочей области), а тот, в котором выполняется отрисовка. Чтобы захватить визуализированное изображение в том виде, в котором оно отображается в рабочей области, вызовите метод drawToBitmapData()
непосредственно перед вызовом метода present()
.
Начиная с AIR 25 в API-интерфейс добавлено два новых параметра drawToBitmapData()
. Этот API-интерфейс теперь принимает три параметра. Во-первых, это существующий параметр destination:BitmapData
. Во-вторых, это параметр srcRect:Rectangle
, который является целевым прямоугольником в рабочей области stage3D. В-третьих, это параметр destPoint:Point
, который является координатой целевого растрового изображения. Параметры srcRect и destPoint не являются обязательными, по умолчанию для них используются значения (0,0,bitmapWidth,bitmapHeight) и (0,0), соответственно.
При отрисовке изображение не масштабируется по размеру растрового изображения. Вместо этого содержимое обрезается по размеру целевого растрового изображения.
В объектах Flash BitmapData хранятся цвета, которые уже умножены на альфа-компонент. Например, если компонентами «чистых» цветов RGB являются (0x0A, 0x12, 0xBB), а альфа-компонентом является 0x7F (0,5), пиксель сохраняется в объекте BitmapData со следующими значениями rgba: (0x05, 0x09, 0x5D, 0x7F). Можно настроить коэффициенты наложения, чтобы цвета, визуализированные в буфере, умножались на значение альфа, или можно выполнить эту операцию во фрагментном шейдере. Контекст визуализации не проверяет, хранятся ли данные в предварительно умноженном формате.
Параметры
destination:BitmapData | |
srcRect:Rectangle (default = null )
| |
destPoint:Point (default = null )
|
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — 3768: API-интерфейс Stage3D не может использоваться во время выполнения в фоновом режиме.
| |
Error — 3802: если параметр destPoint:Point или srcRect:Rectangle находится за пределами связки координат растрового изображения/рабочей области 3D или если в качестве ввода переданы нечисловые значения.
|
Пример ( Использование этого примера )
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()
необходимо вызвать метод clear()
перед первым вызовом drawTriangles()
, в противном случае произойдет сбой визуализации.
Когда enableErrorChecking
имеет значение false
, эта функция возвращает ответ немедленно, не ожидая результатов, и выдает исключение, только если экземпляр Context3D утилизирован или выполнено слишком много вызовов методов рисования. Если контекст визуализации недействителен, визуализация завершается ошибкой без уведомления. Когда свойство enableErrorChecking
имеет значение true
, эта функция возвращает ответ после отрисовки треугольников и выдает исключение в случае ошибок отрисовки или недопустимого состояния контекста.
Параметры
indexBuffer:IndexBuffer3D — набор индексов вершин, ссылающихся на вершины, которые следует визуализировать.
| |
firstIndex:int (default = 0 ) — индекс первой вершины для визуализации. По умолчанию 0.
| |
numTriangles:int (default = -1 ) — Число треугольников для визуализации. Каждый треугольник использует три индекса. Передайте -1 для визуализации всех треугольников в буфере индексов. По умолчанию -1.
|
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Если выполняется слишком много вызовов этого метода между вызовами метода present() . Максимальное количество вызовов — 32 768.
Следующие ошибки возникают, только когда для свойства | |
Error — Необходимо выполнить очистку перед отрисовкой: если буфер не очищался с момента последнего вызова present() .
| |
Error — Если действительный объект Program3D не задан.
| |
Error — Действительный буфер индексов не задан: если объект IndexBuffer3D не задан.
| |
Error — Сбой проверки допустимости параметров: когда число треугольников для отрисовки или значение firstIndex превышает допустимые значения.
| |
RangeError — Недостаточно индексов в этом буфере: когда в буфере содержится недостаточное число индексов для определения числа треугольников для отрисовки.
| |
Error — Образец связан с текстурой, которая также связана с визуализацией: когда целью визуализации является текстура и эта текстура, определена в качестве входных данных текущей фрагментной программы.
| |
Error — Образец связан с недопустимой текстурой: недопустимая текстура указана в качестве входных данных для текущей фрагментной программы.
| |
Error — Формат образца не соответствует формату текстуры: когда текстура, определенная в качестве входных данных для текущей фрагментной программы, имеет формат, отличный от указанного для регистра образца. Например, двумерная текстура назначена образцу кубической текстуры.
| |
Error — Образец связан с неопределенной текстурой: текущая фрагментная программа получает доступ к регистру текстуры, который не задан (с использованием метода setTextureAt() ).
| |
Error — Для одной и той же текстуры необходимы одинаковые параметры образца: если текстура используется для нескольких регистров образцов, все образцы должны иметь одинаковые параметры. Например, нельзя задавать один образец для фиксации, а другой для оболочки.
| |
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()
необходимо вызвать метод clear()
перед первым вызовом drawTrianglesInstanced()
, в противном случае произойдет сбой визуализации
Когда enableErrorChecking
имеет значение false
, эта функция возвращает ответ немедленно, не ожидая результатов, и выдает исключение, только если экземпляр Context3D утилизирован или выполнено слишком много вызовов методов рисования. Если контекст визуализации недействителен, визуализация завершается ошибкой без уведомления. Когда свойство enableErrorChecking
имеет значение true
, эта функция возвращает ответ после отрисовки треугольников и выдает исключение в случае ошибок отрисовки или недопустимого состояния контекста.
Этот метод может выдать исключение, если созданный экземпляр буфера неправильно упорядочен с помощью SetVertexAt()
. Например, с помощью Direct 3D 9 индексированные данные геометрии и количество экземпляров для отрисовки должны всегда задаваться в потоке 0 с помощью API-интерфейса SetStreamSourceFreq()
.
Это означает, что буфер вершин, созданный с помощью CreateVertexBufferForInstance()
, не должен размещаться с минимальным значением индекса при использовании SetVertexBufferAt()
в качестве ввода в программу шейдера вершин. Буфер вершин, созданный с помощью CreateVertexBuffer()
, должен размещаться со значением индекса, которое меньше индекса буфера, созданного с использованием CreateVertexBufferForInstance()
. Как правило, данные геометрии должны размещаться раньше данных экземпляров с помощью SetVertexBufferAt()
.
Параметры
indexBuffer:IndexBuffer3D — набор индексов вершин, ссылающихся на вершины, которые следует визуализировать.
| |
numInstances:int — количество экземпляров для рендеринга.
| |
firstIndex:int (default = 0 ) — индекс первой вершины для визуализации. По умолчанию 0.
| |
numTriangles:int (default = -1 ) — Число треугольников для визуализации. Каждый треугольник использует три индекса. Передайте -1 для визуализации всех треугольников в буфере индексов. По умолчанию -1.
|
Выдает
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
| |
Error — Если выполняется слишком много вызовов этого метода между вызовами метода present() . Максимальное количество вызовов — 32 768.
| |
Error — Требуется стандартный расширенный профиль или более высокого уровня: если этот метод вызывается, когда запрашивается профиль, уровень которого ниже стандартного расширенного.
| |
Error — Если метод вызывается при отрицательном значении numInstances.
Следующие ошибки возникают, только когда для свойства | |
Error — Необходимо выполнить очистку перед отрисовкой: если буфер не очищался с момента последнего вызова present() .
| |
Error — Если действительный объект Program3D не задан.
| |
Error — Действительный буфер индексов не задан: если объект IndexBuffer3D не задан.
| |
Error — Сбой проверки допустимости параметров: когда число треугольников для отрисовки или значение firstIndex превышает допустимые значения.
| |
RangeError — Недостаточно индексов в этом буфере: когда в буфере содержится недостаточное число индексов для определения числа треугольников для отрисовки.
| |
Error — Образец связан с текстурой, которая также связана с визуализацией: когда целью визуализации является текстура и эта текстура, определена в качестве входных данных текущей фрагментной программы.
| |
Error — Образец связан с недопустимой текстурой: недопустимая текстура указана в качестве входных данных для текущей фрагментной программы.
| |
Error — Формат образца не соответствует формату текстуры: когда текстура, определенная в качестве входных данных для текущей фрагментной программы, имеет формат, отличный от указанного для регистра образца. Например, двумерная текстура назначена образцу кубической текстуры.
| |
Error — Образец связан с неопределенной текстурой: текущая фрагментная программа получает доступ к регистру текстуры, который не задан (с использованием метода setTextureAt() ).
| |
Error — Для одной и той же текстуры необходимы одинаковые параметры образца: если текстура используется для нескольких регистров образцов, все образцы должны иметь одинаковые параметры. Например, нельзя задавать один образец для фиксации, а другой для оболочки.
| |
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
необходимо вызвать метод clear()
перед созданием еще одного вызова drawTriangles()
. Иначе эта функция будет поочередно очищать буфер визуализации для желтого и зеленого цветов или, если для enableErrorChecking
установлено значение true
, создается исключение.
При вызове present()
также сбрасывается цель визуализации, как и при вызове setRenderToBackBuffer()
.
Выдает
Error — Необходимо очистить перед отрисовкой: если метод clear() не вызван после предыдущего вызова present() . (Два последовательных вызова метода present() недопустимы, если между ними не вызывается метод clear() .)
| |
Error — 3768: API-интерфейс Stage3D не может использоваться во время выполнения в фоновом режиме.
|
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 | () | метод |
public function setFillMode(fillMode:String):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 16 |
Задает режим заливки, используемый для визуализации. Интерфейс доступен только в версии AIR для компьютеров.
Параметры
fillMode:String — Если выбрано значение WIREFRAME, то для отображения объекта будет применяться сетка из базовых линий. Если выбрано значение SOLID, то для отображения объекта будут применяться полигоны со сплошной заливкой.
|
Связанные элементы API
setProgram | () | метод |
public function setProgram(program:Program3D):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11, AIR 3 |
Задает вершинные и фрагментные шейдерные программы для использования в ходе последующей визуализации.
Параметры
program:Program3D — объект Program3D, представляющий вершинную и фрагментную программы для использования.
|
Связанные элементы API
Пример ( Использование этого примера )
renderContext
является экземпляром класса Context3D. Программы в примере записаны на языке Adobe Graphics Assembly Language (AGAL).
//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 — количество задаваемых регистров. Каждый регистр считывается в формате четырех значений с плавающей запятой.
| |
data:ByteArray — исходный объект ByteArray
| |
byteArrayOffset:uint — смещение в объекте ByteArray для чтения данных
|
Выдает
TypeError — kNullPointerError, если значение data равно null.
| |
RangeError — kConstantRegisterOutOfBounds, если попытаться задать больше, чем максимальное количество констант затенения.
| |
RangeError — kBadInputSize, если значение byteArrayOffset больше или равно длине архива data или если количество элементов в массиве data минус byteArrayOffset меньше numRegisters *16
|
Связанные элементы API
setProgramConstantsFromMatrix | () | метод |
public function setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11, AIR 3 |
Задает константы для использования шейдерными программами с применением значений, хранящихся в объекте Matrix3D
.
Используйте эту функцию для передачи матрицы в шейдерную программу. Функция задает 4 регистра констант, используемых вершинной или фрагментной программой. Матрица назначается регистрам построчно. Первый регистр констант назначается верхней строке матрицы. Можно задать 128 регистров для вершинной программы и 28 регистров для фрагментной программы.
Параметры
programType:String — Тип шейдерной программы: Context3DProgramType.VERTEX или Context3DProgramType.FRAGMENT .
| |
firstRegister:int — индекс первого регистра констант, который необходимо задать. Поскольку объект Matrix3D имеет 16 значений, задаются четыре регистра.
| |
matrix:Matrix3D — матрица, содержащая значения констант.
| |
transposedMatrix:Boolean (default = false ) — если значение равно true , значения матрицы копируются в регистры в транспонированном порядке. Значение по умолчанию false .
|
Выдает
TypeError — Ошибка пустого указателя: когда matrix имеет нулевое значение.
| |
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 должно содержаться не менее 4 элементов numRegisters .
| |
numRegisters:int (default = -1 ) — количество задаваемых констант. Укажите значение -1 (значение по умолчанию), чтобы задать достаточное число регистров для использования всех доступных данных.
|
Выдает
TypeError — Ошибка пустого указателя: когда data имеет значение null .
| |
RangeError — Регистр констант выходит за границы: при попытке установить значение, превышающее максимальное число регистров констант шейдера.
| |
RangeError — Элементов в массиве data минус byteArrayOffset меньше 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 ) — Указывает, какой элемент текстуры необходимо обновить. Объекты Texture имеют одну поверхность, поэтому необходимо указать значение 0 (значение по умолчанию). Объекты CubeTexture имеют шесть поверхностей, поэтому необходимо указать целое число от 0 до 5.
| |
colorOutputIndex:int (default = 0 ) — Регистр цвета вывода. Должен иметь значение 0 для ограниченного режима или режима по базовой линии. В противном случае указывает регистр цвета вывода.
|
Выдает
ArgumentError — для несоответствующего параметра surfaceSelector . Значение должно быть равно 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
. Однако состояние образца текстуры можно заменить при помощи этой функции. Если вы не хотите, чтобы программа изменила состояние образца, задайте бит ignoresamnpler
в AGAL и используйте эту функцию.
Параметры
sampler:int — образец Регистр образца для применения. Сопоставляется с регистром образца в AGAL.
| |
wrap:String — Режим обтекания. Определен в Context3DWrapMode . По умолчанию используется значение repeat.
| |
filter:String — Режим фильтрования текстуры. Определен в Context3DTextureFilter . По умолчанию используется значение nearest.
| |
mipfilter:String — Фильтр множественного отображения. Определен в Context3DMipFilter . По умолчанию используется значение none.
|
Выдает
Error — образец вне диапазона
| |
Error — обтекание, фильтр, ошибка bad enum фильтра mip
| |
Error — Объект удален: если этот объект Context3D был удален путем вызова метода dispose() или из-за потери связи с базовым аппаратным обеспечением визуализации.
|
Связанные элементы 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.
- Задание увеличения действия трафарета после прохождения проверки трафарета.
- Установка для трафарета значения ссылки 0.
- Отрисовка треугольной маски. При отрисовке треугольника выполняется проверка трафарета, поскольку буфер трафарета был очищен до 0 и значение ссылки равно 0. В результате значение буфера трафарета увеличивается на 1 при отрисовке треугольной маски.
- Установка сохранения действия трафарета, чтобы последующие операции отрисовки не изменяли буфер трафарета.
- Отрисовка прямоугольника во весь экран (многоцветный). Поскольку значение ссылки трафарета по-прежнему равно 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 |
Задает текстуру, которая будет использоваться в качестве регистра входной текстуры фрагментной программы.
Фрагментная программа может считывать данные не более чем из восьми объектов текстур. Используйте эту функцию для назначения объекта 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Предположим, вершина была определена в объекте VertexBuffer3D с именем
buffer
; ее можно передать в вершинный шейдер с помощью следующего кода:
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, поскольку это первый атрибут; цвет имеет смещение, равное 3, поскольку атрибут цвета следует за 32-разрядными значениями положения. Смещение указывается с шагом 32 бита.
| |
format:String (default = "float4 ") — значение из класса Context3DVertexBufferFormat, указывающее тип данных этого атрибута.
|
Выдает
Error — Недопустимое перечисление: когда формат не принимает одно из значений, определенных в классе Context3DVertexBufferFormat.
| |
RangeError — Регистр атрибутов выходит за пределы: когда параметр index не попадает в диапазон от 0 до 7. (В шейдере можно использовать не более восьми регистров атрибутов вершин.)
|
Дополнительно
Связанные элементы 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, 11:34 AM Z