OpenGL Texture Loader Erweiterung
Verfasst: 26.05.2012 09:24
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:
- 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