テクスチャ・プロキシ
テクスチャの情報
テクスチャはオブジェクトとして扱われています
そのため、明示的にリソースを開放するまではその情報がメモリに保存されるでしょう
オブジェクトをプログラム上で再利用したり、やり取りするには
動的にテクスチャの情報を取得する手段が必要となります
テクスチャの情報は 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_COMPONENTS | OpenGL バージョン 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 変数の値は変更されません