PDA

View Full Version : OpenGL w/Visual Basic - Textures



REY1945
11-06-2003, 09:40 AM
I've converted a simple C++ program to Visual Basic but when I load multiple textures only the last texture is used to map onto an object no matter what texture I try to select with glBindTexture. Everything works fine in the C version but something is slightly amiss in the Visual Basic version. Iíve downloaded several VB examples that are suppose to use multiple textures but as near as I can tell they just display a single texture.

Anyone have any ideas?

nexusone
11-06-2003, 10:51 AM
Could be a lot of things, without looking at your code hard to tell.

REY1945
11-07-2003, 08:28 AM
I was hoping for an answer like, "Oh ya, I had that problem once!, I forgot to do ya-d-da and then it worked."

Following is fragments of the VB program that relate to the processing of the textures. The whole program, even though simple, is too big to post entirely.

----------------------------------------
Global TextureMaps() As Long
'
'lots of public declarations removed for clarity,
'------------------------------------------------------------------------------------------------------------
Public Sub Form_Load()

'initialize stuff
.
.stuff remove, hopefully for clarity
.
.
.

SetupPixelFormat Mainfm.hdc
hGLRC = wglCreateContext(Mainfm.hdc)
wglMakeCurrent Mainfm.hdc, hGLRC

glClearColor 0.6, 0.6, 0.6, 1#
glViewport 0, 0, Mainfm.ScaleWidth, Mainfm.ScaleHeight

glEnable GL_TEXTURE_2D
glEnable GL_DEPTH_TEST
glDepthFunc GL_LEQUAL
glShadeModel GL_SMOOTH 'or GL_FLAT

glCullFace GL_BACK
glEnable GL_CULL_FACE

glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_FLAT
glMatrixMode GL_PROJECTION

gluPerspective FOV, AspectRatio, dNear, dFar
glMatrixMode GL_MODELVIEW
.
.
.
.
End Sub

'------------------------------------------------------------------------------------------------------------
Public Sub Form_Paint()
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT

glPushMatrix
glRotatef Elevation, 1, 0, 0
glRotatef Azimuth, 0, 1, 0
glTranslatef xPos, yPos, zPos
Call DrawWorld
glPopMatrix

SwapBuffers Mainfm.hdc
End Sub

'--------------------------------------------------------------------------------------------------------------
Sub DrawWorld()
Dim i,j as Integer

glEnable GL_TEXTURE_2D
Call glBegin(GL_TRIANGLES)

For j = 1 To nObj
glBindTexture GL_TEXTURE_2D, TextureMaps(j - 1) 'yes I know, I'm mixing zero base and one base
For i = 1 To nFaces(j)
Call glTexCoord2f(TVerts(j, TFaces(j, i, 1), 1), TVerts(j, TFaces(j, i, 1), 2))
Call glVertex3f(Verts(j, Faces(j, i, 1), 1), Verts(j, Faces(j, i, 1), 2), Verts(j, Faces(j, i, 1), 3)) 'vertex 1

Call glTexCoord2f(TVerts(j, TFaces(j, i, 2), 1), TVerts(j, TFaces(j, i, 2), 2))
Call glVertex3f(Verts(j, Faces(j, i, 2), 1), Verts(j, Faces(j, i, 2), 2), Verts(j, Faces(j, i, 2), 3)) 'vertex 2

Call glTexCoord2f(TVerts(j, TFaces(j, i, 3), 1), TVerts(j, TFaces(j, i, 3), 2))
Call glVertex3f(Verts(j, Faces(j, i, 3), 1), Verts(j, Faces(j, i, 3), 2), Verts(j, Faces(j, i, 3), 3)) 'vertex 3
Next i
Next j
Call glEnd

End Sub

'-------------------------------------------------------------------------------------------------------------
'call from menu seletion to open project
Sub OpenProject()
.
.Dim, file open and data read statements removed
.nTextures are counted as data is read
.TextureNames are checked for validity
.
'set up space for textures
ReDim TextureMaps(nTextures)
Call glGenTextures(nTextures, TextureMaps(0))

For i = 0 To nTextures - 1
ProcessTextures i, (App.Path & "\" & Trim(TextureName(i + 1)))
Next i

End Sub

'-----------------------------------------------------------------------------------------------------------
Sub ProcessTextures(num, Filename)
.
.
. code to read bitmap texture images remove for clarity
.
.
Get 1, , FileInfo
Get 1, , ByteInfo
.
.
. more code to check for valid image removed for clarity
.
.
'Determine how big the image is
iPixelSize = ByteInfo.biBitCount / 8
lImageSize = ByteInfo.biWidth * ByteInfo.biHeight * iPixelSize

ReDim BitMapImage(0 To lImageSize) As Byte

'Read in the image data
Get #1, , BitMapImage
Close #1 'no longer need file data

glBindTexture GL_TEXTURE_2D, TextureMaps(num)
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
glTexImage2D GL_TEXTURE_2D, 0, GL_RGB, ByteInfo.biWidth , ByteInfo.biHeight , _
0, GL_RGB, GL_UNSIGNED_BYTE, BitMapImage(0)

Erase BitMapImage

End Sub

REY1945
11-12-2003, 01:15 PM
Finally, the problem has been found.
Undoubtedly itís written up somewhere in the OpenGL documentation to call glBindTexture outside a glBegin and glEnd block. A subtle error not obvious to an untrained eye.