forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Проблема с Masked (http://forum.boolean.name/showthread.php?t=5636)

BlackDragon 23.01.2008 23:39

Проблема с 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


H@NON 24.01.2008 00:15

Ответ: Проблема с 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



Часовой пояс GMT +4, время: 14:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot