イメージ
ピクセル情報を扱う
ピクセルを描画するかしないかという情報はビットマップを使って表現できます
しかし、そのピクセルの色までは表現することができませんでした
そのため、ビットマップはフォントなどの情報を表現するのに適しています
では、写真などのイメージを描画するにはどうするのでしょうか
もちろん、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_BITMAP | glBitmap() と同じビットごとの符号なし 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() 関数を用いることで描画しているのです
これで、画像を読み込んで描画するといった処理が実現できるようになります