2017-02-08 10 views
0

フラグメントシェーダで、オブジェクトがプレーンと交差する線を描きたい。フラグメントシェーダでオブジェクトとプレーンの交差を描画する

私は平面の式をフラグメントシェーダ(a、b、c、d)に渡し、オブジェクトとこの一様平面との交点を赤で描画したいと思います。

私は交差点の幅は関係なく、我々はズームインどのくらい常に同じになることはありませたい

今私のようにフラグメントシェーダで平面に私の物体からの距離を取得する:。

// uPlane: vec4 where values are a.b.c.d (plane equation) 
    // vPos: wodlPosition of the fragment 
    vec4 prod = uPlane*vPos; 
    float distance = (prod.r + prod.g + prod.g + prod.a)/length(uPlane.xyz); 

    if(abs(distance) < 1.) { 
    gl_FragColor = vec4(1., 0., 0., .5); 
    } else { 
    gl_FragColor = vec4(0., 1., 0., .5); 
    } 

このアプローチの問題点は、ズームイン/アウトするときに交差点の「幅」が変化することです(下のスクリーンショットを参照)。

私のオブジェクトと飛行機の制服の交差点に「2px幅」の線を描くには、どの方法が最適でしょうか?あなたはあなたのビューの "ズーム倍率" /スケーリングを考慮する必要があり

enter image description here enter image description here

+0

解決策の1つは、断片位置を平面に投影した後、何らかの方法で投影画面座標を計算し、投影画面座標と断片画面座標を比較し、その情報を使用して線を描画します – Nicolas

答えて

1

。 2Dの場合(写真はかなり2Dに見えます)、均一なスケーリングと回転がないのはかなり簡単です。モデルビュー行列を渡し、[0] [0]番目の要素を抽出する(またはその値をシェーダに渡す)。距離値をそれで割ります。 回転と平行移動を使用してモデルビューの行列から適切なスケーリング値を抽出するには、thisを参照してください。