Luminosité Sprite 3D

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Luminosité Sprite 3D

Message par Thyphoon »

j'ai fais quelques recherches mais je n'ai rien trouvé, en tout cas pour les sprites 3D.
Quelqu'un aurait-il une astuce (pas gourmande en cpu) pour jouer sur la luminosité des sprites3D ? Est ce que l'Alphablending permettrait ça ? c'est le genre de fonction que doit savoir faire le GPU non ?
Anonyme

Message par Anonyme »

Sous Windows avec la 4.0 j'utilisais ca :

Le sprite 3D est composé de deux triangles
dans le sens des aiguilles d'une montre en partant du haut gauche l'ordre est ainsi : 0,1,3,2 il me semble.

Code : Tout sélectionner

Structure vertex
		sx.f
		sy.f
		sz.f
		rhw.f
		Color.l
		specular.l
		tu.f
		tv.f
EndStructure

Structure PB_Sprite3D
			Texture.l         
			Vertice.vertex[4]
			Width.w
			Height.w
EndStructure



Start3D()
     *S.PB_Sprite3D = IsSprite3D(0)
     *S\Vertice[0].Color = RGBA
     *S\Vertice[1].Color = RGBA
     *S\Vertice[3].Color = RGBA
     *S\Vertice[2].Color = RGBA
Stop3D()
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :Sous Windows avec la 4.0 j'utilisais ca :

Le sprite 3D est composé de deux triangles
dans le sens des aiguilles d'une montre en partant du haut gauche l'ordre est ainsi : 0,1,3,2 il me semble.
Intéressant ..je vais essayer de voir comment ça marche et si c'est utilisable dans mon jeu sans perdre trop de perf ...

EDIT: Merci beaucoup :D
Anonyme

Message par Anonyme »

du devrais pas avoir de perte significative.

Code : Tout sélectionner

procedure SetLuminosity3D(spriteid,lum.c)
; 255 = Pleine luminosité 0 = noir
RGB_LUM = rgb(Lum,Lum,Lum)

Start3D()
     *S.PB_Sprite3D = IsSprite3D(spriteid)
     *S\Vertice[0].Color = RGB_LUM 
     *S\Vertice[1].Color = RGB_LUM 
     *S\Vertice[3].Color = RGB_LUM 
     *S\Vertice[2].Color = RGB_LUM 
Stop3D()
endprocedure
Par contre , je ne me rapelle plus si le sprite conserve la couleur des vertices ou si il faut appeler la fct° a chaque fois , si il faut l'appeler a chaque fois , utilise plutôt une macro ! :)

@+
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Je vais faire des tests !! :)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

currieux lorsque je j'utilise cette fonction dans un Start3D et bien quelques soit la valeur de la luminosité , les sprites deviennent invisible une idée ?

Code : Tout sélectionner

Procedure SetLuminosity3D(spriteid.l,lum.c)
  Protected RGB_LUM.l,*S.PB_Sprite3D
  ;doit être dans un Start3D
  ; 255 = Pleine luminosité 0 = noir
  RGB_LUM = RGB(Lum,Lum,Lum)
  *S=IsSprite3D(spriteid)
  *S\Vertice[0]\Color = RGB_LUM
  *S\Vertice[1]\Color = RGB_LUM
  *S\Vertice[3]\Color = RGB_LUM
  *S\Vertice[2]\Color = RGB_LUM
EndProcedure
Edit: En faisant un teste changeant qu'une seul vertice , apparemment ça rend bien transparent !!! :?
Anonyme

Message par Anonyme »

Logique , j'ai oublié de te le préciser , c'est du RGBA ou ABGR / ARGB , je ne sais plus...


RGB(255,255,255) = $00FFFFFF
RGBA(255,255,255,255) = $FFFFFFFF

Code : Tout sélectionner

macro rgba(r,g,b,a)
a << 24 + b << 16 +g << 8 + r  
endmacro
edit: Correction des fautes d'orthographes et de grammaires.
Dernière modification par Anonyme le mar. 28/juil./2009 21:08, modifié 1 fois.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator tu es un Dieu !!! ça marche nickel sans ralentissement !
Je vais pouvoir faire varier la luminosité de la map en fonction du jour ou de la nuit !! :P
Anonyme

Message par Anonyme »

Thyphoon a écrit :Cpl.Bator tu es un Dieu !!! ça marche nickel sans ralentissement !
Je vais pouvoir faire varier la luminosité de la map en fonction du jour ou de la nuit !! :P

Dieu me qualifie déjà ainsi :D



===>[]
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :
Thyphoon a écrit :Cpl.Bator tu es un Dieu !!! ça marche nickel sans ralentissement !
Je vais pouvoir faire varier la luminosité de la map en fonction du jour ou de la nuit !! :P

Dieu me qualifie déjà ainsi :D



===>[]
Lollll !

Tient une question la structure des sprites est propre a purebasic ou a l'OS ? est ce que ça marche sur linux et macos ?
Anonyme

Message par Anonyme »

Pas portable sous linux. :/
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :Pas portable sous linux. :/
Dommage ! Mais peut être existe t'il une alternative !
Je vais prévoir tout de suite la possibilité de désactiver la fonction dans mon code, ça permettra un portable plus facile
Anonyme

Message par Anonyme »

la SDL sans aucun doute , ou directement en opengl.

un conseil , si tu veut faire un code portable , refais les fonctions, je m'explique,
n'utilise pas directement DisplaySprite() ou DisplaySprite3D()

mais

Code : Tout sélectionner

macro DisplaySpriteEX(id,x,y)
select OS
    case Windows
     DisplaySprite(id,x,y)
   case Linux
     AutreFonctionParExemple(id,x,y)
   case Mac
     FunctionDuneLib(id,x,y)
endselect
endmacro
Ensuite tu remplaces tout tes DisplaySprite par DisplaySpriteEX
Chaque OS peut avoir sa propre fonction d'affichage !
c'est surtout utile pour les sprite 3D dans ton cas.
tu fait la même chose pour toute les fonctions qui concerne les sprites 3D
tu laisse en blanc les select/case pour linux , j'essayerais de t'écrire des routines d'affichage pur-opengl.


@+
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :la SDL sans aucun doute , ou directement en opengl.

un conseil , si tu veut faire un code portable , refais les fonctions, je m'explique,
n'utilise pas directement DisplaySprite() ou DisplaySprite3D()

mais

Code : Tout sélectionner

macro DisplaySpriteEX(id,x,y)
select OS
    case Windows
     DisplaySprite(id,x,y)
   case Linux
     AutreFonctionParExemple(id,x,y)
   case Mac
     FunctionDuneLib(id,x,y)
endselect
endmacro
Ensuite tu remplaces tout tes DisplaySprite par DisplaySpriteEX
Chaque OS peut avoir sa propre fonction d'affichage !
c'est surtout utile pour les sprite 3D dans ton cas.
tu fait la même chose pour toute les fonctions qui concerne les sprites 3D
tu laisse en blanc les select/case pour linux , j'essayerais de t'écrire des routines d'affichage pur-opengl.


@+
Merci beaucoup c'est super sympa !je vais suivre tes conseilles :)
Anonyme

Message par Anonyme »

je viens de faire d'autre tests sous linux , en fait , Purebasic sous linux laisse à désiré...
si tu veut une appli portable , fait la même chose aussi pour la gestions des événements ( écran , clavier ) , je pourrais te faire une collection de fonctions qui utilise la SDL & OpenGL , SDL pour le fenetrage , OpenGL pour l'affichage.
Répondre