私がやろうとしているのは、テクスチャを単一チャネル データ配列からハードウェアにロードし、そのアルファ チャネルを使用してオブジェクトにテキストを描画することです。私はopengl 4を使用しています。
4 チャンネルの RGBA テクスチャを使用してこれを実行しようとすると、問題なく動作しますが、何らかの理由で 1 つのチャンネルだけを読み込もうとすると、画像が文字化けしてしまい、その理由がわかりません。次のコードを使用して、一連のグリフのテクスチャ ビットマップ データを 1 つのテクスチャに結合することにより、テクスチャを作成します。
int texture_height = max_height * new_font->num_glyphs;
int texture_width = max_width;
new_texture->datasize = texture_width * texture_height;
unsigned char* full_texture = new unsigned char[new_texture->datasize];
// prefill texture as transparent
for (unsigned int j = 0; j < new_texture->datasize; j++)
full_texture[j] = 0;
for (unsigned int i = 0; i < glyph_textures.size(); i++) {
// set height offset for glyph
new_font->glyphs[i].height_offset = max_height * i;
for (unsigned int j = 0; j < new_font->glyphs[i].height; j++) {
int full_disp = (new_font->glyphs[i].height_offset + j) * texture_width;
int bit_disp = j * new_font->glyphs[i].width;
for (unsigned int k = 0; k < new_font->glyphs[i].width; k++) {
full_texture[(full_disp + k)] =
glyph_textures[i][bit_disp + k];
}
}
}
次に、テクスチャ データの呼び出しをロードします。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->x, texture->y, 0, GL_RED, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(full_texture));
私のフラグメント シェーダーは次のコードを実行します。
#version 330
uniform sampler2D texture;
in vec2 texcoord;
in vec4 pass_colour;
out vec4 out_colour;
void main()
{
float temp = texture2D(texture, texcoord).r;
out_colour = vec4(pass_colour[0], pass_colour[1], pass_colour[2], temp);
}
テクスチャから生成されたとわかる画像が得られますが、ひどく歪んでいて、その理由がわかりません。ところで、GL_ALPHA が Opengl 4 から削除されたため、GL_RED を使用しています。本当に混乱しているのは、グリフから 4 RGBA テクスチャを生成し、そのアルファ チャネルを使用すると、これが正常に機能する理由です??