OpenGL

时间:2017-07-17 21:44:19

标签: opengl glsl

在OpenGL中获取重叠对象的alpha蒙版的最佳方法是什么?在下面的第一张图中,我有三个与椭球重叠的网格,启用了深度测试。我的目标是获得类似于第二张图像的结果,其中白色代表alpha。以下是我正在使用的深度测试标记。

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

Main image

Alpha Mask

2 个答案:

答案 0 :(得分: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 )

绘制纹理后,depthAndStencilMap包含红色通道中的深度缓冲区和模板缓冲区,即“蓝色”通道中的模板缓冲区。 请注意,场景被绘制到帧缓冲区而不是视口。

答案 1 :(得分:1)

“best”是一个四个字母的单词;)

你可以

  1. 使用模板缓冲区
    • 将其清除为0 / false以表示“不是你的网格”
    • stencil in 1 / true for“is your-grid”
  2. 画第二遍
    • 仅在面具中包含您想要的对象
    • 不清除深度缓冲区
    • 使用深度==测试
    • 使用不同的片段着色器“is your-grid”