如何操纵深度值以在体绘制中对其进行校正?
How to manipulate depth value to correct it in volume rendering?
我有一个 2 级体积渲染器,我正在使用来自 DVR 的方法来渲染体积,但是深度缓冲区不适合该体积,因为我使用了来自盒子的光线投射。
其实我有一个盒子,我应该根据体积数据计算出正确的深度值。
我在顶点着色器中有这个:
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
转换为立方体 space 并为 t
取最小值 t_min
和最大值 t_max
来实现。如果你想让固体物体与你的体积相交,你需要确保这些点调整正确。
- 近点通常不需要调整,因为如果立方体的正面在实体物体表面的后面,像素将不会被渲染。
- 需要根据当前像素的深度值调整远点:
- 计算对象表面在当前像素处的世界 space 坐标 (by applying the inverse projection and view transform)
- 通过应用立方体的逆世界变换计算对象表面的立方体 space 坐标
p
。
- 计算
t_surf
使得p = o + t_surf * d
,即计算光线到达固体表面的距离
- 取
t_max
和 t_surf
之间的最小值,并将其作为距射线原点的新最大距离 t_max
。这样,您将忽略位于固体表面后面的体积的所有部分。
修改初始颜色
通过当前的修改,体积在实体表面被正确剔除,但我们仍然只能看到黑色背景,而不是实体表面的颜色。
要解决这个问题,只需坚持从后到前的构图并将初始值设置为表面的颜色(而不是像正常情况下那样只保留黑色案件)。这样,如果体积在某个点是完全透明的,您会看到固体表面,如果它有点不透明,它就会与表面前面的体积混合。
我有一个 2 级体积渲染器,我正在使用来自 DVR 的方法来渲染体积,但是深度缓冲区不适合该体积,因为我使用了来自盒子的光线投射。
其实我有一个盒子,我应该根据体积数据计算出正确的深度值。
我在顶点着色器中有这个:
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
转换为立方体 space 并为 t
取最小值 t_min
和最大值 t_max
来实现。如果你想让固体物体与你的体积相交,你需要确保这些点调整正确。
- 近点通常不需要调整,因为如果立方体的正面在实体物体表面的后面,像素将不会被渲染。
- 需要根据当前像素的深度值调整远点:
- 计算对象表面在当前像素处的世界 space 坐标 (by applying the inverse projection and view transform)
- 通过应用立方体的逆世界变换计算对象表面的立方体 space 坐标
p
。 - 计算
t_surf
使得p = o + t_surf * d
,即计算光线到达固体表面的距离 - 取
t_max
和t_surf
之间的最小值,并将其作为距射线原点的新最大距离t_max
。这样,您将忽略位于固体表面后面的体积的所有部分。
修改初始颜色
通过当前的修改,体积在实体表面被正确剔除,但我们仍然只能看到黑色背景,而不是实体表面的颜色。
要解决这个问题,只需坚持从后到前的构图并将初始值设置为表面的颜色(而不是像正常情况下那样只保留黑色案件)。这样,如果体积在某个点是完全透明的,您会看到固体表面,如果它有点不透明,它就会与表面前面的体积混合。