OpenGL ES混合功能因此颜色总是显示背景

时间:2012-08-28 17:10:55

标签: objective-c ios opengl-es glblendfunc

我正在使用OpenGL ES 1.1在我的iPad应用程序中绘制线条。我想确保无论背景颜色如何,绘制的线条总是在屏幕上可见,并且不允许用户选择颜色。是否有混合功能会产生这种效果?因此,绘制的线条的颜色将根据已在其下方绘制的颜色而变化,因此始终可见。

2 个答案:

答案 0 :(得分:1)

遗憾的是,片段最终混合到帧缓冲区仍然是固定功能。此外,glLogicOp未在ES中实现,因此您无法像XOR绘图那样做一些便宜的东西。

我认为净效应是:

  • 您希望输出颜色是帧缓冲区中已有颜色的自定义函数;
  • 但是无法在着色器中读取帧缓冲区(它会破坏管道并导致并发问题)。

因此,您必须实施乒乓管道。

你有两个屏幕外缓冲区。一个表示最后一帧输出的内容,另一个表示在此之前输出帧的内容。

要生成一个新帧,请使用表示帧之前的帧作为输入进行渲染。因为它是一个输入,您可以在任何地方对其进行采样,并在其上进行任何您喜欢的计算。你渲染到你拥有的另一个缓冲区(即更旧的缓冲区)因为你不再关心它的内容。

然后将所有内容复制到屏幕上并将两者交换,这意味着您刚刚绘制的内容仍然在纹理中,以表示您绘制的最后一帧。您刚刚提到的内容将成为您的下一个绘图目标,因为它是您已经方便地存在的东西。

因此,您将立即对渲染纹理感兴趣。您还需要确定要使用哪种功能来为现有背景选择合适的“不同”颜色。也许只是颠倒它会吗?

答案 1 :(得分:0)

我认为这可行:

glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

用白色绘制线条,然后结果将呈现为

[1,1,1,1] * ( 1 - [DstR, DstG, DstB, DstA]) + ([DstR, DstG, DstB, DstA] * 0)

这应该呈现背景为白色的黑色像素,背景为黑色的白色像素,背景为蓝色的黄色像素等。