ので、 "ボリューム" について知らない(それ自体で)表示する方法(...)体積形状
OpenGLがあります。純粋な出来事によって深度バッファーテストによる深度ソートのようなレンダリング副作用を引き起こす可能性のある平坦な三角形、線、および点を知っています。
技術的には、CSG(建設的な立体図形)を実行するために、一連の描画とステンシルバッファ操作を連鎖させることができます。詳細はftp://ftp.sgi.com/opengl/contrib/blythe/advanced99/notes/node22.htmlを参照してください。
しかし、フラグメントシェーダで実行される単純なraytracerを使用して簡単に実装できます。現在、レイトレースはそれ自体が広いテーマであり、あなたはそれについての本を書くことができます(実際には、多くの本がそのテーマに書かれています)。おそらく例を参照するのが最善です。この場合、私は次のShaderToy https://www.shadertoy.com/view/ldS3DWを参照してください - そのシェーダのわずかストリップダウンバージョンでは、あなたが興味のある交差形状の種類描く:
OK
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);
}
を、そのことを行うには「魔法の方法は」ありませんOpenGLのオプションを有効または無効にします。シェイダーでそれを行うのはいい考えですが、私の場合はシンプルな範囲を超えたいくつかの形があります。そのため、シェーダーは非常に複雑になります。おそらく私のためのよりよい方法は最終的にステンシルバッファを使用することです。とにかく、答えてくれてありがとう(そして、OpenGLのボリュームに関する間違いをお詫び申し上げます:-)) –