OpenGL ES 2 - 直接与间接绘制GL_POINTS

时间:2013-09-06 13:43:15

标签: ios drawing opengl-es-2.0 fragment-shader

我正在创建一个用于绘制/草图绘制的iOS应用程序,当我将GL_POINTS 间接绘制到FBO然后将此FBO标记到最终FBO上时,现在遇到问题。

以下是将GL_POINTS DIRECTLY 绘制到FBO时的结果

Direct Drawing

这是我通过绘制到FBO然后将此FBO绘制到另一个FBO上来绘制点间接的结果

Drawing Indirectly

正如您所看到的,间接方法没有完全融合。我不知道问题是因为我的混合模式是错误还是因为间接绘制时存在丢失精度。

这是我的算法:

予。将点绘制到名为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);      
}

II。然后,使用quad

将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时发生的精度损失

1 个答案:

答案 0 :(得分:0)

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

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

  2. 当'加盖'绘图FBO时,这是我应用着色时。通过将颜色值作为一个整体插入,并将片段颜色设置为此颜色值乘以alpha。

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