OpenGL Nvidia Driver 259.12 текстура не работает - PullRequest
1 голос
/ 09 августа 2010

Мое приложение OpenGL, которое нормально работало на карте ATI, перестало работать, когда я вставил карту NVIDIA Quadro. Текстура просто не работает вообще! Я сократил свою программу до одной функции отображения, которая не работает:

void glutDispCallback()
{
//ALLOCATE TEXTURE
unsigned char * noise = new unsigned char [32 * 32 * 3];
memset(noise, 255, 32*32*3);

glEnable(GL_TEXTURE_2D);
GLuint textureID;
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
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_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, noise);
    delete [] noise;

//DRAW
glDrawBuffer(GL_BACK);
glViewport(0, 0, 1024, 1024);
setOrthographicProjection();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, textureID);
glColor4f(0,0,1,0);
glBegin(GL_QUADS);
    glTexCoord2f(0,0); 
    glVertex2f(-0.4,-0.4);

    glTexCoord2f(0, 1); 
    glVertex2f(-0.4, 0.4);

    glTexCoord2f(1, 1); 
    glVertex2f(0.4, 0.4);

    glTexCoord2f(1,0); 
    glVertex2f(0.4,-0.4);

glEnd();
glutSwapBuffers();

//CLEANUP
GL_ERROR();
glDeleteTextures(1, &textureID);
}

Результатом является синий квад (или любой другой параметр, указанный в glColor4f ()), а не белый квад, который является текстурой. Я следил за часто задаваемыми вопросами на сайте OpenGL. Я отключил смешивание, если текстура была смешана. Я отключил освещение. Я посмотрел через glGetError () - без ошибок. Я также установил glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); и GL_DECAL. Тот же результат. Я также пробовал разные обмотки полигонов - CW и CCW.

Кто-нибудь еще сталкивался с этим?

Ответы [ 3 ]

1 голос
/ 09 августа 2010

Ваш код правильный и делает то, что должен.

memset (noise, 255, 32 * 32 * 3);делает текстуру белой, но вы вызываете glColor4f (0,0,1,0);итоговый цвет будет (1,1,1) * (0,0,1) = (0,0,1) = синий.

Какое поведение вы хотели бы иметь?

1 голос
/ 09 августа 2010

Я нашел ошибку. Где-то еще в моем коде я инициализировал объект GL_TEXTURE_3D и не вызывал glDisable (GL_TEXTURE_3D);

Несмотря на то, что я вызвал glBindTexture (GL_TEXTURE_2D, textureID); он должен был связать 2D-текстуру в качестве текущей и использовать ее - так как этот код всегда работал на картах ATI. Очевидно, драйвер nVidia этого не делал - он использовал эту 3D-текстуру по какой-то причине. Так что добавляя glDisable (GL_TEXTURE_3D); исправил проблему и все работает как положено.

Спасибо всем, кто пытался помочь.

1 голос
/ 09 августа 2010

Можете ли вы попробовать использовать GL_REPLACE в glTexEnvi?Это может быть ошибка в драйвере NV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...