gpt4 book ai didi

c++ - 3D 体绘制和多视点遮挡

转载 作者:可可西里 更新时间:2023-11-01 17:56:10 26 4
gpt4 key购买 nike

我有一个“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) 眼睛坐标中查看居中的对象,上面有那些几乎是球形的白色斑 block ,但我希望对于另一个观察者 (0,0,0) 球体位于同一视线上的那些被正确遮挡,因此只有我在图片中用红色下划线的部分被发射。

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

这是光线转换或类似应用吗?

最佳答案

看来你想要的是遮挡剔除,你有两个主要的选择来实现遮挡剔除

使用 GPU 遮挡查询

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

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

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

使用 CPU 光线转换

这只是简单地检查每个对象(或者可能是它的边界体积),如果光线击中该对象,那么它可能会隐藏其他对象。对象需要使用八叉树或 BSP 树进行空间排序,因此您最终不会检查每个对象,而只检查相机附近的对象。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com