demo raytracing (mais j y comprend rien)

Généralités sur la programmation 3D
Anonyme

Message par Anonyme »

je doute qu'avec les pc actuels ont puisse faire tourner un jeu de se type , même avec une config musclée. les cartes actuelle n'ont pas a ma connaissance des fonctions cablées concernant le ray-tracing. ou alors il utilise une technique de codage qui m'échappe totalement.
Anonyme

Message par Anonyme »

j'ai répondu à ma question , ils utilisent l'api OpenRT , fait pour le lancer de rayon.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Oui et non, puisque cette api, c'est eux qui l'ont faite :). La carte graphique ne sert qu'à l'affichage (2D!). Tout le boulot est fait par le processeur. Le RT a l'avantage d'utiliser à fond les configs à plusieurs processeurs, et les cartes graphiques pourraient être adaptées pour faire les calculs.

Voit ce très bon article : http://www.pcper.com/article.php?aid=33 ... pert&pid=1

C'est vraiment un domaine de pointe. Si je faisais des études d'info, ça me tenterait bien de faire comme le gars qui a lancé ça (et qui vient de se faire embaucher par intel). Faut quand même être calé en maths ;)
Anonyme

Message par Anonyme »

c'est clair qu'il faut être calé.
le principe est quand même simple en théorie. (pas le code :D )
on lance un rayon sur tout les pixels de l'image à partir du point de vue , ensuite à partir de ce pixel on part vers les sources lumineuses , suivant le vecteur on calcul l'intensité de la lumière ( lambert ? ) , je vais me documenté :D , c'est très intéressant ^^
Anonyme

Message par Anonyme »

Voici un article très intéressant :
http://www.massal.net/article/raytrace/page1.html
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Héhé, j'étais sûr que ça t'intéresserait ;) Moi aussi, surtout depuis que je fais de la 3D avec lightwave (l'un des meilleurs moteurs de rendu!). Merci pour le lien; je crois qu'il y a dans codearchiv une conversion de cet exemple
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

djes a écrit :Héhé, j'étais sûr que ça t'intéresserait ;) Moi aussi, surtout depuis que je fais de la 3D avec lightwave (l'un des meilleurs moteurs de rendu!).
mais avec une ergonomie a pleurer !! :D

j'avais la version 6 , et j'ai fuit !! l'inteface est imbuvable, meme en ayant un livre TUTORIEL !! :?

pas du tout pratique, a utiliser, je prefere nettement 3DsMax qui est beaucoup plus convivial , meme Maya, d'ailleurs qui pourtant est plus ardue que 3dsmax ... , enfin c'est une question de gout :)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

joyeusement illuminé

Message par beauregard »

intéressant ce code !
piste à suivre:
-> remplacer le plot par un sprite d'un seul pixel
-> 3 objets au lieu de 6, afin d'esperer gagner quelques images secondes
Voici une version en mode fenetré, mais le curseur n'est plus là ! ( d'où l'utilisation d'un sprite 3D)

Code : Tout sélectionner

; tonton présente sa convertion du raytracing sur PureBasic.
; beauregard a fabriqué une modeste fenêtre. 
If InitMouse ()=0 Or InitKeyboard ()=0 Or InitSprite ()=0  Or InitSprite3D ()=0 
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf
UsePNGImageDecoder() 

Enumeration
     #fleche     
     #fleche3D
EndEnumeration



nbreplot.l ; connaître le nombre de pixel affiché à l'écran par ce programme, bien complexe.
 
 objnum = 7
   x0.f
   y0.f 
   z0.f
   mv.f
   md.f
   ca.f 
   tn.f
   tb.f
   rz.f
   x1.f
   y1.f
   z1.f
   a2.f
   b2.f
   c2.f
   tb.f
   k.f
   tmin.f
   col.f
   coll.f
   colll.f
   col2.f
   cc.f
   tb.f
   rz.f
   a0.f
   b0.f
   c0.f
   nx.f
   ny.f
   nz.f
   p.f
   d.f
   l.f
   l1.f
   p.f

   Dim OBJ(objnum)
   Dim t(92000)
   Dim t2(92000)
   Dim A(objnum)
   Dim B(objnum)
   Dim C(objnum)
   Dim R(objnum)
   Dim coul_r(objnum)
   Dim coul_v(objnum)
   Dim coul_b(objnum)
   D =1530
   l =00
   OBJ(0) = 0: A(0) = -50 + l: B(0) = 0 + l1: C(0) = -120: R(0) = -10000:coul_r(0)=25:coul_v(0)=25:coul_b(0)=255
   OBJ(1) = 0: A(1) = -80 - l: B(1) = -5 + l1: C(1) = -60: R(1) = -1000:coul_r(1)=155:coul_v(1)=55:coul_b(1)=255
   OBJ(2) = 0: A(2) = 5: B(2) = -80: C(2) = -580: R(2) = -4000:coul_r(2)=255:coul_v(2)=255:coul_b(2)=255
   OBJ(3) = 0: A(3) = -350: B(3) = 10: C(3) = -580: R(3) = -62000:coul_r(3)=255:coul_v(3)=0:coul_b(3)=0
   OBJ(4) = 0: A(4) = -50 + l: B(4) = -50 + l1: C(4) = -100: R(4) = -2000:coul_r(4)=255:coul_v(4)=255:coul_b(4)=55
   OBJ(5) = 0: A(5) = -80 - l: B(5) = 85 + l1: C(5) = -60: R(5) = -1000:coul_r(5)=55:coul_v(5)=255:coul_b(5)=255
   OBJ(6) = 0: A(6) = 16+moux: B(6) = -35+mouy: C(6) = 250

If OpenWindow ( 0 , 0, 0, 320+48, 200+48, "tonton illumine ton PC" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_ScreenCentered  ) ; on ouvre une fenetre
 OpenWindowedScreen ( WindowID ( 0 ), 23, 23, 320, 200, 0, 1, 1) ; fabrication d'un ecran graphique à l'intérieur de la fenêtre.
EndIf

; fleche ( remplaçant la mystérieuse disparition du curseur):
CreateSprite ( #fleche ,32,32, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #fleche ))
  BackColor ( RGB (0,0,0))
 

   LineXY (0,0, 16,0, RGB (250,250,250)) 
   LineXY (16,0, 0,16, RGB (250,250,250))
   LineXY (0,16, 0,0, RGB (250,250,250))

   LineXY (12,6, 16,10, RGB (250,250,250))
   LineXY (16,10, 10,16, RGB (250,250,250))
   LineXY (5,11, 10,16, RGB (250,250,250))
         
 StopDrawing ()
CreateSprite3D ( #fleche3D , #fleche)

; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************
 Event= WindowEvent ()
 ExamineKeyboard():ExamineMouse()
 FlipBuffers() 
 ClearScreen(RGB(0, 0, 0)) 

        StartDrawing(ScreenOutput())   
       
        p = p+0.1
        l=(Sin(p)*80)
        l1=(Cos(p)*180)
     
        
        moux=MouseX()
        mouy=MouseY()
   
        a(6)=moux*4-800
        b(6)=mouy*4-400
        A(0) = 50 + l
        A(1) = 90 - l
        b(0) = 80 + l
        b(1) = 50 - l1
        A(4) = 40 + l
        A(5) = 10 - l1
        b(4) = 51 + l1
        b(5) = 40 - l
     
        For YQ =0 To 199
         For XQ =0 To 319
          X0 = (-120 + XQ)
          Y0 = (-100 + YQ)
          Gosub raytrace
          Plot (xq,yq,RGB(col,coll,colll)): nbreplot+1 
         Next
        Next
        ;Plot (moux, mouy, RGB( 255, 255, 255))
        StopDrawing()





 Start3D() 
   DisplaySprite3D ( #fleche3D , MouseX (), MouseY (), 100); remplace le curseur mystérieusement disparu...
 Stop3D ()


 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))
    
     moux$= Str (moux)
     mouy$= Str (mouy)
     nbreplot$= Str (nbreplot)
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,80+1, "moux: " +moux$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,80, "moux: " +moux$)
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,100+1, "mouy: " +mouy$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,100, "mouy: " +mouy$)     
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,120+1, "nbreplot: " +nbreplot$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,120, "nbreplot: " +nbreplot$)

 StopDrawing ()
 
 nbreplot=0
        
 If KeyboardPushed ( #PB_Key_F ) And nbreis=0:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=1:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F ) And nbreis=2:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=3:nbreis=0:EndIf 
 
    Gosub fps ; nombre d'image par seconde.
   

 Delay(1)
 If Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ):End:EndIf
ForEver


        
        
        
raytrace:
        Z0 = 0
        MD = 1 / Sqr(X0 * X0 + Y0 * Y0 + d * d)
        X1 = X0 * MD
        Y1 = Y0 * MD
        Z1 = -(D + Z0) * MD
        K = 0
        COL = 0
        COLl = 0
        COLll = 0
        OBJMIN = objnum
Top:
        Gosub  test_inter
        OBJMIN = OBJMIN2
        If TMIN < 327680 And (OBJ(OBJMIN) = 0)
          Gosub  reflec
          Gosub  ombre   
          If s = 0
            MV = Sqr(NX * NX + NY * NY + NZ * NZ)
            COL2 = ((X1 * A2 + Y1 * B2 + Z1 * C2)*2+ (NX * A2 + NY * B2 + NZ * C2) / MV )
            If COL2 < 0
              COL2 = 0
            EndIf
            COL =((COL+COL2*((K+1)*(K+1))*coul_r(OBJMIN))/4)/255
            COLl =((coll+COL2*((K+1)*(K+1))*coul_v(OBJMIN))/4)/255
            COLll =((colll+cOL2*((K+1)*(K+1))*coul_b(OBJMIN))/4)/255
            If COL > 1
              COL = 1
            EndIf
            If COLl > 1
              COLl = 1
            EndIf
            If COLll > 1
              COLll = 1
            EndIf
          EndIf
          K = K + 0.1
        EndIf
        If TMIN < 327680 And K <= 1
          Goto Top
        EndIf
        If K = 0
          COL = 55
          COLl = 55
          COLll = 55
        Else
          COL = COL * 255
          COLl = COLl * 255
          COLll = COLll * 255
          If col>255
            col=255
          EndIf
          If coll>255
            coll=255
          EndIf
          If colll>255
            colll=255
          EndIf
        EndIf
Return

test_inter:       
        TMIN = 327680
        For n = 0 To 5
          A0 = A(n) - X0
          B0 = B(n) - Y0
          C0 = C(n) - Z0
          TB = A0 * X1 + B0 * Y1 + C0 * Z1
          RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
          If RZ >= R(n)
            TN = TB - Sqr(RZ - R(n))
            If TN < TMIN And TN > 0
              TMIN = TN:OBJMIN2 = n
            EndIf
          EndIf
        Next       
Return

reflec:
        X0 = X0 + X1 * TMIN
        Y0 = Y0 + Y1 * TMIN
        Z0 = Z0 + Z1 * TMIN
        NX = X0 - A(OBJMIN)
        NY = Y0 - B(OBJMIN)
        NZ = Z0 - C(OBJMIN)
        CA = 2*(NX * X1 + NY * Y1 + NZ * Z1) / ((NX * NX + NY * NY + NZ * NZ +1))
        X1 = X1 - NX * CA
        Y1 = Y1 - NY * CA
        Z1 = Z1 - NZ * CA
        A2 = A(6) - X0
        B2 = B(6) - Y0
        C2 = C(6) - Z0
        MV =  1/Sqr(A2 * A2 + B2 * B2 + C2 * C2)
        A2 = A2 * MV
        B2 = B2 * MV
        C2 = C2 * MV
Return

ombre:       
        s = 0
        For n = 0 To 5
          If OBJ(n) = 0 And s = 0
            A0 = X0 - A(n)
            B0 = Y0 - B(n)
            C0 = Z0 - C(n)
            TB = A2 * A0 + B2 * B0 + C2 * C0
            RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
            If RZ >= R(n) And TB < 0
              s = -1
            EndIf
          EndIf
        Next   
Return  
   
fps:
 If Val ( FormatDate ( "%ss" , Date ()))=sek ; regardez pas là, c'est trop compliqué. Arrêtez j'vous dis! Bon ben, je
     ; vous aurez prévenu...
    fps+1
 Else
    FPS$= Str (fps)
    fps=0
 EndIf
 sek= Val ( FormatDate ( "%ss" , Date ()))
 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))
 If nbreis=1 Or nbreis=2:DrawText (1,1, "FPS: " +FPS$):EndIf
 StopDrawing ()
Return         
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Bah, c'est une question de goût et d'habitude. On a dans LW un contrôle très précis de tous les objets, ce qui est caché dans la plupart des autres logiciels. C'est justement ce que j'apprécie; je ne fais pas de la modélisation "intuitive", qui aboutit le plus souvent à des milliers de polygones disséminés un peu n'importe comment. C'est sûr que pour des surfaces organiques ou naturelles, c'est mieux, mais j'y arrive très bien aussi avec, alors...
J'ai essayé 3dmax et j'ai vomi plusieurs fois ;)
Dobro a écrit :
djes a écrit :Héhé, j'étais sûr que ça t'intéresserait ;) Moi aussi, surtout depuis que je fais de la 3D avec lightwave (l'un des meilleurs moteurs de rendu!).
mais avec une ergonomie a pleurer !! :D

j'avais la version 6 , et j'ai fuit !! l'inteface est imbuvable, meme en ayant un livre TUTORIEL !! :?

pas du tout pratique, a utiliser, je prefere nettement 3DsMax qui est beaucoup plus convivial , meme Maya, d'ailleurs qui pourtant est plus ardue que 3dsmax ... , enfin c'est une question de gout :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Cpl.Bator a écrit :Voici un article très intéressant :
http://www.massal.net/article/raytrace/page1.html
Ce lien est vraiment excellent!!! :D
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Juste en passant un renderer très convivial (c'est rare) et gratoche ce qui ne gache rien :D
Kerkythea c'est Noël :)
Répondre