【问题标题】:Is it ok to render Raycasting using vertex array?可以使用顶点数组渲染光线投射吗?
【发布时间】:2021-01-22 23:12:30
【问题描述】:

我正在使用光线投射制作简单的 fps 游戏,因为我认为它非常快速和轻便。 我的 Raycasting 函数将数据保存到顶点数组中,然后由 OpenGl 渲染。 但是因为这个数组包含屏幕上每个像素的顶点,这意味着每一帧我渲染 2073600 个顶点(1920x1080),在我看来这不是很好。 所以在这一点上,我认为最好放弃整个光线投射,让它看起来像光线投射,但具有真实的 3d,这意味着每帧只渲染大约 20 个顶点。

那么,我该怎么办?我应该只使用不同的渲染方法来使用光线投射吗?我应该使用真正的 3d 吗?还是每帧 2073600 个顶点就可以了?

【问题讨论】:

    标签: opengl raycasting vertex-array


    【解决方案1】:

    最快的方法是直接在 GPU 上进行光线投射,您可以为此使用计算着色器(我对此没有任何经验)但是也可以在标准着色器渲染管道上执行此操作,请参阅我的 GLSL 版本:

    您需要添加 BVH 或 Octree 才能为复杂场景提供合理的速度...

    如果您坚持在 CPU 端进行光线投射,那么最好将您的输出存储到 2 个纹理中,一个具有深度,另一个具有 RGB 颜色。如果您可以访问具有足够精度的 4 个组件纹理,则可以使用 RGBD 格式和单一纹理。然后渲染你只需渲染单个 QUAD 和片段着色器做剩下的...

    【讨论】:

    • 哦,当我说光线投射时,我实际上是指类似 wolfenstein3d 地图渲染器之类的东西。所以不涉及 3d 的东西。我只有一个代表自上而下地图的二维数字数组。我为屏幕上的每一列投射一条射线——1920 的宽度意味着 1920 条投射射线。然后我将结果保存到顶点数组。所以你的建议是将它们保存到纹理中,好的,我试试
    • @DaveF。体素网格光线跟踪与刚刚移植到 3D 的 wolfenstein 相同......对于 2.5D,如 this,您仍然可以在 GPU 上完全完成......地图是单个 2D 纹理,墙壁是纹理图集......不需要 BVH 或 OCTREE。如果您坚持使用 VBO,则将您的 VBO 包含为一组垂直线而不是像素...
    • @DaveF。您当前的 VBO 大小可能是个问题......您知道 gfx 卡很可能会很好地渲染它,但您需要意识到您必须将 VBO 数据复制到每帧的 gfx(因为它不是静态的),而且速度可能会慢很多比您想象的...如果直接在着色器中执行此操作,您只需传递 2 个纹理一次(不是每帧)...在每帧的基础上,您只需要传递一些带有相机位置和方向的制服,因此可以打包 4 个浮动到单个 vec4 向量 ...
    • 是的,我想将其压缩为垂直线,但这意味着每一列都将具有相同的颜色。我还看到有人通过旧版 opengl 执行此操作,这是个好主意吗?
    • @DaveF。不,这不仅仅意味着单色,因为您可以对线条进行纹理化线条的水平位置为您提供一个纹理坐标,另一个(垂直)固定为线条端点的最小值和最大值......(除非你有不同的高度墙)... 所以 1. 渲染地板和天空 2. 光线投射并通过带有纹理坐标的 x 分辨率垂直线...
    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多