Seite 1 von 1

[OpenGL] Wie verschiedene Texturen laden ?

Verfasst: 28.04.2018 20:10
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:

Re: [OpenGL] Wie verschiedene Texturen laden ?

Verfasst: 28.04.2018 22:34
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.

Re: [OpenGL] Wie verschiedene Texturen laden ?

Verfasst: 28.04.2018 23:13
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:

Re: [OpenGL] Wie verschiedene Texturen laden ?

Verfasst: 28.04.2018 23:26
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 ;) )