イメージ


ピクセル情報を扱う

ピクセルを描画するかしないかという情報はビットマップを使って表現できます
しかし、そのピクセルの色までは表現することができませんでした
そのため、ビットマップはフォントなどの情報を表現するのに適しています

では、写真などのイメージを描画するにはどうするのでしょうか
もちろん、OpenGL にはピクセルの色情報を描画する機能が存在します
色情報をどのように、どのデータ型で扱うかは開発者の自由となっています
多くの場合、各ピクセルの色は RGB 形式で表現されるでしょう

適切な方法でメモリにピクセル情報を含んだ配列を用意します
RGB 形式ならば赤、緑、青の順番で、それぞれ 1 バイトで色要素を表します
この配列が作成できれば、後は glDrawPixels() でバッファに転送します
void glDrawPixels(
	GLsizei width , GLsizei height ,
	GLenum format , GLenum type , const GLvoid *pixels   
);
width には画像の幅、height には高さをピクセル単位で指定します
format にはどのようにピクセルの色情報を表すかを示すフォーマットを定数で指定します
この引数に指定できる定数は次のいずれかです

定数解説
GL_COLOR_INDEX単一の値で構成されるカラー指標
GL_STENCIL_INDEX単一の値で構成されるステンシル指標
GL_DEPTH_COMPONENT単一の値で構成されるデプス
GL_RGBA赤、緑、青、アルファの順で構成されるカラー
GL_RED単一の値で構成される赤要素
GL_GREEN単一の値で構成される緑要素
GL_BLUE単一の値で構成される青要素
GL_ALPHA単一の値で構成されるアルファ要素
GL_RGB赤、緑、青の順で構成されるカラー
GL_LUMINANCE単一の値で構成される輝度
GL_LUMINANCE_ALPHA輝度、アルファの順で構成されるカラー
GL_BGR_EXT青、緑、赤の順で構成されるカラー
GL_BGRA_EXT青、緑、赤、アルファの順で構成されるカラー

通常、GL_BGR_EXT と GL_BGRA_EXT は Windows だけで利用されます
これは、Windows で用いられる DIB の色表現から採用されています

type には色の要素を表しているデータ型を指定します
多くの場合は符号なしバイトだと思われますが、32 ビットごとに保存することもできます
この引数には、次のいずれかを指定することができます

定数解説
GL_UNSIGNED_BYTE符号なし 8 ビット整数
GL_BYTE符号付き 8 ビット整数
GL_BITMAPglBitmap() と同じビットごとの符号なし 8 ビット整数
GL_UNSIGNED_SHORT符号なし 16 ビット整数
GL_SHORT符号付き 16 ビット整数
GL_UNSIGNED_INT符号なし 32 ビット整数
GL_INT符号付き 32 ビット整数
GL_FLOAT単精度浮動小数点

ピクセル情報を格納する配列にあわせて、適切なものを指定してください
最後の pixels には、ピクセル情報を格納する配列へのポインタを指定します
こうすることによって、現在のラスタ位置に画像が描画されます
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

GLubyte * bits;
GLuint width , height;

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);
	glRasterPos2i(-1 , -1);
	glDrawPixels(width , height , GL_RGB , GL_UNSIGNED_BYTE , bits);
	glFlush();
}

int main(int argc , char ** argv) {
	unsigned int i , j , index = 0;
	width = 300;
	height = 175;
	bits = malloc(3 * (width * height));

	for(i = 0 ; i < height ; i++) {
		int r = (i * 0xFF) / height;
		for(j = 0 ; j < width ; j++) {
			bits[index++] = r;
			bits[index++] = (( j * 0xFF ) / width);
			bits[index++] = ~r;
		}
	}

	glutInit(&argc , argv);
	glutInitWindowSize(width , height);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);

	glutCreateWindow("Kitty on your lap");
	glutDisplayFunc(disp);

	glutMainLoop();
	free(bits);

	return 0;
}


このプログラムでは、確保したヒープへのポインタ bits に対して
上記の結果のようなグラデーション画像をループ処理で生成しています
これを glDrawPixels() 関数を用いることで描画しているのです

これで、画像を読み込んで描画するといった処理が実現できるようになります



前のページへ戻る次のページへ