Opengl 从顶点/片段着色器中修改glBlendColor

Opengl 从顶点/片段着色器中修改glBlendColor,opengl,fragment-shader,blending,freetype,color-blending,Opengl,Fragment Shader,Blending,Freetype,Color Blending,使用子像素渲染LCD时,我正在使用混合函数对从freetype库获得的字形进行着色,字形位图格式为RGB而非alpha: 我将RGB格式的纹理上载到GPU,并使用以下混合: glBlendFunc( GL_CONSTANT_COLOR_EXT, GL_ONE_MINUS_SRC_COLOR ); glBlendColor( r, g, b, 1 ); r、 g,b是所需的字形颜色。只要轮廓都是相同的颜色,这就非常有效。我使用的是一个顶点缓冲区。我现在希望每个glyph有不同的颜色,然后,我需

使用子像素渲染LCD时,我正在使用混合函数对从freetype库获得的字形进行着色,字形位图格式为RGB而非alpha:

我将RGB格式的纹理上载到GPU,并使用以下混合:

glBlendFunc( GL_CONSTANT_COLOR_EXT,  GL_ONE_MINUS_SRC_COLOR );
glBlendColor( r, g, b, 1 );
r、 g,b是所需的字形颜色。只要轮廓都是相同的颜色,这就非常有效。我使用的是一个顶点缓冲区。我现在希望每个glyph有不同的颜色,然后,我需要在着色器中指定不同的混合颜色,但我认为这是不可能的。如果可行的话,有人知道如何做到这一点吗

相关项目是


我想在某个时候我已经找到了正确的着色器,但事实上它是错误的,请看

你不能。真的没有理由这么做。只需使用逐顶点颜色,然后将从纹理获得的值乘以该逐顶点颜色

但是,如果您真的想这样做,您可以,如果您有GL 3.3:

layout(location = 0, index = 0) out vec4 textureColor;
layout(location = 0, index = 1) out vec4 glyphColor;
然后你可以:


但事实上,这对你来说毫无意义。只需使用片段着色器将它们相乘。

只需将纹理颜色与逐顶点颜色相乘将导致信息丢失,没有子像素渲染,使用完整RGB像素进行抗锯齿?例如,如果我想用黑色绘制图示符,则将图示符纹理乘以黑色会导致RGB为黑色,并且只有alpha会对图示符进行反锯齿,但只使用灰度。使用blend func/blend color,我可以保留此信息。@NicolasRougier:然后您需要做出决定:是否要强制双源混合,从而强制用户使用GL 3.3+类硬件?或者,您想先执行乘法并与alpha(大多数OpenGL应用程序渲染文本的方式)混合,从而获得非常小的视觉质量损失吗?在这种情况下,亚像素消除混叠是不值得的。特别是当它阻止您使用时。感谢您的回答,但亚像素渲染/定位对于在中小型字体大小上进行完美渲染非常关键。这对于游戏来说可能并不重要,但对于网络浏览器来说,这是一个至关重要的问题。@NicolasRougier:当我关掉这些东西时,旁观者的眼中就有了相当重要的东西。在亚像素渲染之前,我们似乎已经渲染了中小型字体。但更重要的是,我已经概述了你的选择。您可以使用精度稍低的子像素渲染,也可以将自己限制为GL 3.3级硬件,或者强制在不同的绘制调用中绘制每个四边形。如果您想执行您试图执行的数学运算,这些是OpenGL提供给您的唯一选项。请记住:亚像素渲染通常是在CPU上完成的。下面是一个关于暗示/紧排/亚像素为何至关重要的参考:我已经想出了这段代码,它不是那么糟糕,但并不完美:vec4 c=texture2Dtexture,uv;浮点数t=maxc.r,c.g,c.b;vec4 color=vec4gl_color.rgb,c.r+c.g+c.b/3.0;颜色=t*color+1.0-t*vec4c.r、c.g、c.b、minc.r、c.g、c.b;gl_FragColor=vec4 color.rgb,gl_color.a*color.a;再次感谢GL 3.3的帮助,我不知道。由于我希望该库能够与GL 2.0一起使用,因此我将坚持使用上面的解决方案。
glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC_COLOR);