在每个帧中(如每秒帧数)我渲染,我只使用用户可以选择的对象(以及任何选择阻碍对象)制作它的较小版本。在该缓冲区中,我以不同的颜色渲染每个对象。 当用户使用mouseX和mouseY时,我会查看该缓冲区与该位置对应的颜色,并找到相应的对象。 我无法使用FBO所以我只是将这个缓冲区渲染到纹理,并将纹理重新缩放到屏幕正交,并使用glReadPixels读取鼠标光标周围的“热区”..我知道,不是最有效但性能现在还可以。
现在我遇到的问题是这个带有“彩色对象”的缓冲区存在一些准确性问题。当然我禁用所有灯光和帧着色器,但不知怎的,我仍然得到了文物。显然我真的需要干净的颜色而没有任何差异。
请注意,这里我将所有颜色信息放在GL_RED中的无符号字节中。 (现在我最大限度地拥有255个可选对象)。
这些是通过重新调整纹理引起的吗? (我可以通过在小纹理中查找缩放坐标来替换它。),或者我是否需要禁用其他一些标志来真正获得我想要的颜色。 这种技术甚至可以可靠地使用吗?
答案 0 :(得分:2)
您的GL_LINEAR
似乎正在使用GL_TEXTURE_MAG_FILTER
。如果您不想要插值颜色,请使用GL_NEAREST
。
答案 1 :(得分:0)
我可以通过在小纹理中查找缩放坐标来替换它。
你应该。重新缩放比转换坐标更加昂贵。
也就是说,如果保持整数比(如高档2倍),缩放均匀纹理不应该引入伪像,没有花哨的过滤。它在多边形边缘看起来很模糊,所以我假设这不是你使用的。
此外,重新缩放应仅在多边形边界处引入变化。您是否检查过未缩放纹理没有变化?这将证实它是否是引入你的“工件”的缩放。
答案 2 :(得分:0)
“差异”究竟是什么意思?请详细解释。
现在提出一些建议:如果你的渲染不依赖于模板缓冲区操作,你可以将对象ID放入渲染过程中的模板缓冲区到窗口本身,不要在单独的纹理上使用绕行。在当前的硬件上,您通常会获得8位模板。当然,如果您想使用索引缓冲区方法,最佳解决方案是使用多个渲染目标,并将对象ID与颜色和其他内容一起渲染到索引缓冲区中。见http://www.opengl.org/registry/specs/ARB/draw_buffers.txt