Here is some code with a simple .bmp loader I just wrote. It works fine, but there is a color issue. I've been using this texture from the net and several other images, but they're never displayed with the right colors.
I think the error has to do with the imagecreated buffer, but I'm not sure. Please tell me what's wrong ^^
Code: Select all
#include once "GL/gl.bi"
#include once "GL/glu.bi"
Declare Sub Initialize_openGl_2D()
Declare Sub Load_openGL_texture(byref bmp as String, byref handle as ubyte)
Const Scrn_Full = 1
Dim Shared As Integer Scrn_Wid, Scrn_Hgt, Scrn_Bpp, Scrn_X_Mid, Scrn_Y_Mid, wid, hgt
Dim Shared as Single angle, zoom
wid = 256
hgt = 256
angle = 0
zoom = 1
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ScreenInfo Scrn_Wid, Scrn_Hgt, Scrn_Bpp
Scrn_X_Mid = Scrn_Wid\2
Scrn_Y_Mid = Scrn_Hgt\2
Initialize_openGl_2D()
Load_openGL_texture("metal_bronze.bmp", 0)
SetMouse ,,0
Do
'' rotate image with leftarrow / rightarrow
If Multikey (&h4b) Then
Angle -= 2
End If
If Multikey (&h4d) Then
Angle += 2
End If
'' zoom image with uparrow / downarrow
If Multikey (&h50) Then
zoom *= 0.98
End If
If Multikey (&h48) Then
zoom /= 0.98
End If
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
'' draw a textured and rotozoomed square
GLLoadIdentity()
GlTranslatef(Scrn_X_Mid, Scrn_Y_Mid, 0)
GLrotatef(angle, 0, 0, 1)
Glscalef(zoom, zoom, 0)
GlBegin (Gl_Quads)
gltexcoord2f 0, 0
glvertex2f -wid\2, -hgt\2
gltexcoord2f 0, 1
glvertex2f -wid\2, hgt\2
gltexcoord2f 1, 1
glvertex2f wid\2, hgt\2
gltexcoord2f 1, 0
glvertex2f wid\2, -hgt\2
GlEnd()
glFlush
Flip
ScreenSync
Loop Until Multikey(1)
End
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Initialize_openGl_2D()
'' define screen settings
screenres Scrn_Wid, Scrn_Hgt, Scrn_Bpp,, 2 OR Scrn_Full
'' Define matrix
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
'' Define screen axis as FreeBasic style (0,0 in top left corner)
glViewport (0, 0, Scrn_Wid, Scrn_Hgt)
glOrtho(0, Scrn_Wid, Scrn_Hgt, 0, -128, 128)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
'' Deactivate rendering of backside
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
glLoadIdentity()
'' Depth test
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LESS)
'' Alpha test
glEnable(GL_ALPHA_TEST)
glAlphaFunc(GL_GREATER, 0.1)
'' Activate blending, including alpha channel
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
End Sub
Sub Load_openGL_texture(byref bmp as String, byref handle as ubyte)
'' create buffer and load .bmp to it
Dim as uinteger Ptr buffer
buffer = ImageCreate (wid, hgt)
Bload (bmp, buffer)
'' openGL texture settings
glEnable(GL_TEXTURE_2D)
glGenTextures(handle, buffer)
GlBindTexture (GL_TEXTURE_2D, handle)
'' wrap texture
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
'' set scaling quality to highest
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
'glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST)
'' allow lighting and coloring
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
'' generate texture
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wid, hgt, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer)
''' generate mipmaps
'gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, wid, hgt, GL_RGBA, GL_UNSIGNED_BYTE, buffer)
'' destroy buffer
ImageDestroy (buffer)
End Sub