2

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

4

2 回答 2

1

遗憾的是,最终将片段混合到帧缓冲区中仍然是固定功能。此外glLogicOp,ES 中没有实现,所以你不能做一些像 XOR 绘图这样便宜的事情。

我认为最终的效果是:

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

因此,您将不得不实现一个 ping pong 管道。

您有两个屏幕外缓冲区。一个代表上一帧输出的内容,另一个代表上一帧输出的内容。

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

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

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

于 2012-08-28T22:24:38.080 回答
0

我认为这可以工作:

glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

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

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

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

于 2012-08-28T17:19:10.627 回答