C++ 三维体绘制和多视点遮挡
我有一个“W x H x D”的体积数据,除了包含1的小球形体积外,它在任何地方都是零 我编写了着色器来提取3D体积与由顶点构成的通用对象的“交集” 顶点着色器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( (
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。那是我最活跃的地方。