2017-08-12 21 views
1

私はOpenGLプロジェクトで適切な屈折/反射をレンダリングしようとしており、クリップ距離を使用する必要があります。私はThin Matrixのチュートリアルに従っています。OpenGL有効クリップ距離

私はゲームループ内

glEnable(GL_CLIP_DISTANCE0); 

でクリップ距離を有効にしてから、私は周りを変更しようとしたこの

gl_ClipDistance[0] = -1; 

のように頂点シェーダでそれを使用しよう - 1の値だけど、私が何をしても何も起こらない。それを適切に有効にするためにもっと必要なことはありますか?

答えて

4

gl_ClipDistanceアレイには、各頂点について、概念的な「平面」のどちら側にあるかを表す一連の浮動小数点値が含まれています。各配列インデックスは、概念的な「平面」です。頂点は、負側または非負側のいずれかにすることができます。

同じライン/トライアングルの2つの頂点が平面の2つの異なる側にある場合(つまり、1つの頂点が負の値を持ち、もう1つの頂点が負でない場合)、そのプリミティブはその位置でクリップされますその距離は0です。非負側のプリミティブの部分が表示されます。

あなたがする必要があるのは、頂点位置とクリップしたい面との間の距離を表すクリップ距離値を設定することです。標準平面方程式(Ax + By + Cz + D = 0)は、これを処理する方法を提供します。ベクターを想定平面A、B、C、D、(A、B、C)からの点の距離が単位ベクトルであり、単純である:

dot(point, vec3(A, B, C)) + D 

これもpointが同じであると仮定しもちろんA、B、C及びDとスペース

pointは1.0として最後のコンポーネントで、vec4であれば、あなたはちょうどこの行うことができます:planeはそのvec4ある

dot(point, plane); 

をA、B、C、Dを含んでいますあなたのクリップの距離。

gl_ClipDistanceは、それを使用するシェーダステージで明示的なサイズで再宣言する必要があります。 GLSL 3.20+では、gl_ClipDistanceはインターフェイスブロック内に存在するため、再宣言する必要があります。

out gl_PerVertex 
{ 
    vec4 gl_Position; 
    float gl_ClipDistance[1]; 
};