OpenGL改变生成纹理的颜色

OpenGL changing color of generated texture

我正在从一个字体文件中创建 sheet 个字符和符号,它工作正常,除了生成的 sheet 所有像素都是黑色的(具有不同的 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);
}

每个字形的缓冲区包含 0-255 的像素 alpha 值。我的问题是,如何生成白色像素而不是黑色像素?有这个设置吗? (我尝试了一些混合模式但没有成功)

由于您使用

创建纹理
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。