2017-12-06 33 views
0

OpenGLを使用していくつかの幾何学的な3Dシェイプを表示する数学アプリケーションを作成しています。場合によっては、これらの図形が交差し、このようなときに、それぞれの図形の交差部分を他の図形内に表示したいことがあります。両方の形状が、私は必要なもの、半透明であるため、このような多かれ少なかれ何かである:私は代わりにその結果を得る2半個の透明の球体でしかし2つの半透明オブジェクトの共通部分を表示しますか?

Perfect intersection

、:

With depth testing

私が知っています正確な透明効果を得るためには、透明な形状が描かれる前に深度テストをオフにする必要があります。だから、

Without depth testing

、正しく2つの体積形状の交差部を表示する方法を壊すことなく、互いに内側に、そこにある:透明形状は別の非透明な形状を超えているが、この原因別の副作用深さのテスト?

答えて

1

ので、 "ボリューム" について知らない(それ自体で)表示する方法(...)体積形状

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); 
} 
+0

を、そのことを行うには「魔法の方法は」ありませんOpenGLのオプションを有効または無効にします。シェイダーでそれを行うのはいい考えですが、私の場合はシンプルな範囲を超えたいくつかの形があります。そのため、シェーダーは非常に複雑になります。おそらく私のためのよりよい方法は最終的にステンシルバッファを使用することです。とにかく、答えてくれてありがとう(そして、OpenGLのボリュームに関する間違いをお詫び申し上げます:-)) –

関連する問題