0

在我们自己的 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 报告错误?

4

0 回答 0