1次元テクスチャ
高さ1ピクセルのテクスチャ
これまでは、2 次元画像を描画する 2 次元テクスチャを用いて解説しました
これ以外に、1 次元テクスチャを設定作成することができます
1 次元テクスチャは、単純に高さが 1 ピクセルの画像を持つテクスチャです
まず、glEnable() 関数で GL_TEXTURE_1D を指定します
glBindTexture() など、これまで GL_TEXTURE_2D を指定した関数も使えます
これらを 1 時限テクスチャで使うときは GL_TEXTURE_1D を使いましょう
次に、glTexImage1D() で画像をテクスチャに設定します
この画像を表す配列は、高さ1ピクセルの1次元配列として認識されます
void glTexImage1D(
GLenum target,
GLint level,
GLint components,
GLsizei width,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels
);
target には、通常 GL_TEXTURE_1D を指定します
プロキシを作成する場合は GL_PROXY_TEXTURE_2D を指定できます
level には、0 を基準としたミップマップの詳細レベル番号を指定します
components にはテクスチャ内のカラー要素数を指定します
これも、glTexImage2D() の components 引数と同じ意味です
width には、テクスチャの幅と高さをそれぞれピクセル単位で指定します
やはり、幅は m を正数とした 2m でなければなりません
border にはテクスチャの境界幅を指定します
境界が存在しない場合は 0、存在する場合は 1 を指定します
format にはデータのフォーマットを、type にはデータ型をそれぞれ指定します
そして、pixels に、テクスチャに読み込む画像データを指定します
glTexImage1D() は高さが存在しないことを除いて glTexImage2D() と同じです
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
#define TEXSIZE 64
GLubyte bits[TEXSIZE][4];
GLuint texName;
void disp( void ) {
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_1D , texName);
glBegin(GL_POLYGON);
glTexCoord2f(0 , 0); glVertex2f(-0.9 , -0.9);
glTexCoord2f(0 , 1); glVertex2f(-0.9 , 0.9);
glTexCoord2f(1 , 1); glVertex2f(0.9 , 0.9);
glTexCoord2f(1 , 0); glVertex2f(0.9 , -0.9);
glEnd();
glFlush();
}
int main(int argc , char ** argv) {
unsigned int i;
for (i = 0 ; i < TEXSIZE ; i++) {
bits[i][0] = (i % 4 ? (GLubyte)~((i * 0xFF) / TEXSIZE) : 0);
bits[i][1] = 0;
bits[i][2] = 0;
bits[i][3] = 0;
}
glutInit(&argc , argv);
glutInitWindowSize(400 , 300);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutCreateWindow("Kitty on your lap");
glutDisplayFunc(disp);
glEnable(GL_TEXTURE_1D);
glGenTextures(1 , &texName);
glBindTexture(GL_TEXTURE_1D , texName);
glTexImage1D(
GL_TEXTURE_1D , 0 , GL_RGBA , TEXSIZE ,
0 , GL_RGBA , GL_UNSIGNED_BYTE , bits
);
glutMainLoop();
return 0;
}
このプログラムは、1 次元テクスチャを作成して表示しています
この1次元テクスチャは、幅64ピクセルの赤いグラデーションです
これまで、各種関数で GL_TEXTURE_2D を指定していた引数に
今回は GL_TEXTURE_1D を指定して 1 次元であることをアピールしています
また glTexImage2D ではなく glTexImage1D() で画像をオブジェクトに設定しています
これらの違いを除けば、概念は 2 次元テクスチャと同じです
一度作成したテクスチャ・オブジェクトの画像を更新することも可能です
これには glTexSubImage1D() 関数を使います
void glTexSubImage1D(
GLenum target,
GLint level,
GLint xoffset,
GLsizei width,
GLenum format,
GLenum type,
const GLvoid *pixels
);
target には必ず GL_TEXTURE_1D を指定します
level は 0 を基準としたミップマップの詳細番号を指定します
xoffset にはテクスチャ画像の x 座標をピクセル単位で指定します
ここで指定した座標から、新しい画像が配列に対して上書きされます
この座標は、画像の左を原点とした行の位置です
width には画像の幅をピクセル単位で指定します
format にはピクセル・データのフォーマットを、type にはデータ型をそれぞれ指定します
これらは glDrawPixels() の format と type 引数と同じです
pixels には、新しく設定する画像を表す配列へのポインタを指定します