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
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
Bref, j'en dirais plus le moment venu
@++
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

Publié : dim. 30/juil./2006 20:32
par Flype
ah pardon, j'étais pas sûr. moi et la 3D
A bien y regarder, je comprends un peu mieux OpenGL que DirectX.