2012-08-28 54 views
2

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

回答

1

不幸的是,片段最终融合到帧缓冲区仍然是固定功能。此外,glLogicOp没有在ES中实现,所以你不能做像XOR绘图这样便宜的东西。

我觉得最终效果是:

  • 你想要的输出颜色是颜色已经在帧缓冲区的自定义功能;
  • 但帧缓冲区不能在着色器中读取(它会中断流水线并导致并发问题)。

因此,你将不得不实施乒乓管道。

你有两个离屏缓冲区。一个代表您输出的​​最后一帧,另一个代表您在此之前输出帧的内容。

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

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

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

+0

谢谢,会给它一个镜头。 –

0

我觉得这可能是工作:

glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

用白色画出你的线,然后将结果将呈现为

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

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

+0

当我试过这个东西时,它使橡皮擦,这意味着无论我刷笔刷哪里都是透明的。此外,它不再将纹理应用于画笔。我不认为我在执行你的想法错误.. glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0f,1.0f,1.0f,1.0f); –

+0

你的评论听起来不像你原来的问题。什么刷子?我以为你在画线。你是什​​么意思,它'不应用纹理刷'?你没有提到有关纹理的任何内容。 – Tim

+0

好的抱歉,我不知道我在这个问题上有多少细节。我正在绘制线条,但使用“笔刷”(类似于流行的GLPaint示例)。 “画笔”使用一种纹理,对画出的线条应用了不错的形状。我并不认为这些信息会影响我正在尝试做的事情,因此我将它排除在外。对困惑感到抱歉。并且,“不应用纹理刷”,我的意思是现在正在绘制纹理的大小的正方形而不是纹理内的形状,但这不是一个问题。 –