Я пытаюсь просто нарисовать изображение с функциями немедленного режима OpenGL. Тем не менее, мой вывод довольно странный. Я попробовал несколько параметров текстуры, но получил тот же результат, иногда с другими цветами. Я не могу понять проблему, но я думаю, что это либо загрузка изображения, либо настройка текстуры. Я перейду к делу, вот как я генерирую свою текстуру (в классе Texture2D
):
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Далее следует вызов glTexImage2D
, например: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _width, _height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
, где данные представляют собой массив unsigned char
со значением 255, белого цвета. Затем я загружаю файл PNG с помощью CImg, например:
CImg<unsigned char> image(_filename.c_str());
image.resize(m_Width, m_Height);
glBindTexture(GL_TEXTURE_2D, m_ID);
if(image.spectrum() == 4)
{
unsigned char* data = image.data();
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_Height, GL_RGBA, GL_UNSIGNED_BYTE, data);
}
else if(image.spectrum() == 3)
{
unsigned char* data = image.data();
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_Height, GL_RGB, GL_UNSIGNED_BYTE, data);
}
glBindTexture(GL_TEXTURE_2D, 0);
Но когда я пытаюсь нарисовать текстуру в непосредственном режиме, как это (начало находится в верхнем левом углу, обратите внимание, что красный прямоугольник вокруг текстуры сделан намеренно):
void SimpleRenderer::drawTexture(Texture2D* _texture, float _x, float _y, float _width, float _height)
{
_texture->setActive(0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(_x, _y);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(_x + _width, _y);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(_x + _width, _y + _height);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(_x, _y + _height);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glColor3ub(strokeR, strokeG, strokeB);
glBegin(GL_LINE_LOOP);
glVertex2f((GLfloat)_x, (GLfloat)_y);
glVertex2f((GLfloat)_x+_width, (GLfloat)_y);
glVertex2f((GLfloat)_x+_width, (GLfloat)_y+_height);
glVertex2f((GLfloat)_x, (GLfloat)_y+_height);
glEnd();
}
Я ожидаю такой вывод внутри прямоугольника (отладка того же PNG в той же программе/потоке с помощью CImg):
Но я получаю это:
Может ли кто-нибудь обнаружить проблему с моим кодом?