立即模式纹理奇怪的输出

时间:2016-04-08 22:53:43

标签: c++ opengl textures cimg

我试图用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,为白色。然后我加载一个带有CImg的PNG文件,如下所示:

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);

但是当我尝试在立即模式中绘制纹理时(原点是左上角,注意红色矩形arund纹理是有意的):

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();
}

我期望在矩形内输出这样的输出(使用CImg在相同的程序/线程中调试相同的PNG):

Mario expected

但我明白了:

Mario actual

有人能用我的代码发现问题吗?

1 个答案:

答案 0 :(得分:1)

来自How pixel data are stored with CImg

  

值不是交错的,并且分别沿X,Y,Z和V轴排序(对应于宽度,高度,深度,暗淡尺寸),从左上角像素到右下角具有经典扫描线运行的instane图像的像素。因此,dim = 3且深度= 1的彩色图像将被存储在存储器中:R1R2R3R4R5R6 ...... G1G2G3G4G5G6 ....... B1B2B3B4B5B6。 ...(即遵循“平面”结构)而不是R1G1B1R2G2B2R3G3B3 ...(交错通道),

OpenGL不适用于平面数据,它需要交错的像素数据。最简单的解决方案是使用CImg以外的库。

这不能解决缩放问题,但它是一个很好的起点。