Luminosité Sprite 3D
Luminosité Sprite 3D
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 ?
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 ?
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.
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()
Intéressant ..je vais essayer de voir comment ça marche et si c'est utilisable dans mon jeu sans perdre trop de perf ...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.
EDIT: Merci beaucoup

du devrais pas avoir de perte significative.
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 ! 
@+
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

@+
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 ?
Edit: En faisant un teste changeant qu'une seul vertice , apparemment ça rend bien transparent !!! 
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

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
edit: Correction des fautes d'orthographes et de grammaires.
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
Dernière modification par Anonyme le mar. 28/juil./2009 21:08, modifié 1 fois.
Lollll !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 !!
Dieu me qualifie déjà ainsi
===>[]
Tient une question la structure des sprites est propre a purebasic ou a l'OS ? est ce que ça marche sur linux et macos ?
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
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.
@+
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
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 conseillesCpl.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
Ensuite tu remplaces tout tes DisplaySprite par DisplaySpriteEXCode : 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
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.
@+

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.
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.