3D体积渲染和多视点遮挡

lin*_*llo 8 c++ opengl 3d graphics raycasting

我有一个"W x H x D"体积数据,除了包含1的小球形体积外,到处都是零.

我编写了着色器来提取该3D体积与由顶点构成的通用对象的"交集".

顶点着色器

varying vec3 textureCoordinates;
uniform float objectSize;
uniform vec3 objectTranslation;

void main()
{
        vec4 v=gl_Vertex;
        textureCoordinates= vec3(   ((v.xz-objectTranslation.xz)/objectSize+1.0)*0.5,    ((v.y-objectTranslation.y)/objectSize+1.0)*0.5);
        gl_Position = gl_ModelViewProjectionMatrix*v;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

varying vec3 textureCoordinates;
uniform sampler3D volumeSampler;
void main()
{
    vec4 uniformColor = vec4(1.0,1.0,0.0,1.0); //it's white
    if ( textureCoordinates.x <=0.0 || textureCoordinates.x >= 1.0 || textureCoordinates.z <= 0.0 || textureCoordinates.z >= 1.0)
        gl_FragColor =vec4(0.0,0.0,0.0,1.0); //Can be uniformColor to color again the thing
    else
        gl_FragColor = uniformColor*texture3D(volumeSampler, textureCoordinates);
}
Run Code Online (Sandbox Code Playgroud)

在OpenGL程序中,我正在从(0,100,0)眼坐标看到中心对象上带有几乎球形的白色斑块,但是我想要另一个观察者(0,0,0)那个躺在它上面的球体相同的视线被正确遮挡,因此只发出我在图片中用红色加下划线的部分.

(0,0,0)查看器的理想遮挡作为从上看的视图

这是光线投射或类似的应用吗?

con*_*t3d 3

看来你想要的是遮挡剔除,你有两个主要选项来实现遮挡剔除

使用 GPU 遮挡查询

这本质上是询问硬件是否会绘制某个片段,如果没有,您可以剔除该对象。

遮挡查询计算通过深度测试的片段(或样本)的数量,这对于确定对象的可见性很有用。

这个算法比这里可以解释的更复杂,这里有一篇关于这个主题的优秀 Nvidia 文章。

使用CPU光线投射

这只是检查每个对象(或者可能是边界体积),如果光线击中该对象,则它可能隐藏在其后面的其他对象。需要使用八叉树或 BSP 树对对象进行空间排序,因此您最终不必检查每个对象,而只需检查相机附近的对象。

有关剔除技术的更多信息,请查看我的答案