OpenGL, загрузка текстур - дополнительный шум на текстурах

В нашем собственном 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?

0 ответов

Другие вопросы по тегам