1

让我稍微解释一下标题。在帧缓冲区中,我有一些颜色值(为简单起见,我将仅引用二进制中的一个颜色通道,例如特定像素中的 00000001)。然后在那个特定的值中我要写一个新的值。OpenGL 应该检查输入值和该像素中已经存在的值,并保持两者的最大值。换句话说,我希望它在传入值和现有值之间执行 BITWISE OR。因此,如果现有值是 00000001,而传入值是 00000010,那么结果必须是 00000011。

在 OpenGL ES 1.1 中,我认为这很容易使用 glLogicOp (http://www.opengl.org/sdk/docs/man/xhtml/glLogicOp.xml) 函数实现。但这在 OpenGL ES 2.0 中不受支持(为什么为什么他们删除了它??:(),我想不出可以达到类似结果的混合功能(我认为使用混合是不可能的)。我应该使用模板缓冲区或其他技巧以实现我的目标?

你能描述一下它的步骤吗?

PS我知道使用着色器一切皆有可能,但这需要现在付出巨大的努力来实现。如果这是唯一的解决方案,那么请给我这种方法的指导。

提前致谢。

4

3 回答 3

0

我认为您将不得不为此使用着色器。

1) 创建两个 renderTargets[2] 将用于与 swapIndex 交换。

2) 渲染到一个 renderTarget[swapIndex] 并使用另一个 renderTarget[1-swapIndex] 作为参考纹理,您将从 GLSL 着色器中采样。

3)在片段(又名像素)着色器中,您将从纹理(又名renderTarget [1-swapIndex])中采样并将“gl_FragColor”设置为max(texture,someColor)。

4) 翻转 swapIndex {swapIndex = 1-swapIndex;} 并重新开始。

于 2012-01-05T11:51:23.337 回答
0

@Summon,抱歉,如果我添加额外的答案而不是评论,我没有足够的声誉来发表评论。

反正:

第 1 点:我确信 100% 你不能在着色器中执行按位或/和/移位,因为就在上个月,我不得不浪费大约 2 周的时间来进行这个疏忽的编程。:) :)

第 2 点:查看维基百科上关于 GLSL 的这篇文章(运算符部分):

1.30 版中添加了位运算符。

A. 如果您尝试将#version 130 添加到您的着色器,它们将无法编译。B. 如果您尝试添加按位运算,例如 A & B(注意单个 &),A | B, A << 2, B >> 2 等等,它不会编译。

在不同的书籍/论坛/SDK上阅读,我发现了相同的确认。

我希望避免我在这件事上遇到的同样的头痛。

毛里齐奥·贝内代蒂

于 2012-01-06T12:32:04.573 回答
0

我必须承认我的问题不是很清楚。无论如何,我会在这里细化问题并提出解决方案。

我有许多不同类型的任意形状(用户可以创建任意数量的任意形状并疯狂地变形它们),我想开发一种方法来从屏幕上像素的颜色中检测用户选择了多少形状(用户刚刚触摸了该像素)。

所以,我用某种颜色 id 对形状进行颜色编码。我在二进制级别工作:屏幕上的第一个形状的颜色 id 为 00000001,第二个形状的 id 为 00000010,依此类推。因此,使用一个字节(假设在红色通道中)我可以存储多达 8 个不同的颜色 ID。如果我使用 RGBA8888 格式,则最大形状数为 32。

我最初开发的算法是使用 glBlendFunc(GL_ONE, GL_ONE) 在源颜色 id 和目标颜色 id 之间进行混合,一切似乎都运行良好。因此,如果触摸的像素颜色为 00010101,则表示触摸了第一个、第三个和第五个形状。但是,用户可以创建一些非凸形状(如果这是折叠形状的正确词)。在这种情况下,如果用户折叠颜色 id 为 00000001 的形状,则重叠像素将获得 id 00000010,因为形状在第一次在帧缓冲区上绘制时写入 00000001,然后相同形状的重叠像素添加另一个 00000001,因为混合。

因此,如果我能以某种方式在帧缓冲区中写入的颜色 id 之间进行 BITWISE OR(不像我最初在问题中提到的那样合乎逻辑),那么问题就会得到解决。实际上,OpenGL ES 1.1 就是这种情况,通过使用 glLogicOp(GL_OR) 函数。不幸的是,这在 OpenGL ES 2.0 上不可用,并且必须再次创建一个着色器、一个通道等,我认为这太过分且难以维护。

OpenGL ES 2.0 的解决方案是这样的:

  1. 清除 RenderTexture B 的颜色为 glClearColor(0,0,0,0)
  2. 对于每个形状
  3. 清除Rendertexture A的颜色为glClearColor(0,0,0,0)
  4. 使用片段着色器在 Rendertexture A 上绘制形状,该着色器将其颜色 ID 作为颜色写入。
  5. Blend with GL_ONE, GL_ONE Rendertexture A 与 Rendertexture B 的内容
  6. 结束
  7. RenderTexture B 拥有我们需要的所有信息。
  8. 当用户触摸屏幕时,使用 glReadPixel 从 RenderTexture B 中采样相应的像素,并从二进制代码中找出触摸的形状。

最好的

于 2012-01-06T09:31:44.423 回答