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 には、新しく設定する画像を表す配列へのポインタを指定します



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