我正在尝试阅读.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值?
答案 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。向下扫描文档,您会发现相应的GLenum
为GL_RGB
。你说每个通道的大小都是一个字节。那就是GL_UNSIGNED_BYTE
。您已将数据加载到data
。所以:
glDrawPixels(256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);
进一步的评论:显然首先让这个工作,所以你有一些东西需要建立,但glDrawPixels
在实践中几乎未被使用。因此,它甚至不是OpenGL ES的一部分,或者相应地,也不是WebGL的一部分。看一下这个东西的语义。每次打电话都提供缓冲区。 OpenGL无法知道自上次调用以来它是否已被修改。因此,每次调用都会将您的数据从CPU传输到GPU。考虑将您的数据作为纹理提交一次并使用几何图形绘制。这样可以节省每次呼叫转移成本,因此效率更高。