【问题标题】:GPU mouse picking OpenGL/WebGLGPU 鼠标选择 OpenGL/WebGL
【发布时间】:2015-03-04 05:45:27
【问题描述】:

我知道我只需要渲染鼠标所在屏幕的 1x1 或 3x3 像素部分,对象 id 为颜色,然后从颜色中获取 id。

我已经用球体实现了光线投射拾取,我猜它与使相机朝鼠标光线方向看有关?

如何渲染正确的几个像素?

编辑:

在鼠标光线的方向上设置相机是可行的,但是如果我使视口更小,图片会缩放,但是(我认为)我需要的是对其进行裁剪而不是缩放。我将如何实现这一目标?

【问题讨论】:

  • 视口和调整投影矩阵

标签: opengl webgl projection


【解决方案1】:

最简单的解决方案是使用剪刀测试。它允许您仅在窗口的指定矩形子区域内渲染像素。

例如,将渲染限制为以像素 (x, y) 为中心的 3x3 像素:

glScissor(x - 1, y - 1, 3, 3);
glEnable(GL_SCISSOR_TEST);
glDraw...(...);
glDisable(GL_SCISSOR_TEST);

请注意,坐标系的原点位于窗口的左下角,而大多数窗口系统会在以左上角为原点的坐标系中为您提供鼠标坐标。如果您的系统是这种情况,则必须通过从 windowHeight - 1 中减去 y 坐标来反转 y 坐标。

【讨论】:

  • 这无疑是最简单的方法。我实现了设置投影矩阵,查看鼠标光线的方向,放大我需要的 1px 区域(FOV/screenWidth)并设置 1px 视口。它应该更快,因为如果它们在视野之外,片段着色器应该会跳过它们。如果我理解正确,剪刀在片段着色器之后工作。然而,我的测试并没有显示出显着的性能差异。
  • 性能影响可能来自导致 gpu 和 cpu 同步的 readpixels。 Viewport 和 Scissor 在性能上应该相似,尽管 scissor 不那么复杂,无法匹配所见的内容,例如视图矩阵保持不变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多