3D体渲染与多视角遮挡问题

8

我有一个体积数据,它的尺寸为 W x H x D,除了包含 1 的小球形体积之外,其他地方都是零。

我编写了着色器来提取该三维体积与由顶点构成的通用对象的“交集”。

顶点着色器

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;
}

片元着色器

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);
}

在OpenGL程序中,我正在从(0,100,0)的眼坐标查看带有几乎球形白色补丁的居中对象,但我希望针对另一个观察者(0,0,0),位于同一视线上的圆球正确被遮挡,以便只发出我在图片中用红色下划线标记的部分。
这是否是射线投射或类似技术的应用?

你的#version指令在哪里? - genpfault
2个回答

3
似乎您想要的是遮挡剔除,实现遮挡剔除有两个主要选项:

使用GPU遮挡查询

这基本上是询问硬件是否绘制某个片段,如果不需要,则可以剔除对象。
遮挡查询计算通过深度测试的片段(或样本)的数量,这对于确定对象的可见性非常有用。
此算法比此处可以解释的更为复杂,以下是一篇关于该主题的出色Nvidia文章。

使用CPU射线投射

这只是检查每个对象(或可能是其边界体积),如果一条射线击中了对象,则它可能会隐藏在其后面的其他对象。对象需要使用八叉树或BSP树进行空间排序,以便您不会检查每个对象,并且只检查靠近相机的对象。
有关裁剪技术的更多信息,请查看我的答案here

@linello 不用谢。如果你有更多问题,也许需要在Gamedev stack exchange上查看。那是我最活跃的地方。 - concept3d

2

这是射线追踪或类似技术的应用吗?

本质上,这是射线追踪阴影算法:一旦你的视线射线与一个(可见的)表面相交,你将该点作为起点向另一个点(光源或其他)进行追踪,如果你可以到达该点(没有)“撞”到其他物体,则将该信息作为进一步的渲染计算输入。


1
你有关于这种光线追踪阴影算法的详细信息吗? - linello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接