我正在从字体文件中创建一张字符和符号,这样可以正常工作,除了在生成的工作表上所有像素都是黑色(具有不同的alpha)。我希望它们是白色的,所以我可以应用颜色乘法,并有不同的彩色文字。我意识到我可以简单地反转片段着色器中的颜色,但我想为所有GUI元素重用相同的着色器。
我正在关注本教程:http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_02
这是一个片段:
// Create map texture
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &map);
glBindTexture(GL_TEXTURE_2D, map);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mapWidth, mapHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Draw bitmaps onto map
for (uint i = start; i < end; i++) {
charInfo curChar = character[i];
if (FT_Load_Char(face, i, FT_LOAD_RENDER)) {
cout << "Loading character " << (char)i << " failed!" << endl;
continue;
}
glTexSubImage2D(GL_TEXTURE_2D, 0, curChar.mapX, 0, curChar.width, curChar.height, GL_ALPHA, GL_UNSIGNED_BYTE, glyph->bitmap.buffer);
}
每个字形的缓冲区包含像素的alpha值0-255。我的问题是,如何生成白色像素而不是黑色?这有什么设置吗? (我尝试了一些混合模式,但没有成功)
答案 0 :(得分:0)
因为您使用
创建纹理glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mapWidth, mapHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
您可以将GL_RGBA更改为GL_RED(或GL_LUMINANCE用于3.0之前的OpenGL),也可以创建RGBA缓冲区并复制字形数据。
即,你有
glyph->bitmap.buffer
然后你做
unsigned char* glyphRGBA = new unsigned char[ curChar.width * curChar.height * 4];
for(int j = 0 ; j < curChar.height ; j++)
for(int i = 0 ; i < curChar.width ; i++)
{
int ofs = j * curChar.width + i;
for(int k = 0; k < 3 ; k++)
glyphRGBA[ofs + k] = YourTextColor[k];
// set alpha
glyphRGBA[ofs + 3] = glyph->bitmap.buffer[ofs];
}
在上面的代码中YourTextColor
是unsigned char[3]
数组,其中包含文本颜色的RGB组件。 glyphRGBA
数组可以送到glTexSubImage2D。