gpt4 book ai didi

OpenGL/OpenTK 填充内部空间

转载 作者:行者123 更新时间:2023-12-01 19:14:12 30 4
gpt4 key购买 nike

我正在寻找一种用颜色“填充”三维几何体的方法,并且很可能在稍后的某个时间填充纹理。

假设你可以将头撞到混凝土墙上,从逻辑上讲你只会看到黑暗。然而,在 OpenGL 中,当您执行此操作时,由于剔除以及几何图形的绘制方式,世界自然是中空且透明的。我想模拟其中的黑暗/颜色/纹理。

我知道有些游戏通过将纹理/颜色直接覆盖在HUD上来实现这一点——从而使玩家失明。

还有其他方法可以做到这一点吗?假设玩家半站在水中;他们可以看到部分海浪下方的情况。您将如何填充它以防止他们能够清楚地看到现在屏幕一半的下方?

这个概念叫什么?

最佳答案

相机前纹理方法的一个问题是纹理是 2D,但您想要可视化 3D 体积的切片。对于您谈论的第一件事,即“头在墙内”的想法,我将向您介绍“3D/体积纹理”。对于半站在水中,您需要“体积渲染”“吸收”(由@user3670102讨论)。

3D 纹理

这里的总体思路是你有一些函数可以定义 3D 空间中各处的颜色,而不仅仅是在表面上(与常规纹理映射一样)。这很好,因为您可以将几何图形放置在任何位置,并根据 3D 位置在片段着色器中为其着色。想象一下对体积进行切片并查看交叉点的颜色。

对于“头撞墙”效果,您可以在玩家前面绘制一个全屏多边形(就在近裁剪平面上,尽管您可能希望将其向前推一点,使其不会太小)并且基于 3D 函数为其着色。现在,它看起来非常坚固,并且可以移动玩家的 Action ,而不是像您廉价地将纹理贴在屏幕上一样。

enter image description here

实际的函数可以用 3D 纹理来定义,但这非常占用内存。相反,您可以研究任一程序 3D 颜色(例如,程序木材或砖着色器很常见)。即使假设 2D 纹理是通过体积“挤出”的,或者更好的是,根据您正在绘制的交叉点/表面的角度对 3 个纹理(每个轴一个)进行加权。

检测与几何体和近剪裁平面的相交可能是这里最难的部分。如果我是你,我会研究 z 缓冲区的技巧,并确保将所有内容绘制为实体非自相交几何体。一个简单的想法可能是仅在绘制带有正面的所有内容后才绘制背面。如果您可以看到背面,则近平面的部分一定位于某物内部。对于这些像素,您可以计算世界空间中的近剪裁平面位置并应用 3D 纹理。尽管我怀疑有比将所有内容绘制两次更快的方法。

实际上,您所看到的内容可能没有光线,它应该是黑色的,但我想忽略这一点并直接渲染颜色,不发光。

吸收

这听起来比实际困难得多。如果你有一些透明的固体,它都是一种颜色(“同质”),那么它会消除光线,进一步的光线必须穿过它。考虑许多 alpha 透明表面,取极限,你就得到了指数。剩余的光线接近 1/exp(dist)exp(-dist)。谷歌“啤酒定律”。来自 here ,

vec3 Absorbance = WaterColor * WaterDensity * -WaterDepth;
vec3 Transmittance = exp(Absorbance);

查找某物距离的一个好方法是使用着色器通过附加混合来渲染背面(或海底/水底),该着色器绘制到浮点纹理的距离。然后切换到减色混合并渲染所有正面(或水面)。您将得到一个包含上述方程的距离/深度的纹理。

体积渲染

结合这两种想法,该 Material 是透明的固体,但颜色(可能还有密度)在整个体积中变化。如果您有大量数据并且希望速度更快,这就会变得非常复杂。渲染此效果的一种直接方法是通过 3D 纹理(或程序函数,无论您使用什么)对光线进行数字积分,同时应用吸收函数。基本的强力欧拉积分可能会为近平面上的每个像素启动一条光线,然后以均匀的距离向前行进。当你行进的每一步中,你假设颜色保持不变并应用吸收,记录你还剩下多少光。快速谷歌显示this .

关于OpenGL/OpenTK 填充内部空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741899/

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