あなたが何を望んでいるかを正しく理解しているかどうかはまだ完全にはわかりませんが、試してみます. 私が念頭に置いていたのは、 を呼び出すときにglTexImage2D
、ロードするテクセルのフォーマットを指定し、それらのテクセルから作成するテクスチャの「内部フォーマット」を指定するということです。典型的なケースでは、両方に (ほぼ) 同じ形式を指定します。たとえば、通常はGL_RGBA
両方に使用します。
ただし、両方を指定する理由があります。format
(リストの末尾に近いパラメーター) は、ロード元のテクセルの形式を指定しますが、internal format
(パラメーター リストの先頭に近いパラメーター) は形式を指定します。これらのテクセルから作成する実際のテクスチャについて。
いくつかのテクセルをロードしたいが、実際にはそれらのアルファ チャネルのみを使用GL_ALPHA
する場合は、に対して指定できますinternal format
。それだけで取得できます。そのテクスチャをサーフェスにマップすると、アルファのみに影響します。色ではありません。これにより、テクセルの余分なコピーの作成が回避されるだけでなく、(少なくとも通常は) テクスチャ自体によって消費されるメモリも削減されます。これは、3 つのカラー チャネルではなくアルファ チャネルのみが含まれるためです。
編集: わかりました、もう少し考えてみると、1 つのテクスチャだけを使用して、(私が思うに) やりたいことを行う方法があります。まず、ブレンド関数をアルファチャンネルのみを使用するように設定し、テクスチャの色をコピーする場合は で呼び出しますglTextureEnvf
がGL_REPLACE
、アルファチャンネルのみを使用する場合は で呼び出しますGL_BLEND
。たとえば、緑のテクスチャを作成して、青のクワッドの上に (2 回) 描画してみましょう。1 回は GL_REPLACE で、もう 1 回は GL_BLEND で描画します。簡単にするために、アルファが上 (0) から下 (1) に直線的に増加するソリッド gree テクスチャを使用します。
static GLubyte Image[128][128][4];
for (int i=0; i<128; i++)
for (int j=0; j<128; j++) {
Image[i][j][0] = 0;
Image[i][j][1] = 255;
Image[i][j][2] = 0;
Image[i][j][3] = i;
}
テクスチャの作成とバインド、パラメータの設定などのほとんどをスキップし、テクスチャを使用していくつかの四角形を直接描画します。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glColor4f(0.0, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glBegin(GL_QUADS);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, -1.0f, 0.0f);
glColor4f(0.0, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glEnd();
これにより、次が生成されます。
したがって、GL_REPLACE で描画された左側ではテクスチャの緑が得られますが、GL_BLEND で描画された右側では (そして glBlendFunc はアルファ チャネルのみを使用するように設定されています)、青色のクワッドが得られますが、テクスチャから取得したアルファですが、両方にまったく同じテクスチャを使用しています。
編集 2: 本当に真っ白なテクスチャが必要だと判断した場合は、1 ピクセルのテクスチャを作成し、GL_TEXTURE_WRAP_S と GL_TEXTURE_WRAP_T を GL_REPEAT に設定します。これはまだ余分なテクスチャを使用していますが、余分なテクスチャは1 ピクセルしかないため、非常に小さくなります。それをロードする時間と消費されるメモリはどちらも非常にわずかです。ピクセルのデータは基本的に「ノイズ」です。私はテストを試みていませんが、代わりに 8x8 または 16x16 のピクセル ブロックのようなものを使用したほうがよいかもしれません。これはまだ非常に小さいため、ほとんど問題にはなりませんが、これらはそれぞれ JPEG と MPEG で使用されるサイズであり、カードと (特に) ドライバーがそれらに最適化されている場所がわかります。それは役立つかもしれませんが、害はありません (とにかく気にするのに十分です)。