【问题标题】:OpenGL + libpng: wrong colors on imageOpenGL + libpng:图像上的颜色错误
【发布时间】:2012-12-01 19:17:59
【问题描述】:

自上周以来,我一直在尝试加载并在屏幕上显示 PNG。我使用库 libpng 将 png 复制到内存中,然后使用 glDrawPixels 在屏幕上显示它。结果如下:

原图:

“游戏”中的截图:

还有代码,我使用静态 Image::loadPNG 将 PNG 加载到地图中,如下所示:

bool Image::loadPNG( std::string _image, FILE * file, unsigned char header[ 54 ] )
{
    fseek( file, 8, SEEK_SET );
    ImageData* imageData = new ImageData( );
    Image* image = new Image( );
    image->type = IMAGETYPE_PNG;
    imageData->image = image;
    png_structp png_ptr = png_create_read_struct( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL );

    if( !png_ptr )
    {
        std::cout << "png_create_read_struct failed. " << std::endl;
        return false;
    }

    png_infop info_ptr = png_create_info_struct(png_ptr);

    if( !info_ptr )
    {
        std::cout << "png_create_info_struct failed. " << std::endl;
        return false;
    }

    if( setjmp( png_jmpbuf( png_ptr ) ) )
    {
        std::cout << "Error during init_io. " << std::endl;
        return false;
    }

    png_init_io( png_ptr, file );
    png_set_sig_bytes( png_ptr, 8 );
    png_read_info( png_ptr, info_ptr );
    png_set_strip_16( png_ptr );
    png_read_update_info(png_ptr, info_ptr);
    int bit_depth;
    int color;
    png_get_IHDR(png_ptr, info_ptr, &image->width, &image->height, &bit_depth, &color, NULL, NULL, NULL);
    png_read_update_info(png_ptr, info_ptr);
    int pitch = png_get_rowbytes(png_ptr, info_ptr);
    image->image = new unsigned char[pitch * image->height];
    png_bytep* row_pointers = new png_bytep[image->height];

    for (int y = 0; y < image->height; y++)
        row_pointers[image->height - 1 - y] = image->image + y * pitch;

    png_read_image(png_ptr, row_pointers);
    delete[] row_pointers;

    // tym na razie dupy sobie nie zawracam

    Image::images.insert( std::pair< std::string, ImageData* >( _image, imageData ) );
    glGenTextures(1, &imageData->texture);
    glBindTexture( GL_TEXTURE_2D, imageData->texture );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, image->image);
    gluBuild2DMipmaps( GL_TEXTURE_2D, 4, image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->image );
    return true;
}

最后在 OpenGL 中显示:

Image* image = Image::images["f.png"]->image;

if( image )
{
    glDisable(GL_DEPTH_TEST);
    glPushMatrix( );
    //glPixelStorei(GL_UNPACK_ALIGNMENT, 4);  

    float nx = 0.0f;
    float ny = 0.0f;

    glLoadIdentity( );
    glTranslatef( 0, 0, -1 );

    if( nx > 0 || ny > 0 )
        glRasterPos2f( nx, ny );

    else
    {
        glRasterPos2f( 0, 0 );
        glBitmap(0,0,0,0, nx, ny, NULL);
    }

    glDrawPixels( image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->image);
    glPopMatrix( );
    glEnable(GL_DEPTH_TEST);
}

如您所见,颜色与应有的颜色不同。谁能帮我弄清楚如何解决我的问题?

【问题讨论】:

  • GL_TEXTURE_MIN_FILTER 设置为GL_NEAREST 时,为什么要生成mipmap?如果您只想使用glDrawPixels(),为什么要生成纹理根本
  • 感谢您在我的应用程序中发现小问题,我已经解决了您所说的第一件事,但相对于您的第二点,您可能会看到我的评论,在谷歌翻译中会说“我不'现在不在乎以下行“。我会要求专注于标题中的一个主要问题。
  • Image::images.insert 也应该在评论上方,没关系。

标签: c++ opengl colors png gldrawpixels


【解决方案1】:

看起来您可能交换了一些颜色通道。在对glTexImage2D() 的调用中,尝试将GL_BGRA_EXT 更改为GL_RGBA,我想。或者,如果这不起作用,请将 GL_UNSIGNED_BYTE 更改为 GL_UNSIGNED_INT_8_8_8_8_REV

【讨论】:

  • 我已经按照你的提示进行了更改,但是没有任何反应。
【解决方案2】:

在我看来,您的图像可能是使用(乘法?)混合绘制的。

您是否启用了 Alpha 混合? (您的图像似乎有一个 alpha 通道)

你设置了什么混合模式?

应该只是:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

【讨论】:

  • 我有这个,它已经在 GLUT 的“init”函数中了。
  • 您是否为 drawpixels 设置了任何比例和偏差值?
  • 怎么做?你能解释一下吗?
  • 您必须设置 GL_RED_SCALE 等。如果您还没有设置它,我真的不认为这是问题所在。 PNG 的位深度是多少?
  • 属性窗口显示它是 64x64 像素,32 位图像,所以我认为它可能是 24 位 + alpha。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2013-01-30
  • 2016-01-11
相关资源
最近更新 更多