MaterialBlendingMode with #PB_Material_AlphaBlend and Billboards

Everything related to 3D programming
SeregaZ
Enthusiast
Enthusiast
Posts: 628
Joined: Fri Feb 20, 2009 9:24 am
Location: Almaty (Kazakhstan. not Borat, but Triple G)
Contact:

MaterialBlendingMode with #PB_Material_AlphaBlend and Billboards

Post by SeregaZ »

It looks like Billboards + MaterialBlendingMode with #PB_Material_AlphaBlend work not really correct. when you start this code - blue billboard is first, it close to camera and cover two other billboards. but when you move camera to opposite side and grey billboard become close to camera - it become to transparent for red and blue. red is transparent for blue. is that #PB_Material_AlphaBlend mode glitched with Z direction ?

how i can make transparent billboard with some image without that problem ?

Code: Select all

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()
  
  mode = #PB_Material_AlphaBlend
  
  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, mode)    
    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, mode)    
    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, mode)    
    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
User avatar
pf shadoko
Enthusiast
Enthusiast
Posts: 385
Joined: Thu Jul 09, 2015 9:07 am

Re: MaterialBlendingMode with #PB_Material_AlphaBlend and Billboards

Post by pf shadoko »

this problem isn't specific to bilborad, it applies to alphablend in general (it would require in-depth sorting, which isn't supported).
however, in your case you can solve it by replacing:

MaterialBlendingMode( ... , mode)
with
SetMaterialAttribute( ... ,#PB_Material_AlphaReject,128)
SeregaZ
Enthusiast
Enthusiast
Posts: 628
Joined: Fri Feb 20, 2009 9:24 am
Location: Almaty (Kazakhstan. not Borat, but Triple G)
Contact:

Re: MaterialBlendingMode with #PB_Material_AlphaBlend and Billboards

Post by SeregaZ »

thanks. *full pants of happy.
Post Reply