SetCubeFace texture,face

Параметры

texture - текстура
face - выбранная сторона куба. Может иметь одно из следующих значений:
0: левая (отрицательный X) сторона
1: передняя (положительный Z) сторона - по умолчанию.
2: правая (положительный X) сторона
3: задняя (отрицательный Z) сторона
4: верхняя (положительный Y) сторона
5: нижняя (отрицательный Y) сторона

Описание

Выбирает сторону куба для прямого отображения (рендеринга) в текстуру.

Эта команда используется только тогда, когда Вы желаете изобразить непосредственно в текстуре стороны куба в реальном времени. В других случаях достаточно только загрузки отрендеренной стороны куба с флажком 128.

Чтобы лучше понять, как эта команда работает, важно знать, что Blitz обрабатывает текстуры cubemap немного по-другому по сравнению с обработкой других текстур. Вот как это работает...

Текстура cubemap в Blitz3D фактически состоит из шести изображений, размер каждого из которых должен быть степенью числа 2 - например 32, 64, 128 и т.д. Каждое соответствует отдельной стороне куба. Эти изображения сохранены внутри Blitz-а, а указатель текстуры может быть возвращен функциями LoadTexture/CreateTexture с флагом кубической карты, но он обеспечивает доступ только к одному из этих шести изображений (по умолчанию первому, или стороне '0').

Поэтому, при загрузке текстуры cubemap в Blitz с использованием LoadTexture, нужно предусмотреть, чтобы все шесть изображений кубической карты были расположены в определенном порядке (0-5, как описано выше), горизонтально. Тогда Blitz берет эту текстуру и внутренне преобразовывает ее в шесть отдельных изображений.

Так как указатель текстуры, возвращенный CreateTexture / LoadTexture обеспечивает доступ только к одному из этих изображений (номер 1 по умолчанию), как мы можем получить доступ к другим пяти изображениям? Это и есть назначение команды SetCubeFace. Она укажет Blitz-у, что всякий раз, когда Вы затем обращаетесь к текстуре cubemap, нужно работать с указанным изображением.

Теперь Вы имеете возможность обращаться к кубической карте в реальном времени.

Чтобы дать Вам некоторое представление относительно того, как это работает в коде, вот пример функции, которая обновляет CubeMap в реальном времени. Это работает путем создания шести различных видов камеры и копирования их в буфер текстуры кубической карты с использованием стороны, указанной командой SetCubeFace, чтобы определить, на какую из них должно быть наложено указанное изображение cubemap.

; Начало кода
Function UpdateCubeMap( tex,camera )

tex_sz=TextureWidth(tex)

;вид слева
SetCubeFace tex,0

;копируем содержимое backbuffer в кубическую карту
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

;вид впереди
SetCubeFace tex,1
RotateEntity camera,0,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

;вид справа
SetCubeFace tex,2
RotateEntity camera,0,-90,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

;вид сзади
SetCubeFace tex,3
RotateEntity camera,0,180,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

;вид сверху
SetCubeFace tex,4
RotateEntity camera,-90,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

;вид снизу
SetCubeFace tex,5
RotateEntity camera,90,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

EndFunction
; Конец кода

Каждый рендеринг в буфер текстуры происходит только в соответствующее изображение указанной стороны куба. Вы не сможете выбрать сторону, если буфер заблокирован.

Наконец, Вы можете объединить флажок vram=256 (обрабатывать в видеопамяти) с флажком кубического отображения , чтобы увеличить скорость доступа к кубической карте.

Пример

; Пример SetCubeFace
; -------------------

width=640
height=480
depth=0
mode=0

Graphics3D width,height,depth,mode
SetBuffer BackBuffer()

; Если видеокарта не поддерживает кубические карты, то завершить программу
If GfxDriverCaps3D()<110 Then RuntimeError "Sorry, your graphics card does not support cubic environemnt maps."

cam=CreateCamera()
PositionEntity cam,0,10,-10

; Создаем отдельную камеру, чтобы создавать карту - это позволит нам управлять основной камерой и камерой эффектов ;отдельно
cube_cam=CreateCamera()

light=CreateLight()
RotateEntity light,90,0,0

; Зогружаем подопытный объект - классический чайник
teapot=LoadMesh("media/teapot.x")
ScaleEntity teapot,3,3,3
PositionEntity teapot,0,10,0

; Создаем простую сцену

; земля
ground=CreatePlane()
EntityColor ground,168,133,55
ground_tex=LoadTexture("media/sand.bmp")
ScaleTexture ground_tex,10,10
EntityTexture ground,ground_tex

; небо
sky=CreateSphere(24)
ScaleEntity sky,500,500,500
FlipMesh sky
EntityFX sky,1
sky_tex=LoadTexture("media/sky.bmp")
EntityTexture sky,sky_tex

; кактус
cactus=LoadMesh("media/cactus2.x")
FitMesh cactus,-5,0,-5,2,6,.5

; верблюд
camel=LoadMesh("media/camel.x")
FitMesh camel,5,0,-5,6,5,4

; Загружаем НЛО, который будет летать вокруг чайника и отражаться в нем
ufo_piv=CreatePivot()
PositionEntity ufo_piv,0,15,0
ufo=LoadMesh("media/green_ufo.x",ufo_piv)
PositionEntity ufo,0,0,10

; создаем текстуру с флажками цвет + кубическая карта окружения + сохранять в видеопамяти
tex=CreateTexture(256,256,1+128+256)

; Накладываем кубическую карту на чайник
EntityTexture teapot,tex

While Not KeyDown(1)

; Управление камерой

; обработка движения мыши

mxs#=mxs#+(MouseXSpeed()/5.0)
mys#=mys#+(MouseYSpeed()/5.0)

RotateEntity cam,mys#,-mxs#,0

MoveMouse width/2,height/2

; перемещаем камеру вперед/назад/влево/вправо курсорными клавишами

If KeyDown(200)=True Then MoveEntity cam,0,0,.2 ; вперед
If KeyDown(208)=True Then MoveEntity cam,0,0,-.2 ; назад

If KeyDown(205)=True Then MoveEntity cam,.2,0,0 ; влево
If KeyDown(203)=True Then MoveEntity cam,-.2,0,0 ; вправо

; Поворачиваем центр НЛО(pivot), и дочерний объект (НЛО) поворачивается тоже вместе с ним (и вокруг чайника)
TurnEntity ufo_piv,0,2,0

; Обновление кубической карты
UpdateCubemap(tex,cube_cam,teapot)

RenderWorld

Text 0,0,"Use mouse to look around"
Text 0,20,"Use cursor keys to change camera position"

Flip

Wend


Function UpdateCubemap(tex,camera,entity)

tex_sz=TextureWidth(tex)

; Используем камеру для создания кубической карты
ShowEntity camera

; Скроем объект, для которого делаем карту. Это нужно, чтобы он не закрыл вид из камеры и сам не появился на ;собственной текстуре, т.к. камера стоит в центре этого объекта
HideEntity entity

; Ставим камеру в центр объекта
PositionEntity camera,EntityX#(entity),EntityY#(entity),EntityZ#(entity)

CameraClsMode camera,False,True

; Установим размер области просмотра камеры таким же, как наша текстура - таким образом мы сможем вместить все ;содержимое экрана в текстуру.
CameraViewport camera,0,0,tex_sz,tex_sz

; Обновление карты

; вид слева
SetCubeFace tex,0
RotateEntity camera,0,90,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

; вид впереди
SetCubeFace tex,1
RotateEntity camera,0,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

; вид справа
SetCubeFace tex,2
RotateEntity camera,0,-90,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

; вид сзади
SetCubeFace tex,3
RotateEntity camera,0,180,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

; вид сверху
SetCubeFace tex,4
RotateEntity camera,-90,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

; вид снизу
SetCubeFace tex,5
RotateEntity camera,90,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

; Снова покажем скрытый ранее объект (чайник)
ShowEntity entity

; Скроем камеру эфектов
HideEntity camera

End Function

Главная страница

Нажмите сюда, чтобы увидеть последнюю версию этой страницы в интернете