Что я делаю неправильно, что не могу правильно отобразить изображение / текстуру в OpenGL? - PullRequest
2 голосов
/ 02 октября 2010

Я пытаюсь сделать изображение в окне.Супер просто (или я так думал).Независимо от того, что я делаю, я всегда получаю этот фиолетовый квадрат.Некоторые кусочки моего кода:

// load image from file, called one time on load:
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

RgbImage theTexMap( filename );

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

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); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, theTexMap.GetNumCols(), theTexMap.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, theTexMap.ImageData() );

// render quad and texture, called inside glutDisplayFunc callback
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-50.0, -50.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-50.0, 50.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(50.0, 50.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(50.0, -50.0, 0.0);
glEnd();

glFlush();
glDisable(GL_TEXTURE_2D);

Я вырезал много кода, потому что я пытаюсь расширить пример из сторонней библиотеки (ARToolkit).Там гораздо больше кода, чем нужно отображать здесь.

Есть какие-то идеи для ошибки, которую я мог бы сделать, которая бы отображала квад, но не отображала текстуру / изображение?

Ответы [ 5 ]

2 голосов
/ 02 октября 2010

Перепишите свой объект текстуры в обратном вызове glutDisplayFunc(), Just In Case ™.

Кроме того, я немного опасаюсь GL_RGBA8.Попробуйте GL_RGBA.Вероятно, суеверие с моей стороны, хотя.

0 голосов
/ 02 октября 2010

Вы пытались использовать GL_REPLACE вместо GL_MODULATE?

Я не вижу, чтобы вы передавали какие-либо цвета вершинам, а GL_MODULATE будет модулировать любым текущим цветом.

0 голосов
/ 02 октября 2010

Ваша текстура задает только уровень MIP 0, а не другие уровни MIP, поэтому результат может быть неопределенным, если он не отображается на уровне MIP 0. Быстрое исправление:

glTexParameteri (GL_TEXTURE_2D,GL_GENERATE_MIPMAP, GL_TRUE);

Это простая ошибка.Хорошая ссылка:

http://www.opengl.org/wiki/Common_Mistakes

0 голосов
/ 02 октября 2010

Несколько идей:

Разве вы не должны вызывать glEnable (GL_TEXTURE_2D) перед настройкой и загрузкой текстуры?

Вы удостоверились, что размеры текстуры имеют степень 2?

Если вы хотите использовать функции увеличения / уменьшения GL_LINEAR, вы, вероятно, захотите сгенерировать мипмапы из исходной текстуры.

0 голосов
/ 02 октября 2010

Не знаю, не пытаясь сам, но кажется немного странным, что вы используете GL_RGBA8 для внутреннего формата и GL_RGB для формата пикселей.

Лично, если я не использую это на своей текстуре, я также сделаю GL_DISABLE(GL_LIGHTING) для текстурированных объектов, не знаю, поможет ли это, но я знаю, что столкнулся с некоторыми вещами, которые я не совсем понял, как Что касается комбинаций света и текстуры.

...