我一直在研究位图加载器,主要目标只是正确解析数据并在 OpenGL 中渲染。我现在需要在 x/y(即逐个像素)的基础上绘制像素(至少,就渲染而言,我认为这是我需要做的)。我已经绑定了纹理对象并调用了glTexImage2D(...)
.
目前,我遇到的问题是逐像素算法。
据我了解,位图(又名 DIB)文件将颜色数据存储在所谓的像素数组中。每行像素由字节数组成x
,每个像素的字节数可被 4(每像素 32 位)、3(每像素 24 位)、2(每像素 16 位)或 1(每像素 8 位)整除像素)。
我认为需要遍历像素,同时计算像素数组中的正确偏移量,该偏移量相对于其像素 x/y 坐标。这是真的吗?如果没有,我该怎么办?老实说,我有点困惑,尽管我在前一段时间问过的这个问题中做了针对我的事情,但这种方法是否正确。
我认为逐个像素地处理它是正确的方法,主要是因为渲染一个四边形glVertex*
并glTexCoord*
只产生一个灰色的矩形(当时我认为 OpenGL 会自己处理这个问题,因此为什么要尝试首先)。
我还应该注意,虽然我的问题显示的是 OpenGL 3.1 着色器,但我转移到了 SDL 1.2,因此我可以暂时使用即时模式,直到我实现了正确的算法,然后切换回现代 GL。
我正在解析的测试图像:
它的数据输出(由于长度很长而被粘贴): http: //pastebin.com/6RVhAVRq
和代码:
void R_RenderTexture_PixByPix( texture_bmp_t* const data, const vec3 center )
{
glBindTexture( GL_TEXTURE_2D, data->texbuf_id );
glBegin( GL_POINTS );
{
const unsigned width = data->img_data->width + ( unsigned int ) center[ VEC_X ];
const unsigned height = data->img_data->height + ( unsigned int ) center[ VEC_Y ];
const unsigned bytecount = GetByteCount( data->img_data->bpp );
const unsigned char* pixels = data->img_data->pixels;
unsigned color_offset = 0;
unsigned x_pixel;
for ( x_pixel = center[ VEC_X ]; x_pixel < width; ++x_pixel )
{
unsigned y_pixel;
for ( y_pixel = center[ VEC_Y ]; y_pixel < height; ++y_pixel )
{
}
const bool do_color_update = true; //<--- replace true with a condition which checks to see if the color needs to be updated.
if ( do_color_update )
{
glColor3fv( pixels + color_offset );
}
color_offset += bytecount;
}
}
glEnd();
glBindTexture( GL_TEXTURE_2D, 0 );
}