4

重要な場合に備えて、openglの設定は次のとおりです。

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

しばらくの間、クリッピングプレーンは、gl_Position.zが-1から1の外側にあるものすべてに適用されると思いました。しかし、シェーダーでgl_Position.zを一定の数に強制した場合でも、次のようになります。

gl_Position.z = -0.01;

gl_Position.wに基づく正しいzバッファリングとクリッピングがまだあります!それで、ルールは何ですか?

4

2 に答える 2

9

gl_Position の値は、OpenGL が「クリップ スペース」と呼ぶものにあります。同次座標系です。特に、クリップ スペースの XYZ 範囲は [-W, +W] です。したがって、各頂点は独自のクリップ スペースにあります。

「ルールとは何か」という言葉が何を意味するのか正確にはわかりません。クリップ スペース gl_Position は、均質な空間でビュー エリアに対してクリップされます。したがって、それらは各頂点の [-W, +W] 領域にクリップされます。射影同次空間でそれを想像するのは難しいですが、数学はうまくいくので問題ありません。

その後、クリップされた頂点は正規化されたデバイス座標 (NDC) 空間に変換されます。これは、クリップ スペースの XYZ を W で割ることを意味します。これらの頂点はすべて [-1, 1] の範囲にあります。

そこから、ビューポートの変換が行われます。パラメータはglViewport、頂点を [-1, 1] NDC 空間からビューポート領域にスケーリングします。これにより、ポイントがウィンドウ空間に変換されます。それらがラスタライズされるのはウィンドウ空間です。

ウィンドウ スペースの XY は によって制御されglViewportます。ウィンドウ スペースの Z 値は、 によって制御されglDepthRangeます。デフォルトの深度範囲は、near の値が 0 で far の値が 1 です (警告: 遠近法マトリックスの近平面と遠平面には、深度範囲と共通点はありませ。この 2 つを混同しないでください)。したがって、NDC 空間の Z の [-1, 1] をウィンドウ空間の [near, far] にマッピングします。

それが「ルール」です。

于 2011-06-17T18:39:11.340 に答える
0

glClearDepth(1.0f); を使用します。glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL);

深度バッファの値は 0 ~ 1 (最大深度) です。選択した GL_LEQUAL を使用します。これは、深度値が 1 以下であるため、すべてが画面に描画されることを意味します。

詳細については、http: //www.zeuscmd.com/tutorials/opengl/11-Depth.phpを参照してください。

于 2011-06-17T18:53:04.350 に答える