PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Прозрачность в текстурах.


Прозрачность в текстурах.

Сообщений 1 страница 3 из 3

1

на винде вылез затык (буржуй один на макос тестил - все в порядке пишет). мне нужны биллбоарды - вешаю на них 2д текстуры на 3д карте. ну и нужна прозрачность. первая текстура - все идеально. вторая... вторая, стерва, помнит форму прозрачности первой текстуры. третья соответственно помнит их обоих... бред творится. как сбросить этот некий кэш рисования, чтобы в начале рисования картинка была полностью пустая и прозрачная? это разные текстуры. а вот при рисовании такая шляпа творится.

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

Код:
Enumeration
  #Window  
  
  #Camera
  
  #Texture01
  #Texture02
  #Texture03
  
  #Material01
  #Material02
  #Material03
  
  #Billboard01
  #Billboard02
  #Billboard03
  
  #Button
EndEnumeration

InitEngine3D()
InitSprite()

If OpenWindow(#Window, 100, 100, 480, 500, "", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  
  ButtonGadget(#Button, 10, 450, 50, 20, "switch")
  
  If OpenWindowedScreen(WindowID(#Window), 10, 10, 400, 400)
    
    If CreateTexture(#Texture01, 128, 64)
      If StartDrawing(TextureOutput(#Texture01))
        ; transparent area
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 0)) 
        
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        
        ; non transparent
        Circle(60, 30, 10, RGBA(100, 100, 100, 255))
        StopDrawing()
        
        CreateMaterial(#Material01, TextureID(#Texture01))
        MaterialBlendingMode(#Material01, #PB_Material_AlphaBlend)
        CreateBillboardGroup(#Billboard01, MaterialID(#Material01), 128, 64)
        
      EndIf
    EndIf
    
    If CreateTexture(#Texture02, 128, 64)
      If StartDrawing(TextureOutput(#Texture02))
        ; transparent area
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 0)) 
        
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        
        ; non transparent
        Box(30, 20, 60, 10, RGBA(0, 0, 100, 255))
        StopDrawing()
        
        CreateMaterial(#Material02, TextureID(#Texture02))
        MaterialBlendingMode(#Material02, #PB_Material_AlphaBlend)
        CreateBillboardGroup(#Billboard02, MaterialID(#Material02), 128, 64)
        
      EndIf
    EndIf
    
    If CreateTexture(#Texture03, 256, 256)
      If StartDrawing(TextureOutput(#Texture03))

        Box(0, 0, 255, 255, RGBA(255, 255, 255, 255))
        StopDrawing()
        
        CreateMaterial(#Material03, TextureID(#Texture03))
        CreateBillboardGroup(#Billboard03, MaterialID(#Material03), 128, 64)
        
      EndIf
    EndIf
    
    ; add billboard to back side
    If IsBillboardGroup(#Billboard03)
      AddBillboard(#Billboard03, 0, 0, -30)
    EndIf
    
    ; add billboard to back side
    If IsBillboardGroup(#Billboard01)
      AddBillboard(#Billboard01, 0, 0, -20)
    EndIf
    
    ; add another billboard to front line
    If IsBillboardGroup(#Billboard02)
      AddBillboard(#Billboard02, 0, 0, 10)
    EndIf
    
    CreateCamera(#Camera, 0, 0, 100, 100)
    MoveCamera(#Camera, 0, 60, 100)    
    CameraLookAt(#Camera, 0, 0, 0)
    
    AmbientColor(RGB(255,255,255))
    
  EndIf
  
  Repeat
    
    Repeat
      WinEvent = WindowEvent()
      Select WinEvent
        Case #PB_Event_Gadget
            
          EventGad = EventGadget()
          Select EventGad
            Case #Button
              Select flag
                Case 0
                  HideBillboardGroup(#Billboard01, 1)
                  HideBillboardGroup(#Billboard02, 0)
                  flag = 1
                Case 1
                  HideBillboardGroup(#Billboard01, 0)
                  HideBillboardGroup(#Billboard02, 1)
                  flag = 2 
                Case 2
                  HideBillboardGroup(#Billboard01, 0)
                  HideBillboardGroup(#Billboard02, 0)
                  flag = 0 
              EndSelect
          EndSelect
            
        Case #PB_Event_CloseWindow 
          quit = 1
          
      EndSelect
    Until WinEvent = 0
    
    RenderWorld()      
    FlipBuffers()
  Until quit = 1  

EndIf 
    

0

2

режим надо было выбрать такой и сначала рисовать непрозрачный бокс, а потом сразу-же заливать прозрачным и только потом рисовать картинку:

Код:
DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_AlphaBlend)        
Box(0, 0, 127, 63, RGBA(0, 0, 0, 255))        
Box(0, 0, 127, 63, RGBA(0, 0, 0, 0))

0

3

продолжаем упарываться. почему-то у этих самых билбоардов есть какой-то дурацкий приоритет. кто первый встал - того и тапки. если смотреть с той стороны, как пример стартует - то все в порядке. синий "пистолет" закрывает два оставшихся. поскольку он ближе к зрителю. берем переезжаем камерой и заходим с противоположной стороны. казалось бы - синий становится дальше всех от камеры. но почему-то он считает что те, что ближе к зрителю - прозрачные :) и рисуется поверх них, хотя находится дальше от зрителя. бред бредский. где ошибка?

Код:
Enumeration
  #ShootGunTexture
  #BillBoardMaterialShootgun
  
  #BioScanTexture
  #BillBoardMaterialBioScan
  
  #ThirdTexture
  #BillBoardMaterialThird
EndEnumeration

#CameraSpeed = 1

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
    
    If CreateTexture(#ShootGunTexture, 128, 64)
      If StartDrawing(TextureOutput(#ShootGunTexture))        
        DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_AlphaBlend)        
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 255))        
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 0))        
        
        Box(20, 20, 50, 10, RGBA(200, 200, 200, 255))
        Box(30, 30, 10, 5, RGBA(200, 200, 200, 255))
        
        StopDrawing()
      EndIf
    EndIf    
    CreateMaterial(#BillBoardMaterialShootgun, TextureID(#ShootGunTexture))
    MaterialBlendingMode(#BillBoardMaterialShootgun, #PB_Material_AlphaBlend)    
    Billboard = CreateBillboardGroup(#PB_Any, MaterialID(#BillBoardMaterialShootgun), 10, 10)
    
    If CreateTexture(#BioScanTexture, 128, 64)
      If StartDrawing(TextureOutput(#BioScanTexture))        
        DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_AlphaBlend)        
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 255))        
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 0))        
        
        Box(20, 20, 50, 10, RGBA(200, 0, 0, 255))
        Box(30, 30, 10, 5, RGBA(200, 0, 0, 255))
        
        StopDrawing()
      EndIf
    EndIf
    CreateMaterial(#BillBoardMaterialBioScan, TextureID(#BioScanTexture))
    MaterialBlendingMode(#BillBoardMaterialBioScan, #PB_Material_AlphaBlend)    
    Billboard2 = CreateBillboardGroup(#PB_Any, MaterialID(#BillBoardMaterialBioScan), 10, 10)
    
    If CreateTexture(#ThirdTexture, 128, 64)
      If StartDrawing(TextureOutput(#ThirdTexture))        
        DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_AlphaBlend)        
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 255))        
        Box(0, 0, 127, 63, RGBA(0, 0, 0, 0))        
        
        Box(20, 20, 50, 10, RGBA(0, 0, 200, 255))
        Box(30, 30, 10, 5, RGBA(0, 0, 200, 255))
        
        StopDrawing()
      EndIf
    EndIf
    CreateMaterial(#BillBoardMaterialThird, TextureID(#ThirdTexture))
    MaterialBlendingMode(#BillBoardMaterialThird, #PB_Material_AlphaBlend)    
    Billboard3 = CreateBillboardGroup(#PB_Any, MaterialID(#BillBoardMaterialThird), 10, 10)
    
    Bill1 = AddBillboard(Billboard,   0, 0, -40)
    ;ResizeBillboard(Bill1, Billboard, 32, 16)    
    
    Bill2 = AddBillboard(Billboard2,   0, 0, -20)
    ;ResizeBillboard(Bill2, Billboard2, 32, 16) 
    
    AddBillboard(Billboard3,   0, 0, 0)
    
    Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
    MoveCamera (Camera, 0, 0, 20)
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf
        
      EndIf
      
      RotateCamera(Camera, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (Camera, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
      Delay(10)
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Прозрачность в текстурах.