我正在创建一个用于绘图/素描的 iOS 应用程序,现在当我将 GL_POINTS间接绘制到 FBO 时遇到问题,然后这个 FBO 被标记到最终 FBO 上。
这是我将 GL_POINTS 直接绘制到 FBO 时的结果
这是我通过绘制到 FBO间接绘制点然后将此 FBO 绘制到另一个 FBO 上的结果
如您所见,间接方法并没有很好地融合。我不知道问题是因为我的混合模式错误还是因为间接绘制时精度有所损失。
这是我的算法:
I. 将点绘制到一个名为 drawingFramebuffer 的屏幕外 FBO:
// pre-multiplied alpha
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBindFramebuffer(GL_FRAMEBUFFER, drawingFramebuffer);
// clear drawing FBO
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
...
// draw the points
glDrawArrays(GL_POINTS, 0, totalPoints);
在片段着色器中
uniform sampler2D brushTexture;
uniform highp vec4 brushColor;
void main()
{
highp vec4 textureAlpha = texture2D(brushTexture, gl_PointCoord.xy);
gl_FragColor = vec4(brushColor.rgb * textureAlpha.a, textureAlpha.a);
}
二、然后,使用四边形将drawingFramebuffer标记到最终的Framebuffer上
// draw the texture using pre-multiplied alpha
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBindFramebuffer(GL_FRAMEBUFFER, finalFramebuffer);
...
// draw the quad vertices using triangle strip
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
在片段着色器中
uniform sampler2D texture;
varying highp vec2 textureCoord;
void main()
{
highp vec4 textureColor = texture2D(texture, textureCoord);
gl_FragColor = textureColor;
}
我完全困惑,当混合模式相同时,如何直接和间接地产生不同的结果。
感谢男孩/女孩的任何帮助!
--- 编辑添加 ---
用excel做了一些计算后,发现我的混合已经是正确的了,所以我怀疑问题是读取绘图FBO时发生的精度损失