【问题标题】:Alpha mask of overlapping objects in OpenGLOpenGL中重叠对象的Alpha蒙版
【发布时间】:2017-07-17 21:44:19
【问题描述】:

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

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

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    在绘制红色、黄色和蓝色网格之前,您应该启用模板测试并设置模板操作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 通道中的深度缓冲区和“蓝色”通道中的模板缓冲区,即您的蒙版。 请注意,场景被绘制到帧缓冲区,而不是进一步绘制到视口。

    【讨论】:

      【解决方案2】:

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

      你也可以

      1. 使用模板缓冲区
        • 将“不是你的网格”清除为 0/false
        • stencil in 1/true for "is your-grids"
      2. 绘制第二遍
        • 只在蒙版中包含您想要的对象
        • 不要清除深度缓冲区
        • 使用深度 == 测试
        • 为“is your-grids”使用不同的片段着色器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多