OPENGL Stencil & Reflection

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

OPENGL Stencil & Reflection

Message par Anonyme »

Salut, voici une p'tite démo3D montrant quelques capacitées d'OpenGL
Désolé le code source n'est pas commenté, mais il n'y a rien de difficile.
je me suis basé sur la lecon 26 sur nehe :

http://nehe.gamedev.net/data/lessons/le ... ?lesson=26

Voici la démo :

File:1->ReflectionStencil.rar
Image

Dans peut de temps je vais mettre en ligne la suite de mon p'tit moteur3D, j'y ai apporté beaucoup d'optimisation.
il est Orienté objet (c'est plus simple à utiliser)
Deux classes importantes ont été codée , Class_camera,Class_Mesh.
on peut gerer pour le moment qu'une camera libre. pour les meshs , 2 format, le ASE de 3dsmax6 et le B3D fait maison :D
Bref, j'en dirais plus le moment venu :P

@++
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est excellent.

j'ai parcouru le code ma foi très intéressant.

par contre je me demande pourquoi tu t'embêtes avec
des PokeF() alors que tu peux utiliser un simple tableau :

Code : Tout sélectionner

Global *eqr = AllocateMemory(4*4)
Global *LightAmb = AllocateMemory(4*4)
Global *LightDif = AllocateMemory(4*4)
Global *LightPos = AllocateMemory(4*4)

PokeF(*eqr,0.0):PokeF(*eqr+4,0.0):PokeF(*eqr+8,0.0):PokeF(*eqr+12,-1.0)
PokeF(*LightAmb,0.7):PokeF(*LightAmb+4,0.7):PokeF(*LightAmb+8,0.7):PokeF(*LightAmb+12,1)
PokeF(*LightDif,1.0):PokeF(*LightDif+4,1.0):PokeF(*LightDif+8,1.0):PokeF(*LightDif+12,1)
PokeF(*LightPos,-4.0):PokeF(*LightPos+4,4.0):PokeF(*LightPos+8,-4.0):PokeF(*LightPos+12,1)

glLightfv_(#GL_LIGHT0, #GL_AMBIENT,  *LightAmb)
glLightfv_(#GL_LIGHT0, #GL_DIFFUSE,  *LightDif)
glLightfv_(#GL_LIGHT0, #GL_POSITION, *LightPos)
avec des tableaux de flottants :

Code : Tout sélectionner

Global Dim Equation.f(4)
Global Dim LightAmb.f(4)
Global Dim LightDif.f(4)
Global Dim LightPos.f(4)

Equation(0) =  0.0
Equation(1) =  0.0
Equation(2) =  0.0
Equation(3) = -1.0

LightAmb(0) = 0.7
LightAmb(1) = 0.7
LightAmb(2) = 0.7
LightAmb(3) = 1.0
       
LightDif(0) = 1.0
LightDif(1) = 1.0
LightDif(2) = 1.0
LightDif(3) = 1.0
       
LightPos(0) = -4.0
LightPos(1) =  4.0
LightPos(2) = -4.0
LightPos(3) =  1.0

glLightfv_(#GL_LIGHT0, #GL_AMBIENT,  LightAmb())
glLightfv_(#GL_LIGHT0, #GL_DIFFUSE,  LightDif())
glLightfv_(#GL_LIGHT0, #GL_POSITION, LightPos())
C'est beaucoup plus lisible ;-)
Image
Anonyme

Message par Anonyme »

C'est une habitude que j'ai pris, car le fait t'utilisé un tableau ou une liste chainée fait que l'on perds beaucoup en perf.
par exemple si tu utilise un tableau pour stocker une liste de sommets
et que si tu utilises ce meme tableau pour l'affichage, niveau optimisation , c'est pas le top, les peek/poke , contournent le problème.
Tu as raisons de toute façon, dans cette exemple, les peek/poke n'était pas néssesaires.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah si tu veux encore plus optimiser remplace tes peek/poke par des pointeurs ^^

Code : Tout sélectionner

Structure Floats
  f.f[0]
EndStructure

Global *LightPos.Floats = AllocateMemory(SizeOf(Float) * 4)

*LightPos\f[0] = -4.0
*LightPos\f[1] =  4.0
*LightPos\f[2] = -4.0
*LightPos\f[3] =  1.0
Dri
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Très prometteur, bravo !

J'attends avec grande impatience le jour où, grâce à tous vos travaux, la 3D en Pure me sera accessible...
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

pour la procédure LoadTextureGL() je l'ai un peu accélérée.
il n'y a pas de fonction OpenGL pour faire çà, c'est étonnant.
ceci dit çà marche bien comme çà de toutes façons.

Code : Tout sélectionner

Macro RGBA(bgr, a)
  ( (bgr) | ( (a) << 24 ) )
EndMacro

Procedure LoadTextureGL(Filename.s, TransparentColor.l, Filter.l) 
  
  Protected image.l, w.l, h.l, rgb.l, index.l, texture.l
  
  image = LoadImage(#PB_Any, Filename) 
  
  If image 
    
    w = ImageWidth(image) 
    h = ImageHeight(image) 
    
    Protected Dim ImageData.l(w*h) 
    
    If StartDrawing(ImageOutput(image)) 
      For x = 0 To w - 1
        For y = 0 To h - 1
          rgb = Point(x, y) 
          If rgb = TransparentColor 
            ImageData(index) = RGBA(rgb, 0) 
          Else
            ImageData(index) = RGBA(rgb, 255) 
          EndIf 
          index + 1 
        Next 
      Next 
      StopDrawing()
    EndIf 
    
    glGenTextures_(1, @texture) 
    glBindTexture_(#GL_TEXTURE_2D, texture) 
    
    Select Filter
      Case 0 
        glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
        glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
        glTexImage2D_   (#GL_TEXTURE_2D, 0, 3, w, h, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
      Case 1 
        glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
        glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
        glTexImage2D_   (#GL_TEXTURE_2D, 0, 3, w, h, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
      Case 2 
        glTexParameteri_  (#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
        glTexParameteri_  (#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST) 
        gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, w, h, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    EndSelect
    
    FreeImage(image)
    
  EndIf
  
  ProcedureReturn texture 
  
EndProcedure
Image
Anonyme

Message par Anonyme »

La texture reste à l'envers.
il faut faire y = ImageHeight()-1 to 0 step -1
Car OpenGL inverse les Y, 0,0 correspond au bord gauche/bas de l'écran.
Cepandant , il est encore possible de l'optimiser en enlevant Point()
et en le remplacant par DrawingBuffer()
Ceci dit, très bonne initiative de ta part :wink:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ah pardon, j'étais pas sûr. moi et la 3D :? :D

A bien y regarder, je comprends un peu mieux OpenGL que DirectX.
Image
Répondre