那么,有没有办法显示(…)体积形状
OpenGL(本身)不知道“体积”。它知道平面三角形、直线和点,这些纯属偶然也可能导致渲染副作用,如深度缓冲区测试的深度排序。
从技术上讲,可以链接一系列绘图和模板缓冲区操作来执行 CSG(constructive solid geometry);详情请见ftp://ftp.sgi.com/opengl/contrib/blythe/advanced99/notes/node22.html。
但是,您想要通过片段着色器中执行的简单光线追踪器更容易实现。现在光线追踪本身是一个广泛的主题,你可以写很多关于它的书(实际上已经写了很多关于这个主题的书)。最好参考一个例子。在这种情况下,我指的是以下 ShaderToy https://www.shadertoy.com/view/ldS3DW - 该着色器的略微精简版本绘制了您感兴趣的那种交叉几何:
float sphere(vec3 ray, vec3 dir, vec3 center, float radius)
{
vec3 rc = ray-center;
float c = dot(rc, rc) - (radius*radius);
float b = dot(dir, rc);
float d = b*b - c;
float t = -b - sqrt(abs(d));
float st = step(0.0, min(t,d));
return mix(-1.0, t, st);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = (-1.0 + 2.0*fragCoord.xy / iResolution.xy) *
vec2(iResolution.x/iResolution.y, 1.0);
vec3 ro = vec3(0.0, 0.0, -3.0);
vec3 rd = normalize(vec3(uv, 1.0));
vec3 p0 = vec3(0.5, 0.0, 0.0);
float t0 = sphere(ro, rd, p0, 1.0);
vec3 p1 = vec3(-0.05, 0.0, 0.0);
float t1 = sphere(ro, rd, p1, 1.0);
fragColor = vec4( step(0.0,t0)*step(0.0,t1)*rd, 1.0 );
}