OpenGL環境のテクスチャについて学んでいます。ビデオメモリに渡す前に実際の画像データを取得する従来の方法はないようです。
好奇心から、実際にビットマップや画像ファイルを読み取る代わりに、ピクセルデータの独自のマトリックスを作成して任意の情報を入力することは可能ですか?
ビデオメモリに渡す前に実際の画像データを取得する従来の方法はないようです。
「従来の」とはどういう意味ですか?
好奇心から、実際にビットマップや画像ファイルを読み取る代わりに、ピクセル データの独自のマトリックスを作成し、それに任意の情報を入力することは可能ですか?
glTexImage2D としましょう:
void glTexImage2D( GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels )
最後のパラメータは、メモリへのポインタを取ります。このメモリは、OpenGL に渡す前にユーザーが埋める必要があります。このメモリは、画像ファイルを読み取ってデコードするか、手続き的に画像を生成することによって満たされます。実際のところ、公式の OpenGL プログラミング ガイド (Red Book) のほとんどの例では、画像データを手続き的に生成しています。たとえば、これは第 1 版の第 9 章からのものです (これはあまり良いプログラミング スタイルではなく、従うべきではないことに注意してください)。
#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLuint texName;
void makeCheckImage(void)
{
int i, j, c;
for (i = 0; i < checkImageHeight; i++) {
for (j = 0; j < checkImageWidth; j++) {
c = ((((i&0x8)==0)^((j&0x8))==0))*255;
checkImage[i][j][0] = (GLubyte) c;
checkImage[i][j][1] = (GLubyte) c;
checkImage[i][j][2] = (GLubyte) c;
checkImage[i][j][3] = (GLubyte) 255;
}
}
}
void init(void)
{
/* ... */
makeCheckImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,
checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
checkImage);
}
OpenGL は、ファイルが何であるかを知りません。ファイル画像形式などについてはわかりません。ファイルからテクスチャにロードする機能はありません。
さまざまなピクセル転送関数は、メモリ (またはメモリを含むバッファ オブジェクト) へのポインタを取ります。そのデータをどのように生成するかは、完全にあなた次第です。ファイルからロードしたり、アルゴリズムから作成したり、やりたいことが何でもできます。
少なくとも WebGL にはあります。これは、32 ビット浮動小数点数/ピクセル輝度テクスチャを使用した例です。(編集: 8 bpp ではありません)
http://jsfiddle.net/greggman/upZ7V/
gl.texImage2D( gl.TEXTURE_2D, 0, gl.LUMINANCE, 幅, 高さ, 0, gl.LUMINANCE, gl.FLOAT, ピクセル); ここで、ピクセルは配列です。
これは、opengl 仕様の同じ API とまったく同じように機能するに違いありません。
void TexImage2D ( enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, void *data )