One more:
Strict
GLGraphics 640,480
Local pixmap:TPixmap=LoadPixmap( "flare1.png" ),flags=MASKEDIMAGE | FILTEREDIMAGE
GLGraphicsDriver().SwapSharedContext
Local tex=CreateTex( pixmap.width,pixmap.height,flags )
UploadTex pixmap,flags
GLGraphicsDriver().SwapSharedContext
glEnable GL_TEXTURE_2D
glBindTexture GL_TEXTURE_2D,tex
glEnable GL_BLEND
glBlendFunc GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA
While Not KeyHit( KEY_ESCAPE )
glClear GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
glBegin GL_QUADS
glTexCoord2f 0,0
glVertex2f -1,-1
glTexCoord2f 1,0
glVertex2f 1,-1
glTexCoord2f 1,1
glVertex2f 1,1
glTexCoord2f 0,1
glVertex2f -1,1
glEnd
Flip
Wend
End
Function CreateTex( width,height,flags )
Local name
glGenTextures 1,Varptr name
glBindTexture GL_TEXTURE_2D,name
'set texture parameters
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE
If flags & FILTEREDIMAGE
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR
If flags & MIPMAPPEDIMAGE
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR
Else
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR
EndIf
Else
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST
If flags & MIPMAPPEDIMAGE
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST
Else
glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST
EndIf
EndIf
Local mip_level
Repeat
glTexImage2D GL_TEXTURE_2D,mip_level,GL_RGBA8,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,Null
If Not (flags & MIPMAPPEDIMAGE) Exit
If width=1 And height=1 Exit
If width>1 width:/2
If height>1 height:/2
mip_level:+1
Forever
Return name
End Function
Function UploadTex( pixmap:TPixmap,flags )
Local mip_level
Repeat
glPixelStorei GL_UNPACK_ROW_LENGTH,pixmap.pitch/BytesPerPixel[pixmap.format]
glTexSubImage2D GL_TEXTURE_2D,mip_level,0,0,pixmap.width,pixmap.height,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels
If Not (flags & MIPMAPPEDIMAGE) Exit
If pixmap.width>1 And pixmap.height>1
pixmap=ResizePixmap( pixmap,pixmap.width/2,pixmap.height/2 )
Else If pixmap.width>1
pixmap=ResizePixmap( pixmap,pixmap.width/2,pixmap.height )
Else If pixmap.height>1
pixmap=ResizePixmap( pixmap,pixmap.width,pixmap.height/2 )
Else
Exit
EndIf
mip_level:+1
Forever
glPixelStorei GL_UNPACK_ROW_LENGTH,0
End Function
(Make sure to test on GMA!)