我正在从字体文件创建一张字符和符号表,它工作正常,除了在生成的工作表上,所有像素都是黑色的(字母变化)。我希望它们是白色的,这样我就可以应用颜色乘法并具有不同颜色的文本。我意识到我可以简单地反转片段着色器中的颜色,但我想对所有 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。我的问题是,如何生成白色像素而不是黑色像素?有这个设置吗?(我尝试了一些混合模式,但没有成功)
由于您使用
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。