|
3D-программирование Вопросы, касающиеся программирования 3D мира |
23.01.2008, 23:39
|
#1
|
Проектировщик
Регистрация: 25.03.2007
Сообщений: 536
Написано 252 полезных сообщений (для 715 пользователей)
|
Проблема с Masked
Вот код, в котором я пытаюсь сделать так, что бы черные участки были абсолютно прозрачны, но неполучается. Сколько не пытался, сам додуматься не смог, скажите, где у меня ошибка.
Код:
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()
MoveMouse 320,240
zoom#=1
lmp=CreateLight()
PositionEntity lmp,0,1000,0
;=====================================
;создание основной камеры
.ccam
campiv = CreatePivot()
cam = CreateCamera(campiv)
CameraClsColor cam,0,128,255
PositionEntity campiv,0,10,-70
TurnEntity campiv,0,0,0
pln=CreatePlane()
EntityColor pln,200,24,135
;=========================================
cubic_piv=CreatePivot()
ecub_scale_x=10
ecub_scale_y=10
ecub_scale_z=10
VAR_mashtab=10
;создание дополнительной камеры для рендера в текстуру
cam1=CreateCamera(cubic_piv)
camsphere=CreateSphere(8,cam1)
PositionEntity cam1,0,0,0
;создание кубика
cubik=CreateCube(cubic_piv)
PositionEntity cubik,0,ecub_scale_y,0
ScaleEntity cubik,ecub_scale_x-1,ecub_scale_y-1,ecub_scale_z-1
;==============================================
;создание текстуры, с флагом 4, чтоб места закрашенные черным были невидимы
tex_cub1=CreateTexture(ecub_scale_x*VAR_mashtab,ecub_scale_Y*VAR_mashtab,4)
ScaleTexture tex_cub1,1.28,1.28
;создание квадрата
spr1 = CreateMesh(cubic_piv)
sf1 = CreateSurface(spr1)
AddVertex sf1, -1, 1, 0, 0, 0
AddVertex sf1, 1, 1, 0, 1, 0
AddVertex sf1, -1, -1, 0, 0, 1
AddVertex sf1, 1, -1, 0, 1, 1
AddTriangle sf1, 0, 1, 2
AddTriangle sf1, 3, 2, 1
ScaleEntity spr1, ecub_scale_x,ecub_scale_y,1
PositionEntity spr1,0,ecub_scale_y,-ecub_scale_z
;натягивание текстуры на квадрат
EntityTexture spr1,tex_cub1
;===========================================
;прячу квадрат, что бы он не загораживал кубик
HideEntity spr1
;установка дополнительной камеры под нужным ракурсом
PositionEntity cam1,0,ecub_scale_y,-ecub_scale_z-ecub_scale_x
RotateEntity cam1,0,0,0
;собственно рендер в текстуру
CameraViewport cam1,0,0,ecub_scale_x*VAR_mashtab,ecub_scale_y*VAR_mashtab
RenderWorld
CopyRect 0,0,ecub_scale_x*VAR_mashtab,ecub_scale_y*VAR_mashtab,0,0,BackBuffer(),TextureBuffer(tex_cub1)
ShowEntity spr1
Repeat
;================================================
;управление перемещением основной камеры
If KeyDown(42) MoveEntity campiv,0,1,0
If KeyDown(46) MoveEntity campiv,0,-1,0
If KeyDown(30) MoveEntity campiv,-1,0,0
If KeyDown(32) MoveEntity campiv,1,0,0
If KeyDown(31) MoveEntity campiv,0,0,-1
If KeyDown(17) MoveEntity campiv,0,0,1
mys = MouseYSpeed()
mxs = MouseXSpeed()
If Abs(EntityPitch(cam)+mys) < 75
TurnEntity cam, mys,0,0
EndIf
TurnEntity campiv,0,-mxs,0
If KeyDown(2) CameraProjMode cam,1
If KeyDown(3) CameraProjMode cam,2
If KeyDown(4) zoom#=1
zoom#=zoom#+MouseZSpeed () *.01
CameraZoom cam,zoom#
;=============================================
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End
|
(Offline)
|
|
24.01.2008, 00:15
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Проблема с Masked
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()
MoveMouse 320,240
zoom#=1
lmp=CreateLight()
PositionEntity lmp,0,1000,0
;=====================================
;создание основной камеры
.ccam
campiv = CreatePivot()
cam = CreateCamera(campiv)
CameraClsColor cam,0,128,255
PositionEntity campiv,0,10,-70
TurnEntity campiv,0,0,0
pln=CreatePlane()
EntityColor pln,200,24,135
;=========================================
cubic_piv=CreatePivot()
ecub_scale_x=10
ecub_scale_y=10
ecub_scale_z=10
VAR_mashtab=10
;создание дополнительной камеры для рендера в текстуру
cam1=CreateCamera(cubic_piv)
camsphere=CreateSphere(8,cam1)
PositionEntity cam1,0,0,0
;создание кубика
cubik=CreateCube(cubic_piv)
PositionEntity cubik,0,ecub_scale_y,0
ScaleEntity cubik,ecub_scale_x-1,ecub_scale_y-1,ecub_scale_z-1
;==============================================
;создание текстуры, с флагом 4, чтоб места закрашенные черным были невидимы
tex_cub1=CreateTexture(ecub_scale_x*VAR_mashtab,ecub_scale_Y*VAR_mashtab,4)
ScaleTexture tex_cub1,1.28,1.28
;создание квадрата
spr1 = CreateMesh(cubic_piv)
sf1 = CreateSurface(spr1)
AddVertex sf1, -1, 1, 0, 0, 0
AddVertex sf1, 1, 1, 0, 1, 0
AddVertex sf1, -1, -1, 0, 0, 1
AddVertex sf1, 1, -1, 0, 1, 1
AddTriangle sf1, 0, 1, 2
AddTriangle sf1, 3, 2, 1
ScaleEntity spr1, ecub_scale_x,ecub_scale_y,1
PositionEntity spr1,0,ecub_scale_y,-ecub_scale_z
;натягивание текстуры на квадрат
EntityTexture spr1,tex_cub1
;===========================================
;прячу квадрат, что бы он не загораживал кубик
HideEntity spr1
;установка дополнительной камеры под нужным ракурсом
PositionEntity cam1,0,ecub_scale_y,-ecub_scale_z-ecub_scale_x
RotateEntity cam1,0,0,0
;собственно рендер в текстуру
CameraViewport cam1,0,0,ecub_scale_x*VAR_mashtab,ecub_scale_y*VAR_mashtab
RenderWorld
CopyRect 0,0,ecub_scale_x*VAR_mashtab,ecub_scale_y*VAR_mashtab,0,0,BackBuffer(),TextureBuffer(tex_cub1)
ShowEntity spr1
;========= EDIT =====================
MaskTexture(tex_cub1, 0, 0, 0)
;========= EDIT =====================
Repeat
;================================================
;управление перемещением основной камеры
If KeyDown(42) MoveEntity campiv,0,1,0
If KeyDown(46) MoveEntity campiv,0,-1,0
If KeyDown(30) MoveEntity campiv,-1,0,0
If KeyDown(32) MoveEntity campiv,1,0,0
If KeyDown(31) MoveEntity campiv,0,0,-1
If KeyDown(17) MoveEntity campiv,0,0,1
mys = MouseYSpeed()
mxs = MouseXSpeed()
If Abs(EntityPitch(cam)+mys) < 75
TurnEntity cam, mys,0,0
EndIf
TurnEntity campiv,0,-mxs,0
If KeyDown(2) CameraProjMode cam,1
If KeyDown(3) CameraProjMode cam,2
If KeyDown(4) zoom#=1
zoom#=zoom#+MouseZSpeed () *.01
CameraZoom cam,zoom#
;=============================================
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End
Function MaskTexture(Texture, Red, Green, Blue)
Local MaskColor = (Red Shl 16) Or (Green Shl 8) Or Blue
Local MaskSizeX = TextureWidth(Texture)
Local MaskSizeY = TextureHeight(Texture)
Local MaskBuffer = TextureBuffer(Texture)
LockBuffer(MaskBuffer)
For x = 0 To MaskSizeX
For y = 0 To MaskSizeY
Pixel = ReadPixel(x, y, MaskBuffer) And $00FFFFFF
If (Pixel = MaskColor) Then
WritePixel(x, y, Pixel, MaskBuffer)
Else
WritePixel(x, y, Pixel Or $FF000000, MaskBuffer)
EndIf
Next
Next
UnlockBuffer(MaskBuffer)
End Function
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:26.
|