OpenGL改变生成纹理的颜色

时间:2015-04-27 15:19:46

标签: c++ opengl fonts

我正在从字体文件中创建一张字符和符号,这样可以正常工作,除了在生成的工作表上所有像素都是黑色(具有不同的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。我的问题是,如何生成白色像素而不是黑色?这有什么设置吗? (我尝试了一些混合模式,但没有成功)

1 个答案:

答案 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];
   }

在上面的代码中YourTextColorunsigned char[3]数组,其中包含文本颜色的RGB组件。 glyphRGBA数组可以送到glTexSubImage2D。

相关问题