Transparence avec Dreammotion3D

Généralités sur la programmation 3D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Transparence avec Dreammotion3D

Message par kelebrindae »

Bonjour à tous,

J'essaie de créer des objets transparents avec Dreammotion, mais on dirait que la transparence ne marche que dans l'ordre de création des entités: Celles qui sont créées en dernières sont transparentes pour les précédentes, mais pas l'inverse. :?

Ex: 3 entités 1, 2, et 3 (créées dans cet ordre)
- on peut voir 2 et 1 à travers 3
- on peut voir 1 à travers 2
- mais 1 est opaque à toutes, et 2 masque 3.
(Cf code ci-dessous)

Comment puis-je faire pour chaque objet soit transparent pour tous les autres ?

Code : Tout sélectionner

; Dreammotion alphablending test
; Author: Kelebrindae
; Date: march,14, 2006
; PB version: v4.00
; OS: Windows XP
; Demo: Yes


;- Initialisation 
IncludePath "Include\"  :  IncludeFile "dreamotion3d.pbi"

; Globales
Global numcube.l = 3
Global	*font.CFont
Global	*camera.CEntity
Global	Dim *mesh.CEntity(numcube)


Resultat = MessageRequester("Alphablending test","Full Screen ?",#PB_MessageRequester_YesNo) 
If Resultat = 6      
  FullScreen=1 
Else            
  FullScreen=0 
EndIf 

If InitSprite() = 0 Or InitKeyboard() = 0 
   MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 ) 
   End 
EndIf 

; init Dreammotion 3D screen
DM_Graphics3D(800, 600, 32,  FullScreen, 1)

; load font
*font = DM_LoadFont( "Tahoma",9 , 0)
DM_TextColor(*font, 255,255,0,255)

;- ---- Main program ----

;-Entity 
; Create 3 cubes
*mesh(1) = DM_CreateCube()
DM_ScaleMesh(*mesh(1), 5,5,5)
DM_BrushDiffuse( DM_GetBrush(*mesh(1)), 255,0,0,255)
DM_BrushAmbient( DM_GetBrush(*mesh(1)), 255,0,0,255)
DM_PositionEntity(*mesh(1),0,0,-15)

*mesh(2) = DM_CreateCube()
DM_ScaleMesh(*mesh(2), 5,5,5)
DM_BrushDiffuse( DM_GetBrush(*mesh(2)), 0,255,0,255)
DM_BrushAmbient( DM_GetBrush(*mesh(2)), 0,255,0,255)
DM_PositionEntity(*mesh(2),2,2,0)

*mesh(3) = DM_CreateCube()
DM_ScaleMesh(*mesh(3), 5,5,5)
DM_BrushDiffuse( DM_GetBrush(*mesh(3)), 0,0,255,255)
DM_BrushAmbient( DM_GetBrush(*mesh(3)), 0,0,255,255)
DM_PositionEntity(*mesh(3),-2,-2,15)

; and make 'em transparent
DM_BrushAlpha( DM_GetBrush(*mesh(1)), 255, 2,4)
DM_BrushAlpha( DM_GetBrush(*mesh(2)), 255, 2,4)
DM_BrushAlpha( DM_GetBrush(*mesh(3)), 255, 2,4)
 

;-light
DM_AmbientLight(200, 200,  200)
  
;-Camera 
*camera = DM_CreateCamera()
DM_CameraClsColor(*camera, 0, 0, 0)

;- Main loop
azimuth.f=0
Repeat 
   If fullscreen = 0 
      While WindowEvent() : Wend 
   EndIf
 
   DM_turnEntity(*mesh(1),-1,0.7,1.2)
   DM_turnEntity(*mesh(2),0.6,-1.1,-1)
   DM_turnEntity(*mesh(3),-0.5,-0.7,1.3)
 
   azimuth+1
   If azimuth>=360
     azimuth-360
   EndIf
   DM_PositionEntity(*camera,40*Cos(azimuth * 0.0174533),0,40*Sin(azimuth * 0.0174533))
   DM_PointEntity(*camera,*mesh(2),0.5)
 
   DM_BeginScene()
     DM_RenderWorld(*camera)
   
     ; uncomment this to show FPS
     DM_DrawText(*font, 0,0,Str(DM_FPS ()) + " FPS")
   DM_EndScene()
   
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape) 
DM_ClearGraphics()

[EDIT]
J'ai modifié le code ci-dessus pour le rendre beaucoup plus court (je viens seulement de découvrir la commande "DM_CreateCube()" :oops:).
Anonyme

Message par Anonyme »

c'est un problème pas évident à regler effectivement , c'est du au Z-buffer. tout simplement , donc c'est logique que les mesh ayant de l'apha doivent être rendu en dernier. le problème de dreamotion c'est que la liste des entités est unique pour tout les objets , il faudrais une liste pour les distingués.
Donc ,tu n'a pas le choix , il faut chargé en dernier les meshs ayant de l'alpha , puis de les rendres du plus profond au plus près par rapport à la caméra.
:D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message par kelebrindae »

Oui, je suis allé voir sur le forum de Dreammotion, et j'ai trouvé un post de Tmyke expliquant la même chose.

=> Il faut que je calcule la distance entre chaque objet et la caméra, que je stocke cette distance pour pouvoir les trier, puis que je fasse un "DM_renderObject" pour chacun du plus loin au plus proche. En croisant les doigts pour ne pas prendre une trop grosse claque dans les perfs...

Merci de ta réponse, Cpl_Bator. Je vais essayer ça.
Anonyme

Message par Anonyme »

Ou essaye si tu peut de désactivé le test de profondeur , au lieu du tri. charge quand même tes meshs alpha avant ^^
Répondre