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

时间:2013-10-04 14:22:18

标签: c++ opengl graphics 3d 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;
}

片段着色器

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)位于同一视线上的球体被正确遮挡,因此只有我在图片中以红色加下划线的部分被发射出来。

Ideal occlusion for (0,0,0) viewer as view from up

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

2 个答案:

答案 0 :(得分:3)

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

使用GPU遮挡查询

这主要是关于询问硬件是否会绘制某个片段,否则你可以剔除该对象。

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

这个算法比这里解释的更复杂,这里有一个很好的Nvidia article on the topic.

使用CPU光线投射

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

有关剔除技巧的更多信息,请查看我的回答here

答案 1 :(得分:2)

  

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

这实质上是光线追踪阴影算法:一旦用视线射击了(可见)曲面,就可以将该点作为原点用于追踪另一个点(光源或其他)如果你能够达到这一点(没有)“碰撞”其他东西,那么将这些信息用作渲染计算的进一步输入。