Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 三维体绘制和多视点遮挡_C++_Opengl_Graphics_3d_Raycasting - Fatal编程技术网

C++ 三维体绘制和多视点遮挡

C++ 三维体绘制和多视点遮挡,c++,opengl,graphics,3d,raycasting,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( (

我有一个“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);
}
片段着色器

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);
}
变化的vec3纹理坐标;
均匀采样器三维体积采样器;
void main()
{
vec4 uniformColor=vec4(1.0,1.0,0.0,1.0);//它是白色的
如果(纹理坐标.x=1.0 | |纹理坐标.z=1.0)
gl_FragColor=vec4(0.0,0.0,0.0,1.0);//可以使用统一颜色来再次为对象着色
其他的
gl_FragColor=统一颜色*纹理3D(体积采样器,纹理坐标);
}
在OpenGL程序中,我从(0100,0)眼坐标中查看居中的对象,这些几乎是球形的白色斑块,但我希望对于另一个查看器(0,0,0),位于同一视线上的球体被正确遮挡,以便仅发射图片中我用红色下划线的部分

这是光线投射还是类似的应用

这是光线投射还是类似的应用


这本质上就是光线跟踪阴影算法:一旦用视图光线击中(可见)曲面,将该点作为指向另一点(光源或其他任何点)的跟踪的原点,如果可以到达该点(无“碰撞”)将这些信息用作渲染计算的进一步输入。

似乎您需要的是遮挡消隐,您有两个主要选项来实现遮挡消隐

使用GPU遮挡查询 这实质上是询问硬件是否绘制某个片段,如果不绘制,则可以剔除该对象

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

这个算法比这里解释的更复杂,这里是一个很好的例子

使用CPU光线投射 这只是检查每个对象(或者可能是其边界体积),如果光线击中该对象,则可能会隐藏其后面的其他对象。需要使用八叉树或BSP树对对象进行空间排序,这样您就不会检查每个对象,而只检查摄影机附近的对象


有关剔除技术的更多信息,请查看我的答案。

您有关于这种光线跟踪阴影算法的详细信息吗?您的
#版本
指令在哪里?@linello不客气。如果您有更多问题,可能需要查看Gamedev stack exchange。那是我最活跃的地方。