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?