在我们自己的 3d 应用程序中,我正在使用魔鬼库加载多个纹理。当尝试加载一个纹理时,我正在调用ilutRenderer( ILUT_OPENGL );
,它依次执行以下函数调用:
ILboolean ilutGLInit()
{
// Use PROXY_TEXTURE_2D with glTexImage2D() to test more accurately...
glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*)&MaxTexW);
glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*)&MaxTexH);
if (MaxTexW == 0 || MaxTexH == 0)
MaxTexW = MaxTexH = 256; // Trying this because of the VooDoo series of cards...
// Should we really be setting all this ourselves? Seems too much like a glu(t) approach...
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
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_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
#ifdef _MSC_VER
if (IsExtensionSupported("GL_ARB_texture_compression") &&
IsExtensionSupported("GL_EXT_texture_compression_s3tc")) {
ilGLCompressed2D = (ILGLCOMPRESSEDTEXIMAGE2DARBPROC)
wglGetProcAddress("glCompressedTexImage2DARB");
}
#endif
if (IsExtensionSupported("GL_ARB_texture_cube_map"))
HasCubemapHardware = IL_TRUE;
return IL_TRUE;
}
ilutRenderer( ILUT_OPENGL );
只需要调用一次(对于每个新创建的窗口),但是在试验时我已经多次调用了相同的函数。(每个加载的纹理调用一次)
如果多次调用相同的函数 - 加载的 openGl 纹理看起来质量比调用一次时更差。(我有多个纹理,但大多数质量较差,不确定第一张图片)。
我对此感到困惑-因为从我的角度来看,该电话没有做任何特别的事情-为什么它不能容忍多个类似的电话?
好吧,我已经开始过滤出哪些函数可以被多次调用,哪些不能——并得出结论认为是glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
它触发了奇怪的行为。所以包装函数是这样的:
if( !bInitDone )
{
bInitDone = TRUE;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}
之后ilutRenderer( ILUT_OPENGL )
可以根据需要多次调用。
我也尝试过像这样集中opengl初始化:
...
InitGL( OnWindowReady )
...
void OnWindowReady( void )
{
ilInit();
ilutRenderer( ILUT_OPENGL );
}
... may be some rendering code ...
void LoadModel( const wchar_t* file )
{
... load texture 1 ...
... load texture 2 ...
}
但是纹理仍然显示为“损坏”。也许窗口应该在开始加载纹理之前至少渲染一次,但我想知道 OpenGL 中的哪些函数反映了纹理损坏/看起来不错的状态。
我有“NVidia Quadro K2100M”,驱动程序版本 375.86。
这是显示驱动程序错误吗?您通常如何向 NVidia 报告错误?