テクスチャ・プロキシ


テクスチャの情報

テクスチャはオブジェクトとして扱われています
そのため、明示的にリソースを開放するまではその情報がメモリに保存されるでしょう

オブジェクトをプログラム上で再利用したり、やり取りするには
動的にテクスチャの情報を取得する手段が必要となります
テクスチャの情報は glGetTexLevelParameter() を用います
void glGetTexLevelParameterfv(
	GLenum target, GLint level,
	GLenum pname, GLfloat * params   
);
void glGetTexLevelParameteriv(
	GLenum target, GLint level,
	GLenum pname, GLint * params
);
target には GL_TEXTURE_1D または GL_TEXTURE_2D を指定します
OpenGL 1.1 以降であれば、GL_PROXY_TEXTURE_1D と
GL_PROXY_TEXTURE_2D を指定することも可能です

level は 0 を基準とした詳細レベル番号を指定します
これは glTexImage2D() の level パラメータと同じ意味です
詳細レベルについては、まだ説明していないのでこの場では 0 を指定してください

pname は、テクスチャの取得したい情報を定数で指定します
この引数には、次の定数のいずれかを指定します

定数解説
GL_TEXTURE_WIDTH境界線を含むテクスチャ画像の幅を返します。
GL_TEXTURE_HEIGHT境界線を含むテクスチャ画像の高さを返します。
GL_TEXTURE_INTERNAL_FORMATテクスチャ画像のフォーマットを返します。
GL_TEXTURE_COMPONENTSOpenGL バージョン 1.0 で使われていました。
GL_TEXTURE_BORDERテクスチャ画像の境界線の幅を返します。

params には、値を取得する変数へのポインタを指定します
この関数は params に要求した値を代入します

これを利用すれば、テクスチャ・オブジェクトから幅や高さを得られます
しかし、この関数の利用方法は、単純にテクスチャの情報を取得するだけではありません
テクスチャ・プロキシを利用することで、リソースを確保できるかを調べられるのです

テクスチャは、その性質上、多くのメモリサイズを占有する可能性があります
そこで、画像をロードせずに情報だけを与えて擬似的にオブジェクトを作り
このオブジェクトから情報を得ることで、リソースを確保できるか調べられるのです

テクスチャ・プロキシを作るには、glTexImage2D() 関数の最初の引数に
GL_PROXY_TEXTURE_2D を指定し、最後に引数を NULL にします
最初の引数 target が GL_PROXY_TEXTURE_2D である場合
最後の引数 pixels は NULL を指定しなければなりません

これで、テクスチャ・プロキシが作成されました
あとは glGetTexLevelParameter() から何らかの値を得ます
この結果が glTexImage2D() で指定した値と等しければ成功です
リソースがたりないためにオブジェクトを作れない場合、params に指定した値は変更されません
#include <windows.h>
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>

#define TEXSIZE 64

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

int main(int argc , char ** argv) {
	GLuint texName;
	GLint iFormat = 0;

	glutInit(&argc , argv);
	glutInitWindowSize(400 , 300);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
	
	glutCreateWindow("Kitty on your lap");

	glEnable(GL_TEXTURE_2D);
	glGenTextures(1 , &texName);
	glBindTexture(GL_TEXTURE_2D , texName);

	glTexImage2D(
		GL_PROXY_TEXTURE_2D , 0 , 3 , TEXSIZE , TEXSIZE ,
		0 , GL_RGB , GL_UNSIGNED_BYTE , NULL
	);
	glGetTexLevelParameteriv(
		GL_PROXY_TEXTURE_2D , 0 ,
		GL_TEXTURE_INTERNAL_FORMAT , &iFormat
	);
	if (iFormat && GL_RGB) printf("テクスチャは作成できます\n");
	else printf("リソース不足でテクスチャを作成できません\n");

	glDeleteTextures(1 , &texName);
	return 0;
}
このプログラムは、64×64 のテクスチャが作成可能かどうかを調べています
これは OpenGL で保障されているサイズなので、作成可能だと思われます
TEXSIZE マクロの値を変更し、巨大なサイズのテクスチャ・プロキシを作成してみてください
リソースがたりないと判断された場合、iFormat 変数の値は変更されません



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