如何在体积渲染中操作深度值以对其进行更正?
How to manipulate depth value to correct it in volume rendering?
我有一个 2 阶段体积渲染器,我使用 from DVR 方法来渲染体积,但是深度缓冲区不适合该体积,因为我使用 from box 进行光线投射。
实际上我有一个盒子,我应该根据体积数据计算正确的深度值。
我在顶点着色器中有这个:
out float DEPTH ;
...
DEPTH = gl_Position.z / gl_Position.w;
并在片段中:
gl_FragDepth = (1.0 - 0.0) * 0.5 * DEPTH + (1.0 + 0.0) * 0.5;
它们适合盒子,我的主要问题是我如何在 DEPTH 中添加一点以制作正确的深度值?
我也用了从(distanceToAdd/100 + DEPTH)
,但是错了。
知道吗?
经过一些澄清,主要问题似乎是如何组合实体网格体和体积,以便在相交时,体积仅渲染到实体对象的表面
为了回答这个问题,我们需要分两次渲染场景。
将所有- 实体对象渲染到具有附加深度缓冲区的帧缓冲区对象 (FBO( 中
- 使用修改的步骤计数和初始颜色渲染所有体积。
我将在以下部分中解释详细信息
修改的步骤计数
通常,您为光线行进算法计算两个点:光线与立方体的近交点和远交点。这可以通过将射线x = o + t*d
转换为立方体空间并为t
取最小t_min
和最大值t_max
来实现。如果希望实体对象与体积相交,则需要确保正确调整这些点。
- 通常不必调整近点,因为如果立方体的正面位于实体对象的表面后面,则不会渲染像素。
- 远点需要根据当前像素的深度值进行调整:
- 计算对象表面在当前像素处的世界空间坐标(通过应用反向投影和视图变换(
- 通过应用立方体的逆世界变换,计算对象表面
p
立方体空间坐标。 - 计算
t_surf
使得p = o + t_surf * d
,即计算光线到达固体表面的距离 - 取
t_max
到t_surf
之间的最小值,并将其作为距射线原点t_max
的新最大距离。这样,您可以忽略位于实体表面后面的体积的所有部分。
修改后的初始颜色
通过当前的修改,体积在固体表面上被正确剔除,但我们仍然只能看到黑色背景,而不是固体表面的颜色闪耀。
要解决此问题,只需坚持从后到前的构图并将初始值设置为表面的颜色(而不是像正常情况下那样将其保留为黑色(。这样,如果体积在某个点是完全透明的,你会看到固体表面,如果它有点不透明,它就会与表面前面的体积混合。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- OpenGL在启用深度测试时不会丢弃我的碎片
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 如何在体积渲染中操作深度值以对其进行更正?
- 基本深度复制(操作重载)