如何在opengl中使用.raw文件

时间:2014-12-26 14:09:29

标签: opengl

我正在尝试阅读.raw图片格式,并在OpenGL中对其进行一些修改。我可以读这样的图像:

int width, height;
BYTE * data;
FILE * file;

file = fopen( filename, "rb" );
if ( file == NULL ) return 0;

width = 256;
height = 256;
data = malloc( width * height * 3 );

fread( data, width * height * 3, 1, file );
fclose( file );

但我不知道如何使用glDrawPixels绘制图片。

我的第二个问题是我不知道如何访问每个像素。我的意思是在.raw图像格式中,每个像素应该有3个整数用于存储RGB值(我是否正确?)。如何直接访问这些RGB值?

1 个答案:

答案 0 :(得分:2)

在艰难和快速的意义上,没有.raw这样的东西。该名称表示没有标题但没有指定数据格式的图像数据。 RGB很可能,但RGBA也是如此,想到几乎无穷无尽的其他可能性是微不足道的。

假设RGB排序,每个通道一个字节,则:每个像素宽度为三个字节。所以第n个像素是:

r = data[n*3 + 0]
g = data[n*3 + 1]
b = data[n*3 + 2]

假设数据被设置为使得像素以从左到右的顺序逐行存储,则在第一行上x = 3处的像素在n = 3处,在第二行处于n处=(第一行的宽度)+3,第三行是n =(前两行的组合宽度)+3等。

所以:

r = data[(x + y*width)*3 + 0]
g = data[(x + y*width)*3 + 1]
b = data[(x + y*width)*3 + 2]

要使用glDrawPixels,只需按照the manual告诉您指定的参数即可。它说:

void glDrawPixels(  GLsizei     width,
                    GLsizei     height,
                    GLenum      format,
                    GLenum      type,
                    const GLvoid *      data);

你说宽度和高度是256.你说格式是RGB。向下扫描文档,您会发现相应的GLenumGL_RGB。你说每个通道的大小都是一个字节。那就是GL_UNSIGNED_BYTE。您已将数据加载到data。所以:

glDrawPixels(256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);

进一步的评论:显然首先让这个工作,所以你有一些东西需要建立,但glDrawPixels在实践中几乎未被使用。因此,它甚至不是OpenGL ES的一部分,或者相应地,也不是WebGL的一部分。看一下这个东西的语义。每次打电话都提供缓冲区。 OpenGL无法知道自上次调用以来它是否已被修改。因此,每次调用都会将您的数据从CPU传输到GPU。考虑将您的数据作为纹理提交一次并使用几何图形绘制。这样可以节省每次呼叫转移成本,因此效率更高。