少し丸みを帯びた長方形を作成しようとしています - これらはゲームのプラットフォームになるという考えです - 真っ白な長方形を作成し、黒い長方形で輪郭を描き、角に円を配置します。簡単にするために、私の問題は本質的にこれと同じです: 2 つの重なり合うオブジェクトに対して opengl でブレンド関数を設定する方法
私はステンシル テストを使用してこれに取り組みたいと考えています。調べたところ、ステンシル テストは良い方法だと思われるからです。
プラットフォーム オブジェクトのレンダリング関数は次のようになります。
GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT);
// Setup stencil such that stencil = 0x01 isn't drawn over
GL11.glEnable(GL11.GL_STENCIL_TEST);
GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 0xFF); // Do not draw if stencil byte = 1
GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
// stencil is on (mask is all 1s)
GL11.glStencilMask(0xFF);
inside.render(st);
GL11.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); // Do not draw if stencil byte = 1
left.render(st);
bottom.render(st);
top.render(st);
right.render(st);
GL11.glDisable(GL11.GL_STENCIL_TEST);
内部、左、下、上、および右はすべて、私自身の Polygon クラスのオブジェクトであり、基本的には特定のポリゴンの三角形を描画するだけです (実際、現在は、私が気付いたばかりの四角形しか描画できません... しかし、脱線します)
私が理解している限り、これが私のプログラムの動作方法です。
- ステンシル テストがオンになり、glStencilFunc と glStencilOp への最初の呼び出しで、ステンシル バッファーの領域も 1 に変更されます。
- プラットフォームの内側の長方形が描画されます。この領域は、ステンシル バッファー上ですべて 1 になるはずです。
- glStencilFunc を呼び出すと、ステンシル値が 1 の領域を描画できないようになりました
- プラットフォームの境界が描画されます。技術的には、これらの四角形は境界線の幅の半分まで内側の四角形と重なっていますが、内側の四角形はステンシル バッファー上ですべて 1 であるため、そこには何も描画されません。
- 最終的に、角に円をレンダリングします。(境界線を描画すると、ステンシル バッファー内のこれらの領域もすべて 1 に変更される必要があるのはそのためです)。
だから、私は自分の研究をしたような気がしますが、実際にはうまくいきません. ステンシルを機能させるために欠落している可能性のある主要な OpenGL 機能は 3 つありますか?