Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL更改生成纹理的颜色_C++_Opengl_Fonts - Fatal编程技术网

C++ OpenGL更改生成纹理的颜色

C++ OpenGL更改生成纹理的颜色,c++,opengl,fonts,C++,Opengl,Fonts,我正在从字体文件中创建一张字符和符号表,它工作正常,除了在生成的表上,所有像素都是黑色的(具有不同的alpha)。我希望它们是白色的,这样我就可以应用颜色乘法,并有不同颜色的文本。我意识到我可以简单地反转片段着色器中的颜色,但我希望对所有GUI元素重复使用相同的着色器 我将遵循本教程: 下面是一个片段: // Create map texture glActiveTexture(GL_TEXTURE0); glGenTextures(1, &map); glBindTexture(GL_

我正在从字体文件中创建一张字符和符号表,它工作正常,除了在生成的表上,所有像素都是黑色的(具有不同的alpha)。我希望它们是白色的,这样我就可以应用颜色乘法,并有不同颜色的文本。我意识到我可以简单地反转片段着色器中的颜色,但我希望对所有GUI元素重复使用相同的着色器

我将遵循本教程:

下面是一个片段:

// 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);
}
//创建贴图纹理
玻璃纹理(GL_纹理0);
glGenTextures(1和地图);
glBindTexture(GL_纹理_2D,贴图);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,贴图宽度,贴图高度,0,GL_RGBA,GL_无符号_字节,0);
glPixelStorei(GLU解包对齐,1);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
//在地图上绘制位图
对于(uint i=开始;i<结束;i++){
charInfo curChar=字符[i];
if(FT_加载_字符(面、i、FT_加载_渲染)){

cout因为您使用

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mapWidth, mapHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
您可以将GL_RGBA更改为GL_红色(或对于3.0之前的OpenGL,更改为GL_亮度),也可以创建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];
   }
unsigned char*glyphRGBA=新的unsigned char[curChar.width*curChar.height*4];
对于(int j=0;j位图.buffer[ofs];
}

在上面的代码中,
YourTextColor
unsigned char[3]
带有文本颜色的RGB组件的数组。
glyphRGBA
数组可以馈送到glTexSubImage2D。

将GL_RGBA更改为GL_红色会将所有字母变成黑色框,GL_亮度也会这样做。glTexSubImage2D中的GL_亮度使文本变为白色,但背景为纯黑色。我也有修改缓冲区的想法,但是我想知道我是否缺少一个简单的设置。GL_红色和亮度是等效的,意味着文本是非半透明的(没有alpha通道,没有透明度),因此,您唯一的方法似乎是分配RGBA缓冲区-这就是我所说的第二个选项。顺便说一下,您还没有展示您使用此纹理的方式(您使用自定义像素着色器进行文本渲染,或者仅使用固定的函数管道并在启用GL_纹理的情况下渲染四边形?)我正在使用一个自定义像素着色器,输出颜色为texture2D(uTex,vTexCoord)*uColor,这就是为什么我需要将字符表设置为白色,否则无论uColor如何,文本都将始终为黑色。我将尝试生成一个新的RGBA缓冲区,谢谢。