我有一个“W xH 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;
}

片段着色器
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)躺在其上的球正确地遮挡了相同的视线,因此只发射了我在图片中用红色下划线表示的部分。

这是射线广播的应用程序还是类似的应用程序?

最佳答案

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

使用GPU遮挡查询

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

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

此算法比此处可以解释的要复杂,这是一个很好的Nvidia article on the topic.

使用CPU射线转换

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

有关淘汰技术的更多信息,请查看我的答案here

关于c++ - 3D体积渲染和多视角遮挡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19183647/

10-09 12:46