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)那个躺在它上面的球体相同的视线被正确遮挡,因此只发出我在图片中用红色加下划线的部分.

这是光线投射或类似的应用吗?
看来你想要的是遮挡剔除,你有两个主要选项来实现遮挡剔除
这本质上是询问硬件是否会绘制某个片段,如果没有,您可以剔除该对象。
遮挡查询计算通过深度测试的片段(或样本)的数量,这对于确定对象的可见性很有用。
这个算法比这里可以解释的更复杂,这里有一篇关于这个主题的优秀 Nvidia 文章。
这只是检查每个对象(或者可能是边界体积),如果光线击中该对象,则它可能隐藏在其后面的其他对象。需要使用八叉树或 BSP 树对对象进行空间排序,因此您最终不必检查每个对象,而只需检查相机附近的对象。
有关剔除技术的更多信息,请查看我的答案。