[OpenGL] Wie verschiedene Texturen laden ?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

[OpenGL] Wie verschiedene Texturen laden ?

Beitrag von Mijikai »

Ich verstehe nicht warum ich immer nur die zuletzt geladene Textur sehe ??? :(

Hier mein Code:

Code: Alles auswählen


UsePNGImageDecoder()

Procedure.i Texture(*Buffer)
  Protected Image.i
  Protected ImageBuffer.i
  Protected ImageBits.i
  Protected TextureHandle.i
  Protected Width.i
  Protected Height.i
  Image = CatchImage(#PB_Any,*Buffer)
  If IsImage(Image)
    If StartDrawing(ImageOutput(Image))
      ImageBuffer = DrawingBuffer()
      StopDrawing()
      ImageBits = ImageDepth(Image,#PB_Image_InternalDepth)
      Width = ImageWidth(Image)
      Height = ImageHeight(Image)
      glGenTextures_(1,@TextureHandle)
      glBindTexture_(#GL_TEXTURE_RECTANGLE,TextureHandle)
      glTexParameterf_(#GL_TEXTURE_RECTANGLE,#GL_TEXTURE_MIN_FILTER,#GL_LINEAR)
      glTexParameterf_(#GL_TEXTURE_RECTANGLE,#GL_TEXTURE_MAG_FILTER,#GL_LINEAR)
      glTexParameterf_(#GL_TEXTURE_RECTANGLE,#GL_TEXTURE_WRAP_S,#GL_CLAMP_TO_EDGE)
      glTexParameterf_(#GL_TEXTURE_RECTANGLE,#GL_TEXTURE_WRAP_T,#GL_CLAMP_TO_EDGE)
      If ImageBits = 32
        glTexImage2D_(#GL_TEXTURE_RECTANGLE,0,4,Width,Height,0,#GL_BGRA_EXT,#GL_UNSIGNED_BYTE,ImageBuffer)
      Else
        glTexImage2D_(#GL_TEXTURE_RECTANGLE,0,3,Width,Height,0,#GL_BGR_EXT,#GL_UNSIGNED_BYTE,ImageBuffer)
      EndIf
      ProcedureReturn TextureHandle
    EndIf 
    FreeImage(Image)
  EndIf 
EndProcedure

Procedure.i RenderTexture(X.f,Y.f,Width.f,Height.f,Texture.i)
  glBindTexture_(#GL_TEXTURE_2D,Texture)
  glBegin_(#GL_QUADS)
  glColor4f_(1,1,1,1)
  glTexCoord2f_(0,0)
  glVertex2f_(X,Y)
  glTexCoord2f_(Width,0)
  glVertex2f_(X + Width,Y)
  glTexCoord2f_(Width,Height)
  glVertex2f_(X + Width,Y + Height)
  glTexCoord2f_(0,Height)
  glVertex2f_(X,Y + Height)
  glEnd_()
EndProcedure

Procedure.i Test()
  Protected Texture1.i
  Protected Texture2.i
  Protected OpenGL.i
  If OpenWindow(0,0,0,400,400,"TestWindow",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    If OpenGLGadget(1,0,0,400,400,#PB_OpenGL_NoDepthBuffer)
      glShadeModel_(#GL_SMOOTH)
      glEnable_(#GL_BLEND)
      glEnable_(#GL_TEXTURE_2D)
      glEnable_(#GL_TEXTURE_RECTANGLE)
      glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
      glMatrixMode_(#GL_PROJECTION)
      glLoadIdentity_()
      glOrtho_(0,400,400,0,-1000,1000)
      glMatrixMode_(#GL_MODELVIEW)
      glLoadIdentity_()
      glClearColor_(0,0,0,0)         
      Texture1 = Texture(?T1)
      Texture2 = Texture(?T2)
      If Texture1 And Texture2
        Repeat
          glClear_ (#GL_COLOR_BUFFER_BIT)
          RenderTexture(100,100,32,32,Texture1)
          RenderTexture(100,200,32,32,Texture2)
          SetGadgetAttribute(1,#PB_OpenGL_FlipBuffers,#True)
        Until WindowEvent() = #PB_Event_CloseWindow
      EndIf
    EndIf
  EndIf 
EndProcedure

Test()

DataSection
  T1:
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 02000h, 00000h, 02000h, 00608h, 00000h, 07300h, 07A7Ah, 000F4h, 00000h, 07009h, 05948h, 00073h, 00E00h, 000C4h, 00E00h, 001C4h, 02B95h, 01B0Eh, 00000h, 08C00h, 04449h, 05441h, 0C358h, 097EDh, 009C1h, 03080h, 0450Ch, 05B7Fh, 01187h, 04C1Ch, 0489Dh
  !dw 04C1Ch, 032E8h, 03C6Dh, 06C79h, 0E31Ah, 0D041h, 06B9Fh, 0784Ah, 0E484h, 00685h, 08111h, 0D63Bh, 00190h, 09B00h, 0DE8Ch, 01112h, 0072Fh, 00801h, 08040h, 0F5D0h, 01CC0h, 0050Eh, 0013Fh, 02A00h, 0F34Ah, 02ECDh, 05693h, 0307Eh, 029F6h, 0F2B9h, 0D81Ah, 0802Dh, 0ED96h, 01334h, 0395Eh, 0210Eh, 0BA01h, 0B86Bh, 0FF20h, 003BCh
  !dw 01116h, 02445h, 01AD7h, 09456h, 0889Eh, 08438h, 0B004h, 002DFh, 0EDCDh, 0EF46h, 001FBh, 0575Ah, 072CDh, 01F8Eh, 021AFh, 005FFh, 02004h, 0D7C0h, 04E01h, 04052h, 0FB32h, 0877Ch, 0646Eh, 00000h, 00000h, 04549h, 0444Eh, 042AEh, 08260h
  T2:
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 02000h, 00000h, 02000h, 00608h, 00000h, 07300h, 07A7Ah, 000F4h, 00000h, 07009h, 05948h, 00073h, 00E00h, 000C4h, 00E00h, 001C4h, 02B95h, 01B0Eh, 00000h, 07100h, 04449h, 05441h, 0C358h, 0FC63h, 0FFFFh, 0033Fh, 080B9h, 0E171h, 03499h, 00606h, 08606h
  !dw 0F1FFh, 0B326h, 035C8h, 08983h, 08061h, 0A8C1h, 04603h, 0301Dh, 000EAh, 04246h, 000E5h, 0AF2Ch, 00B93h, 09508h, 00311h, 0021Eh, 0942Ch, 004F8h, 0495Fh, 06C48h, 08DC8h, 0C226h, 00751h, 03230h, 0382Ch, 0369Dh, 043B2h, 0D880h, 08882h, 06CDCh, 0E838h, 0A20Bh, 00751h, 09D0Ch, 000BAh, 0D95Fh, 0494Eh, 0398Dh, 0B3F8h, 068E1h
  !dw 060BFh, 001D4h, 00EA3h, 0F618h, 0000Eh, 03C00h, 0312Fh, 0D2ADh, 0896Dh, 000CAh, 00000h, 04900h, 04E45h, 0AE44h, 06042h, 00082h
  EOD:
EndDataSection
Was mach ich falsch ? :freak: :coderselixir:
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [OpenGL] Wie verschiedene Texturen laden ?

Beitrag von ccode_new »

Hallo Mijikai,

ich bin jetzt wieder am Testen ;)

Du scheinst das selbe Problem wie Ich zu haben.

Als ersten Fehler ist zu nennen: Dein "TextureHandle" wird in beiden Fällen an der gleiche Speicherstelle geschrieben.
(Ob das so richtig ist?)

Wenn dies behoben wird ändert das aber nichts an der Ausgabe.

Deine zweite oder erste Textur wird aber angezeigt.

Kann es sein das danach auch nur die Farben nicht korrekt dargestellt werden ?

Ich habe auch immer noch mein Textur-Problem.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [OpenGL] Wie verschiedene Texturen laden ?

Beitrag von Mijikai »

Habs gelöst :oops:
Hab was vergessenr:

Code: Alles auswählen

glBindTexture_(#GL_TEXTURE_2D,Texture)
es sollte so aussehen:

Code: Alles auswählen

glBindTexture_(#GL_TEXTURE_RECTANGLE,Texture)
jetzt gehts :mrgreen:
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [OpenGL] Wie verschiedene Texturen laden ?

Beitrag von ccode_new »

Ohhh!

Stimmt!

Ist mir auch gerade aufgefallen.

Super!

Kannst du mir bei dem Farbenproblem helfen ?

Die unteren 2 Farbquadrate werden in den falschen Farben dargestellt.
(siehe den Thread nebenan ;) )
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten