OpenGL改变生成的纹理的颜色



我正在从字体文件创建一张字符和符号表,它工作正常,除了在生成的工作表上,所有像素都是黑色的(字母变化)。我希望它们是白色的,这样我就可以应用颜色乘法并具有不同颜色的文本。我意识到我可以简单地反转片段着色器中的颜色,但我想对所有 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。

最新更新