OpenGL Texture Loader Erweiterung

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

OpenGL Texture Loader Erweiterung

Beitrag von Makke »

Hallo der Originale Textureloader kommt von DarkDragon, diesen habe ich erweitert um:

- einen Loader TGA Bilder mit Alphakanal lädt (32bit) oder ohne Alphakanal (24bit) die Bilder können auch komprimiert (RLE) vorliegen (UseTGAImageDecoder() ist nicht erforderlich)
- einen Loader der jedes Bild lädt das PB so laden kann und bei der Textureerstellung kann man eine Farbe als Transparente Farbe angeben
- einen Loader der aus dem übergebenen Bild zusätzlich das Graustufenbild als Alphakanal zurück gibt
- einen Creator (mir fällt kein besseres Wort ein) mit dem man ein einfarbiges Solid erstellen kann

Die Proceduren benutzen die OpenGL Konstanten, entweder müsst Ihr zum ausprobieren die Konstanten entsprechend deklarieren oder Ihr benutzt die OpenGL.pbi aus dem CodeArchiv.

Wenn jemand Beispielcode möchte, einfach Bescheid sagen, dann liefere ich den noch nach.

Hier die Proceduren:

Code: Alles auswählen

Procedure.i CreateSolidOpenGlTexture(TextureWidth.i, TextureHeight.i, RGB_Color.i, TextureFilter.i=0)
  
  Protected.i x, y, i, Texture
  Dim ImageData.b(TextureWidth * TextureHeight * 3) 
  
  For y = 0 To TextureHeight-1 
    
    For x = 0 To TextureWidth-1 
      
      ImageData(i) = Red(RGB_Color) 
      i + 1 
      ImageData(i) = Green(RGB_Color) 
      i + 1 
      ImageData(i) = Blue(RGB_Color) 
      i + 1 
    
    Next
    
  Next 
  
  glGenTextures_(1, @Texture)
  
  If TextureFilter = 0
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGB, TextureWidth, TextureHeight, #Null, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 1 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGB, TextureWidth, TextureHeight, #Null, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 2 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    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, TextureWidth, TextureHeight, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 3
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR) 
    gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, TextureWidth, TextureHeight, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  EndIf 
  
  Dim ImageData.b(0)
  
  ProcedureReturn Texture
  
EndProcedure

Procedure.i LoadOpenGlTextureTransparent(FileName.s, TransparentColor.i, TextureFilter.i=0)
  
  Protected.i ImageId, ImageWidth, ImageHeight, x, y, Color, i, Texture
  
  If UCase(GetExtensionPart(FileName)) <> "PNG" And UCase(GetExtensionPart(FileName)) <> "TGA"
    ProcedureReturn 0
  EndIf
  
  ImageId = LoadImage(#PB_Any, FileName)
  
  If IsImage(ImageId)
    ImageWidth  = ImageWidth(ImageId)
    ImageHeight = ImageHeight(ImageId)
  Else
    ProcedureReturn 0
  EndIf
  
  Dim ImageData.b(ImageWidth * ImageHeight * 4) 
  
  StartDrawing(ImageOutput(ImageId)) 
  
  ;For y = 0 To ImageHeight-1 
  For y = ImageHeight-1 To 0 Step -1
    
    For x = 0 To ImageWidth-1 
      
      Color = Point(x, y) 
      ImageData(i) = Red(Color) 
      i + 1 
      ImageData(i) = Green(Color) 
      i + 1 
      ImageData(i) = Blue(Color) 
      i + 1
      If Color = TransparentColor
        ImageData(i) = 0
      Else
        ImageData(i) = 255
      EndIf
      i + 1
    
    Next
    
  Next 
  
  StopDrawing() 
  
  FreeImage(ImageId)
  
  glGenTextures_(1, @Texture)
  
  If TextureFilter = 0
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 1 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 2 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    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, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 3
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR) 
    gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  EndIf 
  
  Dim ImageData.b(0)
  
  ProcedureReturn Texture
  
EndProcedure

Procedure.i LoadOpenGlTextureAlpha(FileName.s, TextureFilter.i=0)
  
  Protected.i ImageId, ImageWidth, ImageHeight, x, y, Color, i, Texture
  
  If UCase(GetExtensionPart(FileName)) <> "PNG" And UCase(GetExtensionPart(FileName)) <> "TGA"
    ProcedureReturn 0
  EndIf
  
  ImageId = LoadImage(#PB_Any, FileName)
  
  If IsImage(ImageId)
    ImageWidth  = ImageWidth(ImageId)
    ImageHeight = ImageHeight(ImageId)
  Else
    ProcedureReturn 0
  EndIf
  
  Dim ImageData.b(ImageWidth * ImageHeight * 4) 
  
  StartDrawing(ImageOutput(ImageId)) 
  
  ;For y = 0 To ImageHeight-1 
  For y = ImageHeight-1 To 0 Step -1
    
    For x = 0 To ImageWidth-1 
      
      Color = Point(x, y) 
      ImageData(i) = Red(Color) 
      i + 1 
      ImageData(i) = Green(Color) 
      i + 1 
      ImageData(i) = Blue(Color) 
      i + 1
      ImageData(i) = Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)
      i + 1
    
    Next
    
  Next 
  
  StopDrawing() 
  
  FreeImage(ImageId)
  
  glGenTextures_(1, @Texture)
  
  If TextureFilter = 0
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 1 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 2 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    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, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 3
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR) 
    gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  EndIf 
  
  Dim ImageData.b(0)
  
  ProcedureReturn Texture
  
EndProcedure

Procedure.i LoadOpenGlTextureTGA(FileName.s, TextureFilter.i=0)
  Protected header.TargaImageHeader
  Protected hF.i, bytespp.i, n.i, i.i, j.i, Texture.i, oglColortype.i
  Protected b0.a, r.a, g.a, b.a, a.a
  hF = ReadFile(#PB_Any, FileName)
  If Not IsFile(hF)
    ProcedureReturn -1
  EndIf
  ; read the file header
  With header
    \idlength = ReadByte(hF)
    \colourmaptype = ReadByte(hF)
    \datatypecode = ReadByte(hF)
    \colourmaporigin = ReadWord(hF)
    \colourmaplength = ReadWord(hF)
    \colourmapdepth = ReadByte(hF)
    \x_origin = ReadWord(hF)
    \y_origin = ReadWord(hF)
    \width = ReadWord(hF)
    \height = ReadWord(hF)
    \bitsperpixel = ReadByte(hF)
    \imagedescriptor = ReadByte(hF)
  EndWith
  ; create array for the image data
  Dim pixel.TargaImagePixel(header\width * header\height)
  ; only uncmompressed or compressed images
  If header\datatypecode <> 2 And header\datatypecode <> 10
    ProcedureReturn -2
  EndIf
  ; only 24 or 32 bit images
  If header\bitsperpixel <> 24 And header\bitsperpixel <> 32
    ProcedureReturn -3
  EndIf
  ; can only handle normal color maps
  If header\colourmaptype <> 0 And header\colourmaptype <> 1
    ProcedureReturn -4
  EndIf
  ; jump to image data
  FileSeek(hF, header\idlength + (header\colourmaptype * header\colourmaplength) + SizeOf(TargaImageHeader))
  ; bytes per pixel
  bytespp = header\bitsperpixel / 8
  ; read imagedata in array
  While n < header\width * header\height
    If header\datatypecode = 2 ; uncompressed
      If bytespp = 4
        pixel(n)\b = ReadByte(hF)
        pixel(n)\g = ReadByte(hF)
        pixel(n)\r = ReadByte(hF)
        pixel(n)\a = ReadByte(hF)
      ElseIf bytespp = 3
        pixel(n)\b = ReadByte(hF)
        pixel(n)\g = ReadByte(hF)
        pixel(n)\r = ReadByte(hF)
        pixel(n)\a = $FF
      EndIf
      n + 1
    ElseIf header\datatypecode = 10 ; compressed
      b0 = ReadByte(hF)
      j = b0 & $7f
      If b0 & $80 = $80
        b  = ReadByte(hF)
        g  = ReadByte(hF)
        r  = ReadByte(hF)
        If  bytespp = 4
          a = ReadByte(hF)
        EndIf
        For i = 0 To j
          pixel(n)\b = b
          pixel(n)\g = g
          pixel(n)\r = r  
          If bytespp = 4
            pixel(n)\a = a
          ElseIf bytespp = 3
            pixel(n)\a = $FF
          EndIf
          n + 1
        Next
      Else
        For i = 0 To j
          pixel(n)\b = ReadByte(hF)
          pixel(n)\g = ReadByte(hF)
          pixel(n)\r = ReadByte(hF)
          If bytespp = 4            
            pixel(n)\a = ReadByte(hF)
          ElseIf bytespp = 3
            pixel(n)\a = $FF
          EndIf
          n + 1
        Next
      EndIf
    EndIf
  Wend
  CloseFile(hF)
  
  If bytespp = 3
    oglColortype = #GL_RGB
    Dim ImageData.b(ArraySize(pixel())*3)
  ElseIf bytespp = 4
    oglColortype = #GL_RGBA
    Dim ImageData.b(ArraySize(pixel())*4)
  EndIf
  
  j = 0
  For i = 0 To ArraySize(pixel()) - 1
    ImageData(j) = pixel(i)\r
    j + 1
    ImageData(j) = pixel(i)\g
    j + 1
    ImageData(j) = pixel(i)\b
    j + 1
    If bytespp = 4
      ImageData(j) = pixel(i)\a
      j + 1
    EndIf
  Next
  
  Dim pixel.TargaImagePixel(0)
  
  glGenTextures_(1, @Texture)
  
  If TextureFilter = 0
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, oglColortype, header\width, header\height, #Null, oglColortype, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 1 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR) 
    glTexImage2D_(#GL_TEXTURE_2D, #Null, oglColortype, header\Width, header\Height, #Null, oglColortype, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 2 
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    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, header\Width, header\Height, oglColortype, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  ElseIf TextureFilter = 3
    
    glBindTexture_(#GL_TEXTURE_2D, Texture) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR) 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR) 
    gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, header\Width, header\Height, oglColortype, #GL_UNSIGNED_BYTE, @ImageData()) 
    
  EndIf 
  
  Dim ImageData.b(0)
  
  ProcedureReturn Texture
EndProcedure
---
Windows 11 (64 bit)