【问题标题】:Opengl ES2 clipping maskOpengl ES2 剪贴蒙版
【发布时间】:2012-07-07 04:57:47
【问题描述】:

我正在寻找一种使用纹理来遮盖整个视口的方法。就我而言,我想使用黑白格子图案(或任何 2 种颜色),并且只显示场景中黑色的部分。

最好的方法是使用剪贴蒙版、片段着色器或 Alpha 混合。我在 SO 上看到了这个帖子:How to create Stencil buffer with texture (Image) in OpenGL-ES 2.0 这似乎与我需要的相似,但我不完全理解如何处理丢弃关键字。它适用于我的情况吗?

【问题讨论】:

    标签: ios opengl-es-2.0 textures clipping


    【解决方案1】:

    假设您有一个黑白方格的格子纹理。首先,您需要设置模板测试来绘制蒙版:

    glEnable(GL_STENCIL_TEST);
    glDisable(GL_DEPTH_TEST);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glDepthMask(GL_FALSE);
    
    glStencilFunc(GL_ALWAYS, 1, -1);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    

    接下来绘制方格纹理。这里的关键步骤(丢弃出现的地方)是您将片段着色器设置为仅绘制棋盘为黑色的片段(如果您愿意,也可以将其翻转为白色)。丢弃关键字会跳过任何不符合条件的像素的渲染。

    //in the fragment shader
    if(sampleColor.r > 0.5) { discard; }
    

    在此渲染步骤之后,您将拥有一个带有棋盘图像的模板缓冲区,其中一半缓冲区的模板值为 0,另一半的模板值为 1。

    然后在模板缓冲区为 == 1 时启用模板测试以通过模板测试正常渲染。

    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glStencilFunc(GL_EQUAL, 1, -1);
    

    【讨论】:

    • 好的,但是如果我希望我的纹理是一个位于屏幕前面的矩形,它不会受到对模型视图矩阵所做的不同转换的影响(旋转平移)。我是否需要第二个始终保持在顶部的视口,然后根据该视口影响模板,从而影响两者?如果这有任何意义...
    • 我认为你不需要对视口做任何事情。如果您不希望您的纹理受到当前 MVP 矩阵的影响,那么不要将它乘以顶点着色器中的矩阵。 @PPR
    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 2011-10-20
    • 2016-07-07
    • 2011-06-27
    • 2017-02-10
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多