mas*_*nlo 0 c++ opengl shader glsl fragment-shader
我有一个 2 阶段体积渲染器,我使用 DVR 方法来渲染体积,但深度缓冲区不适合该体积,因为我使用来自盒子的光线投射。
实际上我有一个盒子,我应该根据体积数据计算正确的深度值。
我在顶点着色器中有这个:
out float DEPTH ;
...
DEPTH = gl_Position.z / gl_Position.w;
Run Code Online (Sandbox Code Playgroud)
并在片段中:
gl_FragDepth = (1.0 - 0.0) * 0.5 * DEPTH + (1.0 + 0.0) * 0.5;
Run Code Online (Sandbox Code Playgroud)
它们非常适合盒子,我的主要问题是如何在深度上添加一点来获得正确的深度值?
我也用了 from (distanceToAdd/100 + DEPTH),但是是错误的。
任何想法?
经过一些澄清后,主要问题似乎是如何组合实体网格和体积,以便在相交时,体积仅渲染到实体对象的表面
为了回答这个问题,我们需要分两次渲染场景
我将在以下部分中解释详细信息
通常,您为光线行进算法计算两个点:光线与立方体的近交点和远交点。这可以通过将射线变换x = o + t*d到立方体空间并取 的最小值t_min和最大值t_max来实现t。如果您希望实体对象与体积相交,则需要确保这些点调整正确。
p通过应用立方体的逆世界变换来计算对象表面的立方体空间坐标。t_surf即p = o + t_surf * d计算光线到达固体表面的距离t_max取和之间的最小值t_surf,并将其设为t_max距射线原点的新最大距离。这样,您就可以忽略位于固体表面后面的体积的所有部分。通过当前的修改,体积在固体表面上被正确剔除,但我们仍然只能看到黑色背景,而看不到固体表面的颜色。
要解决此问题,只需坚持从后到前的构图并将初始值设置为表面的颜色(而不是像正常情况下那样将其保留为黑色)。这样,如果体积在某个点完全透明,您会看到固体表面,如果它有些不透明,它会与表面前面的体积混合。
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |