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() вызов.

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