我是一个`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)位于同一视线上的球体被正确遮挡,因此只有我在图片中以红色加下划线的部分被发射出来。
这是光线投射或类似的应用吗?
答案 0 :(得分:3)
看起来您想要的是遮挡剔除,您有两个主要选项来实现遮挡剔除
这主要是关于询问硬件是否会绘制某个片段,否则你可以剔除该对象。
遮挡查询计算通过深度测试的碎片(或样本)的数量,这对于确定对象的可见性很有用。
这个算法比这里解释的更复杂,这里有一个很好的Nvidia article on the topic.
这只是检查每个对象(或者可能是它的边界体积),如果光线击中对象,那么它可能隐藏在其后面的其他对象。对象需要使用八叉树或BSP树进行空间分类,因此您不必检查每个对象,只检查相机附近的物体。
有关剔除技巧的更多信息,请查看我的回答here。
答案 1 :(得分:2)
这是光线投射或类似的应用吗?
这实质上是光线追踪阴影算法:一旦用视线射击了(可见)曲面,就可以将该点作为原点用于追踪另一个点(光源或其他)如果你能够达到这一点(没有)“碰撞”其他东西,那么将这些信息用作渲染计算的进一步输入。