在OpenGL中获取重叠对象的alpha蒙版的最佳方法是什么?在下面的第一张图中,我有三个与椭球重叠的网格,启用了深度测试。我的目标是获得类似于第二张图像的结果,其中白色代表alpha。以下是我正在使用的深度测试标记。
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
答案 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”是一个四个字母的单词;)
你可以