【发布时间】:2017-07-17 21:44:19
【问题描述】:
在 OpenGL 中获取重叠对象的 alpha 蒙版的最佳方法是什么?在下面的第一张图片中,我有三个与椭球重叠的网格,启用了深度测试。我的目标是获得类似于第二张图像的结果,其中白色代表 alpha。以下是我正在使用的深度测试标志。
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
【问题讨论】:
在 OpenGL 中获取重叠对象的 alpha 蒙版的最佳方法是什么?在下面的第一张图片中,我有三个与椭球重叠的网格,启用了深度测试。我的目标是获得类似于第二张图像的结果,其中白色代表 alpha。以下是我正在使用的深度测试标志。
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 )
在绘制纹理后depthAndStencilMap 包含 Red 通道中的深度缓冲区和“蓝色”通道中的模板缓冲区,即您的蒙版。
请注意,场景被绘制到帧缓冲区,而不是进一步绘制到视口。
【讨论】:
“最佳”是一个四个字母的单词;)
你也可以
【讨论】: