2017-07-17 83 views
3

在OpenGL中獲取重疊對象的Alpha蒙版的最佳方式是什麼?在下面的第一張圖中,我有三個網格與橢圓體重疊,深度測試已啓用。我的目標是獲得與第二張圖像相似的結果,其中白色代表阿爾法。以下是我正在使用的深度測試標誌。OpenGL中重疊對象的Alpha蒙版

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))。

如果你得到這個面具,你必須紋理綁定到模板緩存紋理:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | 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); 

圖紙,你必須結合並清除幀緩衝區前

繪製紋理後,depthAndStencilMap包含紅色通道中的深度緩衝區以及「藍色」通道中的模板緩衝區,即模板緩衝區。 請注意,場景被繪製到幀緩衝區,而不是進一步到視口。

1

「最好」 是一個四個字母的單詞;)

你既可以

  1. 使用模板緩存
    • 清除爲0/false爲「不是你的格架」
    • 模板在1 /真正的「是你的格架」
  2. 畫第二遍
    • 只包含的對象你想在面具
    • 沒有清除深度緩存
    • 使用深度==測試
    • 使用不同的片段着色器「是你的格架」