0

我正在创建一个用于绘图/素描的 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时发生的精度损失

4

1 回答 1

0

好的,我终于通过以下方式修复了它:

  1. 绘制 GL_POINTS 时忽略 RGB 计算。底线是,rgb 值是罪魁祸首。所以我只关注绘制 GL_POINTS 时的 alpha 计算(通过使用默认的预乘混合)。

  2. 当“标记”绘图 FBO 时,这是我应用着色的时候。通过将颜色值插入为统一并将片段颜色设置为此颜色值乘以 alpha。

我认为这是 Procreate 或其他绘图应用程序使用的一种方法。虽然现在我有一个问题,如果颜色值变化(不是统一的)会发生什么......

于 2013-09-09T12:23:46.767 回答