私はビットマップ ローダーに取り組んできました。主な目標は、データを適切に解析して OpenGL でレンダリングすることだけです。x/y (つまり、ピクセル単位) でピクセルを描画する必要があるところです (少なくとも、レンダリングに関する限り、これは私が行う必要があると考えていることです)。既にテクスチャ オブジェクトをバインドして呼び出していglTexImage2D(...)
ます。
現在、私が問題を抱えているのは、ピクセルごとのアルゴリズムです。
私が理解している限り、ビットマップ (別名 DIB) ファイルは、ピクセル配列と呼ばれるものにカラー データを格納します。ピクセルの各行はバイト数で構成され、各ピクセルは 4 (ピクセルあたり 32 ビット)、3 (ピクセルあたり 24 ビット)、2 (ピクセルあたり 16 ビット)、または 1 (ピクセルあたり 8 ビット) で割り切れるバイト数を保持します。ピクセル)。x
ピクセルをループしながら、同時にピクセル配列内の正しいオフセットを計算する必要があると思います。これは、ピクセルの x/y 座標に相対的です。しかし、これは本当ですか?そうでない場合は、どうすればよいですか?正直なところ、この質問で私に指示されたことを実行したにもかかわらず、このアプローチが正しいかどうかについて少し混乱しています。
ピクセルごとにそれを行うことが正しいアプローチであるglVertex*
とglTexCoord*
思います.そもそも)。
また、私の質問には 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 );
}