effet de lumière

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

effet de lumière

Message par Thyphoon »

J'étais trop fier de moi, j'avais trouvé une technique pour faire des zolies effets de lumières et ça marchait du feu de dieu ...
Mais en rentrant chez moi,je suis vachement surprit ! ce code fonctionne sur tout les vieux pcs ...et sur le plus récent il saccade a mort (i7 860 et ATI HD5700 avec PBx64)
pour tester changer la ligne avec le LoadSprite(0,"sol.jpg",#PB_Sprite_Texture) pour la faire pointer sur une image en jpg sur votre disque dur !
dite moi ce que ça donne chez vous, et si vous avez une idée d'où peut venir cette saccade ?

Code : Tout sélectionner

;-http://www.alpha-arts.net/blog/articles/view/18/moteur-de-lumieres

Structure game
  width.l
  height.l
  backgroundColor.l
EndStructure

Global game.game
game\width=800
game\height=600
game\backgroundColor=#White

If InitSprite() And InitSprite3D()
  If InitKeyboard() And InitMouse()
    winMain = OpenWindow(#PB_Any,0,0,game\width,game\height,"Press [Esc] to close",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    OpenWindowedScreen(WindowID(winMain), 0, 0, game\width, game\height, 1, 0, 0)
    UsePNGImageDecoder()
    UseJPEGImageDecoder()
    SetFrameRate(60)
  EndIf
Else
  MessageRequester("","Unable to initsprite") :
EndIf
UseJPEGImageDecoder()

Enumeration
  #Background
  #ClearScreen
  #Light1
  #Light2
  #Light3
  #CompositeLight
EndEnumeration

LoadSprite(#Background,"sol.jpg",#PB_Sprite_Texture)
CreateSprite3D(#Background,#Background)

CreateSprite(#ClearScreen,16,16,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#ClearScreen))
Box(0,0,16,16,RGB(1,1,1))
StopDrawing()
CreateSprite3D(#ClearScreen,#ClearScreen)

CreateSprite(#Light1,256,256,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#Light1))
Box(0,0,256,256,#Black)
For z=0 To 128  
  col=RGB(z*2,0,0)
  Circle(128,128,128-z,col)
Next
StopDrawing()
CreateSprite3D(#Light1,#Light1)

CreateSprite(#Light2,256,256,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#Light2))
Box(0,0,256,256,#Black)
For z=0 To 128  
  col=RGB(0,z*2,0)
  Circle(128,128,128-z,col)
Next
StopDrawing()
CreateSprite3D(#Light2,#Light2)

CreateSprite(#Light3,256,256,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#Light3))
Box(0,0,256,256,#Black)
For z=0 To 128  
  col=RGB(z*2,z*2,z*2)
  Circle(128,128,128-z,col)
Next
StopDrawing()
CreateSprite3D(#Light3,#Light3)

Macro myClearScreen()
  Sprite3DBlendingMode(5, 6):ZoomSprite3D(#ClearScreen,game\width,game\height):DisplaySprite3D(#ClearScreen,0,0)
EndMacro


Repeat
  Delay(1)
  EventID = WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  Start3D()
  Sprite3DQuality(0)
  ;On efface l'ecran
  myClearScreen()
  
  ;On dessine les lumières
  Sprite3DBlendingMode(2, 4)
  DisplaySprite3D(#Light1,128,0)
  DisplaySprite3D(#Light2,128,128)
  DisplaySprite3D(#Light3,MouseX(),MouseY())
  
  ;On memorise ke sprite
  If IsSprite3D(#CompositeLight):FreeSprite3D(#CompositeLight):FreeSprite(#CompositeLight):EndIf
  GrabSprite(#CompositeLight,0,0,game\width,game\height,#PB_Sprite_Texture)
  CreateSprite3D(#CompositeLight,#CompositeLight)
  
  ;On passe en mode normal
  myClearScreen()
  ;j'affiche le fond
  DisplaySprite3D(0,0,0)
  ;On rajoute la lumière
  Sprite3DBlendingMode(6, 3)
  DisplaySprite3D(#CompositeLight,0,0)
  Stop3D()
  StartDrawing(ScreenOutput())
  DrawText(20,20,Str(x)+" "+Str(y))
  StopDrawing()
  FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow

Dernière modification par Thyphoon le mar. 14/juin/2011 17:48, modifié 1 fois.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: effet de lumière

Message par G-Rom »

Ta boucle principale est merdique, tu effaces l'écran 2x à la suite , dont le 2° dans un bloc Start3D() Stop3D().
y des trucs en trop a mon avis ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: effet de lumière

Message par Thyphoon »

G-Rom a écrit :Ta boucle principale est merdique, tu effaces l'écran 2x à la suite , dont le 2° dans un bloc Start3D() Stop3D().
y des trucs en trop a mon avis ;)
effectivement j'ai pas du copier le code du bon onglet ...lolllllll
Mais ça ne change pas grand chose au problème... c'est normal l'effacement 2 fois de l'ecran !
c'est le seul moyen pour ce genre de rendu.
Mais ce qui est currieux c'est que ça marche super au boulot, et sur tout les vieux pc et sur les pcs les plus recent ....ça saccade tellement qu'on peut presque pas bouger la lumière diriger part la souris !
J'ai mis a jour le code au dessus part ce que j'aurais du mettre des le départs ça sera peut plus claire !
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: effet de lumière

Message par graph100 »

G-Rom a écrit :Mais ça ne change pas grand chose au problème... c'est normal l'effacement 2 fois de l'ecran !
c'est le seul moyen pour ce genre de rendu.
Il me semble que pour dessiner sur un sprite, tu peux utiliser UseBuffer()

Sinon, ça saccade sec chez moi ;'( impossible de faire quoi que ce soit.

sur : Dual Core 2.00Ghz Window Vista, avec une carte pas trop pourris ;)

[edit] c'est pas parceque tu utilise des sprites qui ont une taille quelconque ?
Dernière modification par graph100 le mar. 14/juin/2011 22:03, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: effet de lumière

Message par Thyphoon »

graph100 a écrit :
G-Rom a écrit :Mais ça ne change pas grand chose au problème... c'est normal l'effacement 2 fois de l'ecran !
c'est le seul moyen pour ce genre de rendu.
Il me semble que pour dessiner sur un sprite, tu peux utiliser UseBuffer()

Sinon, ça saccade sec chez moi ;'( impossible de faire quoi que ce soit.

sur : Dual Core 2.00Ghz Window Vista, avec une carte pas trop pourris ;)
Usebuffer ne marche pas avec les sprites 3D c'est un peu le problème !
merci graph100 d'avoir testé. Tu utilises quel version de PB ? x64 ? x86 ?
le pire c'est que sur mon petit portable msi Wind 1,6Ghz un seul coeur, c'est super fluide !
c'est là que je sèche !
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: effet de lumière

Message par G-Rom »

Sur mon windows sa marche bien. ton second MyClearScreen() ne sert à rien.
ton tuto est basé sur la sfml , je le connais très bien , tu ne pourras jamais faire la même chose en purebasic avec les commandes natif, la lib sprite3D() est "has been".
La sfml te permet de dessiner directement sur une texture ( sur la CG donc ) via la classe sf::RenderImage , PureBasic ne te le permet pas. tu grab l'écran en permanence d'ou le problème à mon avis. sinon pour la lumière j'aurais mis :
Sprite3DBlendingMode(7, 2)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: effet de lumière

Message par graph100 »

J'utilise PBx86 4.60beta2 sur un portable 64bit.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: effet de lumière

Message par Thyphoon »

merci beaucoup ! C'est bien dommage tout ça ! mais le comportement de pb est assez curieux sur ce coup là pour ça rame sur des machines recentes et pas sur des vieux coucou ..
pas de Usebuffer3D plus textureOutput() ... C'est dommage.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: effet de lumière

Message par G-Rom »

oui , la lib 3D est 'has-been' , il manque plein de fonctionnalité , comme par exemple pouvoir appliquer des shaders , faire du rtt , bref , le standard d'aujourd'hui , là , c'est les sprites d'hier avec une "accélération" d'aujourd'hui, point barre. ^^
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: effet de lumière

Message par Thyphoon »

G-Rom a écrit :oui , la lib 3D est 'has-been' , il manque plein de fonctionnalité , comme par exemple pouvoir appliquer des shaders , faire du rtt , bref , le standard d'aujourd'hui , là , c'est les sprites d'hier avec une "accélération" d'aujourd'hui, point barre. ^^
Et a ton avis une chance que ça évolue dans PB prochainement ou pas ?
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: effet de lumière

Message par G-Rom »

Aucune idée , j'ai pas une boule de cristal :D
Dans un avenir proche , je dirais que non.
Si tu veut du sérieux , faut se tourné vers la SFML, et le c++...

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

Re: effet de lumière

Message par Thyphoon »

G-Rom a écrit :Aucune idée , j'ai pas une boule de cristal :D
Dans un avenir proche , je dirais que non.
Si tu veut du sérieux , faut se tourné vers la SFML, et le c++...

@+ ;)
merci du conseille c'est peut être ce que je vais finir part faire !
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: effet de lumière

Message par Geo Trouvpatou »

Salut j'vais dire 2 conneries.

1) J'suis l'plus beau.
2) Dans les options du compilo pour bibiliothèque sous-système (comme dirait Homer) faudrait pas mettre directx7 machin chose.
C'est peut-être ça qui est utilisé à ton boulot sur ton vieux coucou.
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: effet de lumière

Message par Thyphoon »

Geo Trouvpatou a écrit :Salut j'vais dire 2 conneries.
:mrgreen:
Geo Trouvpatou a écrit : 1) J'suis l'plus beau.
lolllll mais qui en aurait douté !
Geo Trouvpatou a écrit : 2) Dans les options du compilo pour bibiliothèque sous-système (comme dirait Homer) faudrait pas mettre directx7 machin chose.
C'est peut-être ça qui est utilisé à ton boulot sur ton vieux coucou.
Et bien l'idée était bonne mais apparement c'est pas ça !
merci d'avoir joué avec nous! :wink:
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: effet de lumière

Message par blendman »

salut

Chez moi, ça ne rame pas.
la lib 3D est 'has-been' , il manque plein de fonctionnalité , comme par exemple pouvoir appliquer des shaders , faire du rtt , bref , le standard d'aujourd'hui , là , c'est les sprites d'hier avec une "accélération" d'aujourd'hui, point barre. ^^
RTT c'est quoi ?

Sinon, même si c'est has been ça permet quand même de faire de fort jolis jeux je trouve :).
Mais c'est clair que si une mise à jour de la lib sprite3D() permettait d'ajouter des fonctions, et de faire d'encore plus beaux effets de lumières/ombre, ce serait la classe :).

Faut motiver Fred avec nos jeux et lui montrer qu'on fait des superbes jeux en pb :) (cela dit, il faut déjà dire que la version actuelle (4.60 beta) a ajouté beaucoup de fonctions en 3D (ogre), grâce à toi, G-rom, donc il faut peut être leur laisser le temps de digérer ça ;)).

EDIT :
tu as essayé d'enlever le drawtext() pour voir ?
des fois, ça fait ramer ;) :

Code : Tout sélectionner

;startDrawing(ScreenOutput())
  ;DrawText(20,20,Str(x)+" "+Str(y))
  ;StopDrawing()
Répondre