Page 1 sur 4

RAS LE BOL DES LIMITIATIONS DES SPRITES ...

Publié : sam. 24/févr./2007 19:49
par Thyphoon
désolé pour ce coup de gueule, mais faut que je vous explique...

Toujours a propos de mon jeu.
File:1->Aliens_Invasion.zip
Image

J'ai un problème ...

POur réussir mon effet d'éclairage sans consommer trop de CPU.
Je suis obligé de bidouiller avec les commandes de purebasic

et dans ma boucle principal voilà ce que je suis obligé de faire a chaque fois.

je m'explique pour ne voir que ce qui est éclairé part la lumière
je suis obliger de dessiner la map normalement avec la commande
DisplaySprite() puis je dessine mes sprites de personnage avec
RotateSprite3D() et DisplaySprite3D (les commandes 3D ne fonctionnant que pour dessiner sur l'ecran :(
Ensuite je dois faire un
GrabSprite(#Sprite_Buffer,...)
CreateSprite3D(#Sprite_Buffer,#Sprite_Buffer)
puis je suis obliger de reprendre l'adresse de l'image a chaque fois sinon ça plante

Code : Tout sélectionner

StartDrawing(SpriteOutput(#Sprite_Buffer))
      DBuffer      = DrawingBuffer() 
      DBufferP     = DrawingBufferPitch() 
      PixelFormat  = DrawingBufferPixelFormat() 
      Select PixelFormat 
        Case #PB_PixelFormat_8Bits         : PixelFormat=1 
        Case #PB_PixelFormat_15Bits        : PixelFormat=2 
        Case #PB_PixelFormat_16Bits        : PixelFormat=2 
        Case #PB_PixelFormat_24Bits_RGB    : PixelFormat=3 
        Case #PB_PixelFormat_24Bits_BGR    : PixelFormat=3 
        Case #PB_PixelFormat_32Bits_RGB    : PixelFormat=4 
        Case #PB_PixelFormat_32Bits_BGR    : PixelFormat=4 
      EndSelect
    StopDrawing()
cette information me sert part la suite pour savoir lorsque je trace mon éclairage si je suis sur un mur ou pas. Ayant caché sur le bit de poids faible de la couleur cette information %00 le sol %01 objet mi auteur %11 Mur.

J'efface maintenant l'écran
et je dessine mes effets lumineux avec les commandes
Sprite3DBlendingMode(#D3DBLEND_SRCALPHA, #D3DBLEND_ONE)
DisplaySprite3D()

ensuite je vais redessiner la map avec

Code : Tout sélectionner

      Sprite3DBlendingMode(#D3DBLEND_INVSRCALPHA, #D3DBLEND_SRCCOLOR);
      DisplaySprite3D(#Sprite_Buffer,ME_WinX,ME_WinY)
Ainsi j'ai je n'ai que ce qui est éclairer par la lumière qui s'affiche
Le problème c'est que je suis limité pour la taille de l'affichage a cause de l'utilisation d'un sprite 3D comme buffer qui est en permanance recréé, sachant que ce dernier sur beaucoup de carte graphique fait des petits bugs graphiques....
ça vas bientôt faire 1 an que bosse dessus :(topic original :

http://www.purebasic.fr/french/viewtopi ... =eclairage

j'ai réussi a passer de 13FPS au tout debut a plus de 200FPS, mais voilà ça bug, c'est pas tres propre comme methode... Et je commence a fatigué.

Mais pourquoi ne pouvons nous pas dessiner dans un Sprite avec des sprites 3D ??????
Et sinon quelqu'un aurait il une autre methode ? doit bien avoir un moyen..j'ai l'impression d'avoir tout tester en 1 ans.... Bouuuuuuuuuuuuuuuuuuuuuu pourquoi j'arrive jamais a faire ce que je veux :(

Re: RAS LE BOL DES LIMITIATIONS DES SPRITES ...

Publié : sam. 24/févr./2007 21:00
par Dr. Dri
Thyphoon a écrit :Mais pourquoi ne pouvons nous pas dessiner dans un Sprite avec des sprites 3D ??????
Et sinon quelqu'un aurait il une autre methode ? doit bien avoir un moyen..j'ai l'impression d'avoir tout tester en 1 ans...
Pour la première question, parce que la lib Sprite de PB ne propose pas de flag pour pouvoir faire un rendu 3D dans un Sprite.
Avec un flag PB équivalent au DDSCAPS_3DDEVICE et une fonction UseBuffer3D(#Sprite) ce serait vraiment l'idéal.

Pour la deuxième question, j'imagines que t'as pas essayé de te faire ta propre fonction de création de Sprite qui utiliserait le flag vu ci-dessus et de créer une fonction UseBufer3D. Je pourrais peut être le faire mais j'avoue ne pas avoir été motivé quand j'ai fouillé dans la doc dx7 pour aller trouver ce flag.

Dri

Re: RAS LE BOL DES LIMITIATIONS DES SPRITES ...

Publié : sam. 24/févr./2007 21:06
par Thyphoon
Dr. Dri a écrit : Pour la première question, parce que la lib Sprite de PB ne propose pas de flag pour pouvoir faire un rendu 3D dans un Sprite.
Avec un flag PB équivalent au DDSCAPS_3DDEVICE et une fonction UseBuffer3D(#Sprite) ce serait vraiment l'idéal.

Pour la deuxième question, j'imagine que t'as pas essayé de te faire ta propre fonction de création de Sprite qui utiliserait le flag vu ci-dessus et de créer une fonction UseBufer3D. Je pourrais peut être le faire mais j'avoue ne pas avoir été motivé quand j'ai fouillé dans la doc dx7 pour aller trouver ce flag.

Dri
Je t'avoue que j'ai jamais rien compris aux docs de microsoft. Et que c'est au dessus de mes competances actuelles :( et a chaque fois que j'ai plongé dedans me suis retrouvé completement largué. Crois tu que si je demande a Fred cette possibilité dans le prochaine mis à jour de Purebasic j'aurais une réponse ? :roll:

Ou alors faut que je trouve une autre solution, mais là je suis a sec j'ai testé toutes mes idées et c'était la meilleur...donc si quelqu'un a une idée je suis preneur

Publié : sam. 24/févr./2007 21:28
par Anonyme
j'ai pas tout compris a ton problème :?

Tout soucis est de dessiner dans un sprite 3D ?

Si c'est le cas, tu peut avec StartDrawing()
tu mets en cible le sprite 2D qui à servi à créer le sprite3D

Publié : sam. 24/févr./2007 21:33
par Guimauve
Tu peux toujours faire la suggestion mais ça me surprendrait beaucoup que Fred fasse un spécial juste pour toi. Sans compter que pour le moment Fred est moins actif au sujet de PB.

La mise à jour de la bibliothèque jeux 2D et 3D est prévue après PB V4.0x pour Linux et pour MacOS.

Mais à mon avis, ça ne sera pas disponible avant la fin de l'été ou même avant la fin l'automne prochain. (Qui sait, seul Fred pourrait nous le dire.)

@Cpl.Bator

Le but est de dessiner en temps réel directement sur un Sprite en 3D et non dessiner sur un Sprite2D et recréer le Sprite3D en temps réel.

A+
Guimauve

Publié : sam. 24/févr./2007 21:37
par Dr. Dri
J'ai déjà fait la suggestion, sans aucune réaction (sur le forum anglais)

Dri

Publié : sam. 24/févr./2007 21:48
par Thyphoon
Cpl.Bator a écrit :j'ai pas tout compris a ton problème :?

Tout soucis est de dessiner dans un sprite 3D ?

Si c'est le cas, tu peut avec StartDrawing()
tu mets en cible le sprite 2D qui à servi à créer le sprite3D
Me problème c'est que j'ai besoin de d'afficher des sprite3D dans un sprite donc ces Usebuffer() mais ça ne fonctionne pas. Les sprites 3D ne peuvent fonctionner que sur le screen :( et c'est bien là le problème.
Dr. Dri a écrit : 'ai déjà fait la suggestion, sans aucune réaction (sur le forum anglais)

Oui a l'époque on en avait parlé, et j'avais vu ton message sur le forum anglais. Ne voyant rien venir j'avais trouvé l'astuce de tracer sur l'ecran et de graber ensuite...

Guimauve a écrit : La mise à jour de la bibliothèque jeux 2D et 3D est prévue après PB V4.0x pour Linux et pour MacOS.

Mais à mon avis, ça ne sera pas disponible avant la fin de l'été ou même avant la fin l'automne prochain. (Qui sait, seul Fred pourrait nous le dire.)
Pour fred c'est un peux le problème avec purebasic, et c'est là que je regrette qu'il ne soit pas opensource. Mais je comprends aussi.

ce qui me chagrine c'est que c'est un projet qui me tient a coeur, que ça fait 1 ans que je bosse dessus, il n'y a pas eu une semaine ou j'ai pas retouché le code...et j'ai l'impression d'être toujours au point de depart.

C'est frustrant. ça vient de moi c'est sur mais ça me gave a chaque fois je me retrouve limité part mes connaissances. Et dire qu'on crois que la 2D c'est plus simple que la 3D
:P

Publié : sam. 24/févr./2007 22:34
par comtois
Fred bosse sur la version MacOS, ensuite il faudra qu'il reprenne les libs 2D et 3D pour fonctionner avec Directx9 peut-être qu'à ce moment là il sera possible qu'il ajoute ce que tu souhaites ? en attendant te laisse pas décourager, mets ce problème de côté et avance sur le reste.

Tu peux remplacer ton calcul de faisceau lumineux par un simple sprite, ça sera sans doute moins spectaculaire, mais l'effet peut être intéressant.

Voici un exemple dans Dune 2077 , un jeu vu sur le forum allemand

Image

Publié : sam. 24/févr./2007 22:46
par Dr. Dri
comtois a écrit :Tu peux remplacer ton calcul de faisceau lumineux par un simple sprite, ça sera sans doute moins spectaculaire, mais l'effet peut être intéressant.
Justement nan puisque le faisceau est recalculé en temps réel (d'ailleurs Thyphoon si l'optimisation n'a pas encore été faite, ne fais les modifs que si ton personnage bouge)

Dri

Publié : sam. 24/févr./2007 23:13
par comtois
Dr. Dri a écrit :Justement nan puisque le faisceau est recalculé en temps réel
Oui j'ai bien compris , c'est pour ça que je disais que ça serait moins spectaculaire, et peut-être que l'intérêt du jeu y perdrait ? enfin moi perso j'aime pas trop quand on ne voit pas grand chose, je préfère le principe montré dans l'image ci dessus, le décor est sombre et les jeux de lumière permettent d'éclairer la zone dans laquelle on se trouve.

Publié : dim. 25/févr./2007 4:42
par Thyphoon
comtois a écrit :enfin moi perso j'aime pas trop quand on ne voit pas grand chose, je préfère le principe montré dans l'image ci dessus, le décor est sombre et les jeux de lumière permettent d'éclairer la zone dans laquelle on se trouve.
j'ai déjà essayé l'histoire du sprite pour la lumière mais bon....ça n'a pas le même charme.

L'intêret est vraiment d'explorer certaine partit a la lampe de poche. Mais rassure toi une fois que tu as ré enclenché le disjoncteur et bien la lumière revient :p et j'ai déjà essayer

Je ne laisse pas tomber, je vais laissez pour l'instant comme ça et je pourrais toujours revenir dessus lorsque Fred sera passez a DirectX9.

Merci en tout cas de votre soutient !

Publié : dim. 25/févr./2007 8:51
par comtois
Le problème c'est que je suis limité pour la taille de l'affichage a cause de l'utilisation d'un sprite 3D comme buffer qui est en permanance recréé, sachant que ce dernier sur beaucoup de carte graphique fait des petits bugs graphiques....
Je n'ai pas regardé ton code, peut-être que tu le fais déjà, mais puisque tu n'éclaires qu'une faible partie de la map, tu peux te contenter de créer un buffer de la taille de la zone éclairée ? Actuellement ton buffer fait la taille de l'ensemble de ta map ou seulement la zone éclairée ?

Et quand tu as trouvé l'interrupteur et que toute la map est éclairée, tu peux te passer de buffer et afficher tous les sprites normalement ?

En gros tu aurais deux techniques d'affichage selon que tu sois avec une torche ou non.

Publié : dim. 25/févr./2007 9:10
par Thyphoon
comtois a écrit :
Je n'ai pas regardé ton code, peut-être que tu le fais déjà, mais puisque tu n'éclaires qu'une faible partie de la map, tu peux te contenter de créer un buffer de la taille de la zone éclairée ? Actuellement ton buffer fait la taille de l'ensemble de ta map ou seulement la zone éclairée ?

Et quand tu as trouvé l'interrupteur et que toute la map est éclairée, tu peux te passer de buffer et afficher tous les sprites normalement ?

En gros tu aurais deux techniques d'affichage selon que tu sois avec une torche ou non.
J'y ai déjà pensé, mais ce n'est pas facilement réalisable, car plusieurs faisceau lumineux peuvent se croisé, et une piece peut être allumé et pas celle d'a côté. En tout cas merci d'y avoir réfléchit. :P

Publié : dim. 25/févr./2007 9:22
par Anonyme
Une solution peut resoudre ton problème, c'est de jouer sur la couleur des vertex de ton sprite3D pour simuler la lumiere.
Je vais voir si je peut faire un p'tit snippet.
Avec cette technique tu pourrais aisément changer la couleur de ta torche ^^

@+

Publié : dim. 25/févr./2007 10:04
par Thyphoon
Cpl.Bator a écrit :Une solution peut resoudre ton problème, c'est de jouer sur la couleur des vertex de ton sprite3D pour simuler la lumiere.
Je vais voir si je peut faire un p'tit snippet.
Avec cette technique tu pourrais aisément changer la couleur de ta torche ^^

@+
Je crois que c'est Dr. Dri qui avait utilisé cette technique, mais l'éclairage suivait les blocs de la map tout était carré, et on voyait aussi là ou ce n'était pas éclairé même si c'était plus sombre.

mais je suis currieux de voir ton idée.

Je tient a tous vous remercier de vous êtes penché sur mon problème, je pense que c'est aussi ce qui fait la succès du purebasic, ce sont ses forumeurs dévoué, dont certain sont les mères thérésa de la programmation :P toujorus prêt a aidé !