我必须承认我的问题不是很清楚。无论如何,我会在这里细化问题并提出解决方案。
我有许多不同类型的任意形状(用户可以创建任意数量的任意形状并疯狂地变形它们),我想开发一种方法来从屏幕上像素的颜色中检测用户选择了多少形状(用户刚刚触摸了该像素)。
所以,我用某种颜色 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 的解决方案是这样的:
- 清除 RenderTexture B 的颜色为 glClearColor(0,0,0,0)
- 对于每个形状
- 清除Rendertexture A的颜色为glClearColor(0,0,0,0)
- 使用片段着色器在 Rendertexture A 上绘制形状,该着色器将其颜色 ID 作为颜色写入。
- Blend with GL_ONE, GL_ONE Rendertexture A 与 Rendertexture B 的内容
- 结束
- RenderTexture B 拥有我们需要的所有信息。
- 当用户触摸屏幕时,使用 glReadPixel 从 RenderTexture B 中采样相应的像素,并从二进制代码中找出触摸的形状。
最好的