gl_PositionのZbufferルール
質問
重要な場合に備えて、openglの設定は次のとおりです。 ジェネラコディセタグプレ
しばらくの間、クリッピングプレーンはgl_Position.zが-1から1の外側にあるものすべてに適用されると思いました。 しかし、シェーダーでgl_Position.zを一定の数に強制した場合でも: ジェネラコディセタグプレ
gl_Position.wに基づく正しいzバッファリングとクリッピングがまだあります!では、ルールは何ですか?
解決
gl_Positionの値は、OpenGLが「クリップスペース」と呼ぶものにあります。これは、
「ルールとは」とはどういう意味か正確にはわかりません。クリップスペースgl_Positionは、等質空間のビュー領域に対してクリップされます。したがって、それらは各頂点の[-W、+ W]領域にクリップされます。射影等質空間でそれを想像するのは難しいですが、数学はうまくいくので、それは問題ではありません。
その後、クリップされた頂点は正規化されたデバイス座標(NDC)空間に変換されます。これは、クリップスペースのXYZをWで除算することを意味します。これらの頂点はすべて[-1、1]の範囲にあります。
そこから、ビューポート変換が行われます。 glViewport
パラメータは、頂点を[-1、1] NDC空間からビューポート領域にスケーリングします。これにより、ポイントがウィンドウスペースに変換されます。それらがラスタライズされるのはウィンドウスペースです。
ウィンドウスペースのXYは、glViewport
によって制御されます。ウィンドウスペースのZ値は、glDepthRange
によって制御されます。デフォルトの深度範囲は、near値0とfar値1です(警告:遠近法マトリックスのnear / far平面には、深度範囲と共通するものはありません。2つを混同しないでください)。したがって、NDC空間のZの[-1、1]をウィンドウ空間の[近く、遠く]にマッピングします。
これらは「ルール」です。
他のヒント
使用する glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL);
深度バッファの値は0〜1(最大深度)です。chooseGL_LEQUALを使用します。これは、深度値が1以下になるため、すべてが画面に描画されることを意味します。
より明確にするために、以下をご覧ください。 http://www.zeuscmd.com/tutorials/opengl/11-Depth.php