无法使用 Glut 或 OpenGL 显示 PNG

Posted

技术标签:

【中文标题】无法使用 Glut 或 OpenGL 显示 PNG【英文标题】:Can't display a PNG using Glut or OpenGL 【发布时间】:2016-01-21 23:32:34 【问题描述】:

代码在这里:

void readOIIOImage( const char* fname, float* img)

   int xres, yres;
   ImageInput *in = ImageInput::create (fname);
   if (! in) return;
   ImageSpec spec;
   in->open (fname, spec);
   xres = spec.width;
   yres = spec.height;
   iwidth = spec.width;
   iheight = spec.height;

   channels = spec.nchannels;
   cout << "\n";

   pixels = new float[xres*yres*channels];
   in->read_image (TypeDesc::FLOAT, pixels);
   long index = 0;
   for( int j=0;j<yres;j++)
   
      for( int i=0;i<xres;i++ )
      
         for( int c=0;c<channels;c++ )
         
            img[ (i + xres*(yres - j - 1))*channels + c ] = pixels[index++];

         
      
   
   in->close ();
   delete in;

目前,我的代码可以正常生成 JPG 文件。它具有读取文件信息的能力,并能很好地显示它。但是,当我尝试读取 PNG 文件时,它根本无法正确显示。通常,它会在显示屏上的三个单独的列中显示相同的扭曲版本的图像。这很奇怪。知道为什么给定代码会发生这种情况吗?

此外,JPG 文件都有 3 个通道。 PNG有2个。

fname 只是一个文件名,img 是`new float[3*size];

任何帮助都会很棒。谢谢。`

【问题讨论】:

【参考方案1】:

通常,它会在显示屏上的三个单独的列中显示相同的扭曲版本的图像。这很奇怪。知道为什么给定代码会发生这种情况吗?

这读起来很像您从解码器获得的输出是行平面格式。平面意味着,您为每个通道一个接一个地获得单独的行。 PNG 中的通道数与表观通道数之间的失真和差异可能是由于对齐不匹配造成的。现在您没有指定您正在使用哪个图像解码器库,因此我无法查找有关它如何传达像素缓冲区布局的信息。我想你可以从ImageSpec阅读必要的信息。

无论如何,您必须重新排列像素缓冲区重排循环的索引,以便将连续的行平面交错到通道元组中。

当然,您也可以使用现成的 imagefile-to-OpenGL 阅读器库。 DevIL 被大量使用,但维护得不是很好。 SOIL 似乎是近来的热门选择。

【讨论】:

是的,我觉得是这样的。试图遵循逻辑,但没有任何结果。

以上是关于无法使用 Glut 或 OpenGL 显示 PNG的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL、GLUT、Cygwin - 无法打开显示“”

Mac 上的 OpenGL/GLUT 应用程序无法获得焦点 [关闭]

C++ OpenGL/Glut 无法绘制

OpenGL + GLUT没有填充最左边的多边形?

Windows 上没有 GLUT 的 OpenGL 4.5 简单教程 [关闭]

OpenGL/Glut 无法在其上绘制 [