gpt4 book ai didi

opengl - 在 OpenGL 中使用 RGB 纹理作为 alpha 值/子像素字体渲染

转载 作者:行者123 更新时间:2023-12-05 03:07:05 24 4
gpt4 key购买 nike

目前我在子像素模式下使用 FreeType,并将每个像素的最大颜色作为 alpha 值,使用以下片段着色器:

    uniform sampler2D Image;
uniform vec4 Color;

smooth in vec2 vVaryingTexCoord;

out vec4 vFragColor;

void main(void){
vec4 color = texture(Image, vVaryingTexCoord);
vFragColor = color * Color;
}

这适用于深色背景,但在较亮的背景上会显示边框像素(例如,当文本像素为 (1,0,0) 时)。为了让它在更亮的背景下工作,我需要传递背景颜色并自己进行混合,一旦我移动到更复杂的背景,它就会开始崩溃。

有没有办法使用 FreeType 的 RGB 值作为纯色的 alpha 值(传递给着色器)?这个公式基本上,其中 b = 背景像素,t = 当前文本像素,c = 静态颜色:

b*((1,1,1) - t) + t*c.rgb*c.a

我认为先绘制其他所有内容并将该帧缓冲区传递给字体着色器会起作用,但这似乎有点矫枉过正。有没有办法在 OpenGL 混合阶段做到这一点?我尝试使用 glBlendFunc 等,但没有取得任何进展。

最佳答案

可以使用 Dual Source Blending , 自 OpenGL 3.3 起可用。 This规范草案甚至提到亚像素渲染作为用例。使其工作所需的一切:

glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC1_COLOR);

(不要忘记启用 GL_BLEND,它一直发生在我身上 :D)

在片段着色器中指定双重输出:(如果需要,您可以按名称绑定(bind),参见规范)

layout(location = 0, index = 0) out vec4 color;
layout(location = 0, index = 1) out vec4 colorMask;

主要内容:

color = StaticColor;
colorMask = StaticColor.a*texel;

其中 StaticColor 是全局文本颜色统一,texel 是字形的当前像素值。

关于opengl - 在 OpenGL 中使用 RGB 纹理作为 alpha 值/子像素字体渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48491340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com