我正在寻找一种方法来使用纹理来掩盖我的整个视口。就我而言,我想使用黑白格子图案(或任何 2 种颜色),并且只显示场景中黑色的部分。
最好的方法是使用剪贴蒙版、片段着色器或 Alpha 混合。我在 SO 上看到过这篇文章:How to create Stencil buffer with texture (Image) in OpenGL-ES 2.0这似乎与我需要的相似,但我不完全理解如何处理 discard 关键字。是否适用于我的情况。
我正在寻找一种方法来使用纹理来掩盖我的整个视口。就我而言,我想使用黑白格子图案(或任何 2 种颜色),并且只显示场景中黑色的部分。
最好的方法是使用剪贴蒙版、片段着色器或 Alpha 混合。我在 SO 上看到过这篇文章:How to create Stencil buffer with texture (Image) in OpenGL-ES 2.0这似乎与我需要的相似,但我不完全理解如何处理 discard 关键字。是否适用于我的情况。
假设您有黑白方格的方格纹理。首先,您需要设置模板测试以绘制蒙版:
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);