Невозможно привязать текстуру к GL_QUADS - PullRequest
2 голосов
/ 24 января 2020

Я пытаюсь сделать анимацию в OpenGL, мои вершины и анимации работают, но я хотел бы добавить к нему фоновое изображение с файлом, например, bmp или чем-то еще.

Итак, после нескольких чтений я пробую технику квадов, которая просто показывает квад и привязывает к нему текстуру.

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

И я реализовал печать, чтобы видеть, ловит ли он правильный файл, и он делает!

Мой код выглядит следующим образом, и мой результат - белый квадрат, который отображается в правильных координатах, но текстура не отображается, файл загружен правильно (с напечатанными правильными размерами), он просто не связывается или появляются на площади ...

glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);

int width, height, nrChannels;
unsigned char* data = stbi_load("test.jpg", &width, &height, &nrChannels, 0);
if (data == NULL) {
    printf("Error in loading the image\n");
    exit(1);
}
printf("Loaded image with a width of %dpx, a height of %dpx and %d channels\n", width, height, nrChannels);
unsigned int texture;

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glVertex2f(2.0, 1.0);
glTexCoord2f(2.0, 1.0);
glVertex2f(8.0, 1.0);
glTexCoord2f(8.0, 1.0);
glVertex2f(8.0, 7.0);
glTexCoord2f(8.0, 7.0);
glVertex2f(2.0, 7.0);
glTexCoord2f(2.0, 7.0);
glEnd();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}

glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

Есть идеи?

1 Ответ

0 голосов
/ 24 января 2020

glTexImage2D укажите двумерное изображение текстуры для объекта текстуры. Вы должны сделать так, чтобы четырехугольник был нарисован.
Кроме того, необходимо включить двухмерное текстурирование с помощью glEnable(GL_TEXTURE_2D). Координаты текстуры должны находиться в диапазоне [0.0, 1.0] (см. Как работают координаты текстуры opengl? ).
glTexCoord2f необходимо установить до glVertex2f, поскольку текущие координаты цвета, нормали и текстуры связаны с вершиной при вызове glVertex.
Поскольку вы не генерируете мип-карты (glGenerateMipmap), Функция минимизации текстуры (GL_TEXTURE_MIN_FILTER) должна быть установлена ​​на GL_LINEAR или GL_NEAREST. В противном случае текстура будет неполной.

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
glBindTexture(GL_TEXTURE_2D, 0);
glClear(GL_COLOR_BUFFER_BIT);

glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_TEXTURE_2D);

glColor4f(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 1.0);
glVertex2f(2.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex2f(8.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex2f(8.0, 7.0);
glTexCoord2f(0.0, 0.0);
glVertex2f(2.0, 7.0);
glEnd();

glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

glColor3f(1.0, 1.0, 1.0);
...