Page 1 sur 1

OPENGL Stencil & Reflection

Publié : sam. 29/juil./2006 23:35
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

@++

Publié : dim. 30/juil./2006 3:00
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 ;-)

Publié : dim. 30/juil./2006 11:00
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.

Publié : dim. 30/juil./2006 11:54
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

Publié : dim. 30/juil./2006 16:58
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...

Publié : dim. 30/juil./2006 19:32
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

Publié : dim. 30/juil./2006 20:18
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:

Publié : dim. 30/juil./2006 20:32
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.