OpenGLでオーバーラップするオブジェクトのアルファマスクを取得する最善の方法は何ですか?下の最初の図では、3つのグリッドが楕円と重なっています。深度テストが有効です。私の目標は、白がアルファを表す2番目の画像に似た結果を得ることです。以下は私が使用している深度テストのフラグです。OpenGLでオーバーラップするオブジェクトのアルファマスク
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
OpenGLでオーバーラップするオブジェクトのアルファマスクを取得する最善の方法は何ですか?下の最初の図では、3つのグリッドが楕円と重なっています。深度テストが有効です。私の目標は、白がアルファを表す2番目の画像に似た結果を得ることです。以下は私が使用している深度テストのフラグです。OpenGLでオーバーラップするオブジェクトのアルファマスク
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
あなたは、赤、黄、青のグリッドを描画する前に、ステンシルテストを有効にして、このようなあなたのステンシル操作glStencilOp機能を設定する必要があります
glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glStencilFunc(GL_ALWAYS, 0, 1); // these are also the default parameters
をこれがあるとして、ステンシルバッファが保持されることを意味深度テストが失敗した場合は、深度テストが成功した場合は増分です。 ステンシルバッファを描画した後、マスクが含まれます.0は黒を意味し、> 0はケース内の白を意味します。 描画する前にステンシルバッファをクリアしてください(glClear(GL_STENCIL_BUFFER_BIT)
)。
あなたはステンシルバッファにテクスチャをバインドする必要がテクスチャにこのマスクを取得する必要がある場合:あなたは、フレームバッファをバインドしてクリアする必要があり、描画する前に
GLint with = ...;
GLint height = ...;
GLuint depthAndStencilMap;
glGenTextures(1, &depthAndStencilMap);
glBindTexture(GL_TEXTURE_2D, depthAndStencilMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL, with, height, 0, GL_DEPTH_STENCIL, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
GLuint frameBuffer;
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthAndStencilMap, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
:
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
テクスチャを描画した後に、赤色のチャネルに深度バッファがあり、マスクであるステンシルバッファが 'Blue'チャネルに含まれています。depthAndStencilMap
シーンがフレームバッファに描画され、それ以上はビューポートに描画されないことに注意してください。
"最高" は4文字の単語がある;)
あなたはどちらか