Python 3.x 在OpenGL中绘制半透明帧缓冲区时如何消除别名?

Python 3.x 在OpenGL中绘制半透明帧缓冲区时如何消除别名?,python-3.x,opengl,blending,Python 3.x,Opengl,Blending,我目前正在学习OpenGL,并尝试制作一个简单的GUI。到目前为止,我对着色器了解很少,也没有使用任何着色器 我所做的加速文本渲染的技巧之一是在将文本四边形渲染到屏幕之前将其渲染到透明的帧缓冲区对象。加速很明显,但我注意到文本的边缘绘制得很差。我注意到,如果我将透明纹理设置为另一种透明颜色,那么文本将与该颜色混合。在我渲染为透明绿色纹理的示例中: 我使用以下参数进行混合: glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_

我目前正在学习OpenGL,并尝试制作一个简单的GUI。到目前为止,我对着色器了解很少,也没有使用任何着色器

我所做的加速文本渲染的技巧之一是在将文本四边形渲染到屏幕之前将其渲染到透明的帧缓冲区对象。加速很明显,但我注意到文本的边缘绘制得很差。我注意到,如果我将透明纹理设置为另一种透明颜色,那么文本将与该颜色混合。在我渲染为透明绿色纹理的示例中:

我使用以下参数进行混合:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE)
默认为glBlendEquation(
GL\u ADD

我从文档中了解到,每个像素都是通过一个等式发送的,该等式是
source\u rgb*blend\u factor+dest\u rgb*blend\u factor

我通常希望,当纹理是透明的时,它的RGB被忽略,混合的两侧,因此如果可以,我将使用类似的公式计算RGB:

source\u rgb*source\u alpha/total\u alpha+dest\u rgb*dest\u alpha/total\u alpha

其中,total_alpha是α的和。这似乎不受支持

有什么能帮我减轻头痛的吗?我愿意接受各种建议,从修复到重写一切,再到使用一个已经做到了这一点的库

如果您感兴趣,可以获得完整的源代码。如果您需要相关摘录,请告诉我

编辑:我以前确实尝试过从我的alpha混合中删除GL_ONE,GL_ONE,GL_ONE,GL_ONE,GL_ONE,GL_ONE,GL_ONE,GL_减去GL_SRC_alpha),但效果也不太好。我得到了类似的结果

按照建议使用预乘解决了问题


首先,
总α
不是α的总和,而是以下各项:

total_alpha = 1 - (1 - source_alpha)*(1 - dest_alpha)
正如您正确指出的,OpenGL不支持按
total\u alpha
进行最终除法。但它不需要。你所需要做的就是转换到思考和工作的角度,即预乘alpha。这么说很简单

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
做正确的事