probleme de texture
Publié : dim. 20/oct./2024 19:40
bonjour
Je fais un peu de 3d à 'l’ancienne (cpu) mixée a opengl.
J’essaie de faire une rotation 3d de type carte 2d ( style jeu de carte ).
Niveau rotation , pas de problème , mais niveau texture , celle-ci se déforme.
Connaissez vous ce type de problème et comment le résoudre?
Merci.
Je fais un peu de 3d à 'l’ancienne (cpu) mixée a opengl.
J’essaie de faire une rotation 3d de type carte 2d ( style jeu de carte ).
Niveau rotation , pas de problème , mais niveau texture , celle-ci se déforme.
Connaissez vous ce type de problème et comment le résoudre?
Merci.
Code : Tout sélectionner
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
UseGIFImageDecoder()
buffertotal = 4
Global Dim ig.l(0)
Global gl2d_TextureHandle
Structure gl2d_coordonnees
x.f
y.f
EndStructure
Structure gl2d_coordonnees_tex
tx.f
ty.f
EndStructure
Structure gl2d_coordonnees_color
rgba.l
EndStructure
Global Dim gl2d_Vertex.gl2d_coordonnees(buffertotal)
Global Dim gl2d_Vertextex.gl2d_coordonnees_tex(buffertotal)
Global Dim gl2d_Vertexcolor.gl2d_coordonnees_color(buffertotal)
Procedure load_image(t$)
img = LoadImage(0,t$)
If img = 0 : Debug " image non trouveé" : EndIf
ResizeImage(0,64,64)
StartDrawing(ImageOutput(0))
pos = DrawingBuffer()
lg = ImageWidth(0)
ht = ImageHeight(0)
ReDim ig(lg * ht)
For y = 0 To ht - 1 : For x = 0 To lg - 1 : ig((x + y * lg)) = Point(x,y) | $ff000000 : Next : Next
StopDrawing()
glGenTextures_(1, @gl2d_TextureHandle)
glBindTexture_(#GL_TEXTURE_2D, gl2d_TextureHandle);
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, #GL_RGBA, ImageWidth(0), ImageHeight(0), 0,#GL_RGBA, #GL_UNSIGNED_BYTE, @ig())
If img <> 0 :FreeImage(0):EndIf
ProcedureReturn gl2d_TextureHandle
EndProcedure
Procedure OpenWindow2d(px , py , lg , ht , t$ , opt = 0)
ResizeWindow(0, 0, 0, lg, ht)
OpenGLGadget(0,0,0,lg,ht,#PB_OpenGL_Keyboard | #PB_OpenGL_FlipSynchronization )
SetGadgetAttribute(0, #PB_OpenGL_SetContext, #True)
glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
glOrtho_(0, lg, 0 , ht, -100, 100)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
;glViewport_(0, 0, lg, ht);
;glMatrixMode_(#GL_PROJECTION);
;glLoadIdentity_();
;gluPerspective_(45.0, l/h, 1.0, 3000.0);
;glMatrixMode_(#GL_MODELVIEW);
;glLoadIdentity_();
;glTranslatef_(0.0, 0.0, -1000);
glTexCoordPointer_(2, #GL_FLOAT, SizeOf(gl2d_coordonnees_tex), @gl2d_Vertextex(0) )
glVertexPointer_(2, #GL_FLOAT, SizeOf(gl2d_coordonnees), @gl2d_vertex(0))
glColorPointer_(4, #GL_UNSIGNED_BYTE, SizeOf(gl2d_coordonnees_color), @gl2d_Vertexcolor())
EndProcedure
Procedure update(a1.f,a2.f,a3.f,px,py)
glEnable_(#GL_TEXTURE_2D)
glBindTexture_(#GL_TEXTURE_2D, gl2d_TextureHandle)
glEnableClientState_(#GL_VERTEX_ARRAY)
glEnableClientState_(#GL_TEXTURE_COORD_ARRAY)
glEnableClientState_(#GL_COLOR_ARRAY)
glClear_(#GL_COLOR_BUFFER_BIT)
For i = 0 To 3 : gl2d_Vertexcolor(i)\rgba = $ffffffff : Next
Restore Donnees
For i = 0 To 3
Read a.q : Read b.q : Read c.q : Read d.q
gl2d_Vertextex(i)\tx = a
gl2d_Vertextex(i)\ty = b
gl2d_vertex(i)\x = c
gl2d_vertex(i)\y = d
Next
cx.f = Cos(Radian(a1))
sx.f = Sin(Radian(a1))
cy.f = Cos(Radian(a2))
sy.f = Sin(Radian(a2))
cz.f = Cos(Radian(a3))
sz.f = Sin(Radian(a3))
x1.f = cz * cy
y1.f = sz * cy
z1.f = - sy
x2.f = cz * sy * sx - sz * cx
y2.f = sz * sy * sx + cx * cz
z2.f= sx * cy
x3.f = cz * sy * cx + sz * sx
y3.f = sz * sy * cx - cz * sx
z3.f = cx * cy
t0.f = 5
t1.f = 0
For i = 0 To 3
a1 = x1 * gl2d_Vertex(i)\x + y1 * gl2d_Vertex(i)\y
a2 = x2 * gl2d_Vertex(i)\x + y2 * gl2d_Vertex(i)\y
a3 = x3 * gl2d_Vertex(i)\x + y3 * gl2d_Vertex(i)\y
t1 = t0 / ( a3 + t0 )
;t1 = 1
gl2d_Vertex(i)\x = (a1 * t1) * 200 + px
gl2d_Vertex(i)\y = (a2 * t1) * 200 + py
Next
glDrawArrays_(#GL_QUADS, 0, 4)
glDisableClientState_(#GL_COLOR_ARRAY)
glDisableClientState_(#GL_TEXTURE_COORD_ARRAY)
glDisableClientState_(#GL_VERTEX_ARRAY)
glDisable_(#GL_TEXTURE_2D)
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
Delay(1)
EndProcedure
lg = 800
ht = 600
OpenWindow(0,0,0,0,0,"")
OpenWindow2d(0,0,lg,ht,"test")
img1 = Load_Image(#PB_Compiler_Home+"examples/3D/Data/Textures/caisse.png")
a1.f = 0
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
CloseWindow(0)
End
Case #PB_Event_Gadget
Select EventType()
Case #PB_EventType_LeftClick
Case #PB_EventType_RightClick
EndSelect
EndSelect
Until Event = 0
a1 + 1
If a1 > 360 : a1 = 0 : EndIf
update(0,a1,0,lg * 0.5 , ht * 0.5)
ForEver
End
DataSection
Donnees:
Data.q 0 , 1 , -1 , -1 , 0 , 0 , 1 , -1 , 1 , 0 , 1 , 1 , 1 , 1 , -1 , 1
EndDataSection