2017-07-17 7 views
3

OpenGLでオーバーラップするオブジェクトのアルファマスクを取得する最善の方法は何ですか?下の最初の図では、3つのグリッドが楕円と重なっています。深度テストが有効です。私の目標は、白がアルファを表す2番目の画像に似た結果を得ることです。以下は私が使用している深度テストのフラグです。OpenGLでオーバーラップするオブジェクトのアルファマスク

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glDepthFunc(GL_LEQUAL); 

Main image

Alpha Mask

答えて

2

あなたは、赤、黄、青のグリッドを描画する前に、ステンシルテストを有効にして、このようなあなたのステンシル操作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 シーンがフレームバッファに描画され、それ以上はビューポートに描画されないことに注意してください。

1

"最高" は4文字の単語がある;)

あなたはどちらか

  1. は、ステンシルバッファを使用することができ
    • 明確にそれのための真の「ではない、あなたの-グリッド」
    • ステンシル/ 1ではfalse/0に
    • はオブジェクトだけあなたを含め第二のパスを描く「あなた-グリッドはあります」テスト
    • は「あなたの-グリッドである」ため
    • を異なるフラグメントシェーダを使用する==深さを使用するデプスバッファ
    • をクリアしていないマスク
    • にしたいです