我想要做的是從單通道數據數組中加載紋理到硬件中,並使用它的alpha通道將文本繪製到對象上。我使用的是opengl 4.Opengl:使用單通道紋理作爲alpha通道來顯示文本
如果我嘗試使用4通道RGBA紋理來做到這一點,它的工作原理非常好,但無論什麼原因,當我嘗試在單個通道中加載時,我只能看到一個亂碼圖像,而我無法找出原因。 我通過梳理紋理位圖數據的一系列用下面的代碼字形到一個單一的紋理創建紋理:
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_RED,因爲GL_ALPHA從Opengl 4中刪除。 真正讓我困惑的是,爲什麼這個工作正常,當我從字形生成4 RGBA紋理,然後使用它的alpha通道?
最後,我通過在調用glTexImage2D之前將數據轉換爲float來完成此工作。我相信我需要使用4字節倍數的數據格式。這就是爲什麼RGBA轉RGBA的原因(即使它是4x字節)以及爲什麼浮動數據也起作用。看來我無法使用GL_UNSIGNED_BYTE,除非它具有4通道數據的輸入和輸出。也許這是ATI驅動程序中的一個錯誤? – 2012-03-24 05:16:14
好吧,我已經明白了這一點。我的代碼沒有錯,也沒有驅動程序中的錯誤。 GL_UNPACK_ALINGMENT需要設置爲1才能工作。它默認設置爲4。運行「glPixelStorei(GL_UNPACK_ALIGNMENT,1);」解決了我所有的問題。由於性能原因,我不確定它爲什麼設置爲4。我會調查。 – 2012-03-24 05:27:36