OpenGL Immediate Mode текстуры не работают
Я пытаюсь построить простой проект с использованием текстур непосредственного режима. К сожалению, когда я рендеринг, появляется цвет GL, а не текстура. Я искал решения, но не нашел значимой разницы между онлайн-примерами и моим кодом.
Я сократил его до минимального неудачного примера, который я привел здесь. Если мое понимание верно, это должно создать текстурированный квадрат с углами черного, красного, зеленого и синего цветов. К сожалению, он кажется фиолетовым, как будто он полностью игнорирует текстуру. Что я делаю неправильно?
#include <glut.h>
GLuint tex;
void displayFunc() {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_TRIANGLE_STRIP);
glColor3f(0.5, 0, 1);
glTexCoord2f(0.0, 0.0);
glVertex2f(-1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex2f(1.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex2f(-1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex2f(1.0, 1.0);
glEnd();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(640, 480);
glutCreateWindow("Test");
glutDisplayFunc(displayFunc);
GLubyte textureData[] = { 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 255, 0 };
GLsizei width = 2;
GLsizei height = 2;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB8, GL_UNSIGNED_BYTE, (GLvoid*)textureData);
glutMainLoop();
}
Также возможно стоит упомянуть:
Я строю этот проект на Mac (работает El Capitan 10.11.1)
Видеокарта: NVIDIA GeForce GT 650M 1024 МБ
1 ответ
Вы передаете неверный аргумент glTexImage2D()
, GL_RGB8
не является одним из поддерживаемых значений для 7-го (формата) аргумента. Правильное значение GL_RGB
,
Размерные форматы, такие как GL_RGB8
, используются для аргумента internalFormat. В этом случае значение определяет как количество компонентов, так и размер каждого компонента, используемого для внутреннего хранения текстуры.
Параметры формата и типа определяют данные, которые вы передаете. Для них формат определяет только количество компонентов, а тип определяет тип и размер каждого компонента.
Всякий раз, когда у вас есть проблемы с вашим кодом OpenGL, убедитесь, что вы звоните glGetError()
проверить на ошибки. В этом случае вы увидите GL_INVALID_ENUM
ошибка вызвана вашим glTexImage2D()
вызов.