关于OpenGL纹理的问题
我现在在用VC 6.0 + sp6写一OpenGL程序,读取并绘制OBJ模型。为了方便调试,我纹理和模型的读取与绘制是分开调试的。在分开的时候,一切正常(读取和绘制模型:不论模型是简单的球体、立方体,还是整个的游戏场景;读取和绘制纹理:不论纹理是一张,还是70几张(贴在300多个点的球体上)),可一合起来,除了特定几个模型外,程序不是没有响应,就是崩溃,并且把ATI的显卡驱动冲毁(用Debug查看,说ati...xxx.dll崩溃。...代表的内容忘了记下来了。然后所有显示,轻者与滚动相关的部分花屏,重者直至关机(画面没有反应,靠记忆操作^_^b),作任何操作画面均无反应,一直显示程序崩溃时的画面)。
纹理的读取我是这样处理的:
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
ubTextureBuffer = new GLubyte[*w**h**bit]; // 建立图像缓冲
if( LoadBMP24( path, ubTextureBuffer ) == -1 ) return -1;
glGenTextures( 1, &paTextureName[uiTextureSN] );
glBindTexture( GL_TEXTURE_2D, paTextureName[uiTextureSN] );
glTexImage2D( GL_TEXTURE_2D, 0, 3, *w, *h, 0, GL_RGB, GL_UNSIGNED_BYTE, ubTextureBuffer );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
delete [] ubTextureBuffer;
以此往复,直到所有纹理全部读取完成,然后读取OBJ模型。
(因为OBJ文件格式很简单,读取代码在此略过……)
贴纹理相关操作:
glColor3fv( paMat->faAmbientColor );
glMaterialfv( GL_FRONT, GL_AMBIENT, paMat->faAmbientColor );
glMaterialfv( GL_FRONT, GL_DIFFUSE, paMat->faDiffuseColor );
glMaterialfv( GL_FRONT, GL_SPECULAR, paMat->faSpecularColor );
glMaterialf( GL_FRONT, GL_SHININESS, paMat->fShininess );
glMaterialfv( GL_FRONT, GL_EMISSION, paMat->faAmbientColor );
glBindTexture( GL_TEXTURE_2D, 0 ); // 取消和上一次使用的纹理的关联
glBindTexture( GL_TEXTURE_2D, paTextureName[paTexIdx->uiTextureID] );
glBegin( GL_TRIANGLES );
glTexCoord2fv( &paMod->pfTextureArray[ ( paMod->puiFaceArray[j*9+1]-1 )*2 ] );
glNormal3fv( &paMod->pfNormalArray[ ( paMod->puiFaceArray[j*9+2]-1 )*3 ] );
glVertex3fv( &paMod->pfVertexArray[ ( paMod->puiFaceArray[j*9+0]-1 )*3 ] );
glTexCoord2fv( &paMod->pfTextureArray[ ( paMod->puiFaceArray[j*9+4]-1 )*2 ] );
glNormal3fv( &paMod->pfNormalArray[ ( paMod->puiFaceArray[j*9+5]-1 )*3 ] );
glVertex3fv( &paMod->pfVertexArray[ ( paMod->puiFaceArray[j*9+3]-1 )*3 ] );
glTexCoord2fv( &paMod->pfTextureArray[ ( paMod->puiFaceArray[j*9+7]-1 )*2 ] );
glNormal3fv( &paMod->pfNormalArray[ ( paMod->puiFaceArray[j*9+8]-1 )*3 ] );
glVertex3fv( &paMod->pfVertexArray[ ( paMod->puiFaceArray[j*9+6]-1 )*3 ] );
glEnd();
问题:
1.使ati...xxx.dll崩溃的大致可能原因?
2.我用上面的方法,在几个程序没有崩溃的例外模型中,为什么我读取了一批图像,但只需要贴其中一个纹理的时候,我后面读取的纹理同样贴了上去?