gpt4 book ai didi

opengl - 如何在OpenGL中有效地实现 "point-on-heightmap"拾取?

转载 作者:行者123 更新时间:2023-12-04 05:31:58 45 4
gpt4 key购买 nike

我想在建模为高度图的世界地面上的 OpenGL 场景中跟踪鼠标坐标。目前没有像硬件镶嵌这样的花哨的东西。注意这个问题是不是 关于物体拾取。

目前我正在执行以下操作,由于回读操作,这显然会降低性能:

  • 渲染世界(地面)
  • 回读鼠标坐标处的深度值
  • 渲染场景的其余部分
  • 交换缓冲区并渲染下一帧

  • 回读在两个渲染步骤之间,因为我想要地面的深度值,前面没有任何物体。它是使用以下命令完成的:
    GLfloat depth;
    glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

    我的应用程序将帧速率限制为每秒 60 帧。在没有回读操作的情况下渲染场景时,我的 CPU 使用率不到 5%,但在进行回读时,它增加到大约 75%,尽管我没有做太多渲染场景或更新任何游戏模型或者这样的事情。

    一个临时的解决方案是缓存鼠标下像素的深度值,并仅每 5 或 10 帧更新一次,这会导致 CPU 使用率回落到 10% 以下。但显然不能成为问题的最佳解决方案。

    我怎样才能有效地实现拾取( 不是物体拾取 因为我想要表面上的(浮点)坐标)?

    我已经考虑过读回前缓冲区而不是后缓冲区的深度值,但是在搜索如何这样做时,我只发现人们提示 glRead* 方法最好完全避免。但是如何在不阅读某些内容(使用 glRead*)的情况下阅读某些内容(进行选择)?

    我很困惑。其他人如何实现拣货?

    一种完全不同的方法是在软件中实现世界表面拾取。将来自相机的 3D 光线“进入深度”重建,表示在目标像素处渲染的空间点应该没什么大不了的。然后我可以实现一个相交算法来找到表面上最前面的点。

    最佳答案

    您通常在 CPU 上实现它!在高度图坐标中找到您的拾取射线,并在高度图上进行简单的线迹跟踪。这与画线非常相似。在您相交的每个单元格中,针对您用来对其进行三角剖分的三角形进行测试。

    在完成之前避免从 GPU 读取非常重要。由于您通常会提前几帧安排绘图命令(GL 会自动执行此操作),这意味着您也只能在那时获得结果 - 或者停止 CPU,直到 GPU catch 。但是对于这样简单的事情不要这样做!

    关于opengl - 如何在OpenGL中有效地实现 "point-on-heightmap"拾取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463056/

    45 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com