问题标签 [stencil-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2985 浏览

java - 使用半透明纹理来“掩盖”一部分背景

我正在尝试创建一个“雾中的洞”效果。我有一个背景网格图像,重叠在上面我有一个“雾”纹理,用于显示某些区域不在视图中。我正在尝试从“雾”中切出一大块,以显示当前可见的区域。我试图“掩盖”屏幕上的一部分雾。

我制作了一些图片来帮助解释我所追求的:
背景:

BG

“蒙版图像”(完全透明必须在内部而不是外缘,因为我将使用它):

面具

雾(抱歉,很难看到......大部分是透明的):

多雾路段

我想要的最终产品:

完成品

我试过了:

  • Stencil-Buffer:除了一个事实外,我完全可以正常工作......我无法弄清楚如何保留“蒙版”图像的褪色透明度。
  • glBlendFunc:我尝试了许多不同版本的参数和许多其他方法(glColorMask、glBlendEquation、glBlendFuncSeparate)我首先使用了我在这个网站上找到的一些参数:here。我使用了“glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);” 因为这似乎是我一直在寻找的但是......这就是最终发生的结果:(很难说这里发生了什么,但是......背景中有雾覆盖网格。虽然,当它应该是雾中的透明部分时,面具只是最终成为一个完全不透明的黑色斑点。
    glBlendFunc 的结果

之前的一些代码:

(我会发布更多代码,但在我尝试了很多东西之后,我开始删除一些旧代码,因为它变得非常混乱(我在块评论中“支持它们”))

0 投票
3 回答
3885 浏览

opengl-es - 使用 OpenGL ES 2.0 进行模板制作

我正在尝试找出一种方法来切出背景纹理的某个区域,以便某个自定义图案不会在该背景的屏幕上呈现。例如: 在此处输入图像描述

这个正方形可以是任何图案。我正在使用 Frame Buffer Object 和 Stencil Buffer 来实现这种效果。这是代码:

然而,这根本不起作用。我应该如何使用 Stencil Buffers 来做到这一点?我在理解 glStencilFunc 和 glStencilOp 时也遇到了一些困难。如果有人能对这两个有所了解,那将非常有帮助。

更新:我也尝试过使用 glColorMask 制作类似的东西。这是代码:

这段代码产生了这个: 在此处输入图像描述 而不是这样的东西:(忽略窗口大小和色调) 在此处输入图像描述

注意:我使用的是 libgdx 库。

0 投票
1 回答
5638 浏览

ios - 在 iOS 中使用模板缓冲区

我尝试使用“模板缓冲区”从纹理显示我的渲染的一部分,但我的渲染显示时没有任何遮罩效果。

它适用于 2D iOS 项目,使用 OpenGL ES 2.0 这是我代码的相关部分:

任何帮助将不胜感激 !

(像往常一样,法国开发者,对不起我的英语!)

精度:“_maskTexture”是一张黑白图片。


解决方案 :


我最终用rotoglubtim的指示解决了我的问题。谢谢你俩。

1/ 模板缓冲区未正确创建。它应该像这样初始化:

这是我的渲染不受蒙版影响的主要原因。

2/ 为了能够使用纹理作为遮罩,我用 Alpha 通道替换了黑色,并在我的渲染中启用了混合。

我的最终渲染代码如下所示:

0 投票
1 回答
318 浏览

opengl - Opengl中的模板缓冲区

OpenGL 红皮书中的模板测试说:

仅当有模板缓冲区时才会进行模板测试。

我怎样才能知道我的 OpenGL / 显卡实现中是否有模板缓冲区?

0 投票
1 回答
1177 浏览

ios - 无法让 Stencil Buffer 在 iOS 4+ 中工作(5.0 工作正常)。[OpenGL ES 2.0]

所以我试图在 iOS 中使用模板缓冲区来进行屏蔽/剪辑。你们知道为什么这段代码可能不起作用吗?这就是我与 Stencils 相关的所有内容。在 iOS 4 上,我得到一个黑屏。在 iOS 5 上,我得到了我所期望的。我在模具中绘制的图像的透明区域是稍后要绘制的唯一区域。

代码如下。

这是我设置 frameBuffer、深度和模板的地方。在 iOS 中,深度和模板是结合在一起的。

这就是我设置和绘制模板的方式。(下面的着色器代码。)

这是我使用模板的地方。

最后是我的片段着色器。

0 投票
1 回答
242 浏览

opengl - opengl:为什么当我站在阴影中时阴影会消失?

如果我不站在阴影中,阴影效果看起来很完美。但是当我在阴影中时,阴影消失了。我不知道为什么?

这是我实现阴影效果的代码。

和类 SECTOR 是这样的:

0 投票
1 回答
1617 浏览

opengl - 如何在opengl中实现z-fail算法?

我按照 NeHe 导师第 27 课告诉我的代码编写代码,但它是 z-pass 算法。当我在阴影中时,阴影消失了。有人告诉我,我可以使用 z-fail 算法来解决这个问题。所以我花了两天时间研究z-fail算法。最后,我想不通。我的程序从来没有像我想的那样运行。

wiki 列出的 z-fail 算法:

深度失败 大约在 2000 年,一些人发现通过反转深度可以使海德曼的方法适用于所有相机位置。与其计算物体表面前面的阴影表面,不如计算它后面的表面同样容易,最终结果相同。这解决了眼睛在阴影中的问题,因为眼睛和物体之间的阴影体积不计算在内,但引入了阴影体积后端必须加盖的条件,否则阴影最终会丢失体积指向的地方倒退到无穷大。

  1. 禁用对深度和颜色缓冲区的写入。

  2. 使用正面剔除。

  3. 将模板操作设置为在深度失败时递增(仅计算对象后面的阴影)。

  4. 渲染阴影体积。

  5. 使用背面剔除。

  6. 将模板操作设置为在深度失败时递减。

  7. 渲染阴影体积。

我认为的主要问题是深度测试。在第3步和第6步,模板操作基于深度失败。虽然它可以显示阴影,但它可能会在它之前的物体上产生阴影(即:深度缓冲区值小于它的物体)。所以所有的阴影效果看起来很乱。

而在z-pass算法中,stencil操作是基于depth pass的,也就是说它不仅可以显示出阴影,而且只在后面的物体上产生阴影,符合眼睛系统。

那么如何解决这个问题以使我的深度失败算法在正确的物体上显示出阴影。

这是我的 z-fail 算法代码(可能在某个地方,请帮我找出来,阴影效果很糟糕)

VECTOR 类是这样的:

SECTOR 类和其他类是这样的:

我的 main.cpp 中的 DrawGLScene 函数是这样的:

由于我的声望低于 10,所以我无法捕捉阴影效果来向您展示它看起来有多糟糕!请帮助我,我会感谢你的关注和时间!!!

感谢 Najzero 给了我 5 声望,现在我可以截屏显示效果。我将在后面附加详细说明。

z-pass算法效果:当我不在效果中时,没关系!(橙色的锅代表光) 在此处输入图像描述

但是当我在 wall_shadow 中时,就不行了!wall_shadow 不见了,虽然brick_shadow 还在那里。

在此处输入图像描述

所以我需要z-fail算法来解决这个问题。但是我的代码实现的最后一个效果是这样 在此处输入图像描述 的:勾号代表阴影效果是正确的,叉号代表阴影不应该出现在物体上。

另一个截图, 在此处输入图像描述

0 投票
1 回答
1209 浏览

java - Libgdx SpriteBatch 是否绘制到 StencilBuffer?

我正在使用带有 OpenGL ES 1.0 的 libgdx,我想知道 SpriteBatch 是否可以写入/绘制到模板缓冲区。我一直在尝试写入它,但我根本没有得到任何结果,我没有使用模板缓冲区的经验,但我已经阅读了很多,所以如果我在接下来的任何事情中错了,请纠正我。基本上我想要做的是将带有 SpriteBatch 的纹理绘制到模板缓冲区,所以当我绘制其他东西时(禁用模板缓冲区)它只会在模板缓冲区等于 1 的区域上绘制。

这是我想要的结果:如果我在模板缓冲区中绘制一个星形纹理,然后在颜色缓冲区中绘制一个红色纹理,我希望红色纹理忽略模板缓冲区中星形所在的像素。

到目前为止,这是我的代码:

0 投票
1 回答
1911 浏览

c++ - 深度模板不起作用 - DirectX 10 C++

我有一个 DirectX10 + C++ 问题。

基本上我们处于渲染的早期阶段,出于某种原因,我们的深度模板似乎无法理解我们的模型。基本上,这是我们正在做的一切:

  1. 加载着色器、模型和纹理
  2. 初始化 DirectX

模型、着色器和纹理都加载并正常工作,但是(如下面的屏幕截图所示),深度模板显然没有完成它的工作,并且着色器被用在了错误的地方。我还包括了我们的初始化方法,以防您需要它来解决。我们相信我们已经尝试了几乎所有东西,但是知道我们的运气我们可能错过了 1 行重要代码 ^.^

我们还看到其他人也有同样的问题,但他们的修复没有奏效(他们的问题是他们将近剪裁平面设置为 0.0,但我们的不是 0.0,所以这不是问题)

提前致谢!

问题截图

0 投票
1 回答
2426 浏览

macos - 将模板缓冲区可视化为纹理

我正在尝试将模板缓冲区放入纹理中,以便在延迟渲染器中使用。

我正在使用其他颜色和深度附件,glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[color1], 0);结果是正确的。 没有模板缓冲区的正确渲染

但是,当我尝试将我的模板缓冲区附加到纹理时, glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT ,GL_TEXTURE_2D, textures[stencil], 0);我得到一个乱码的结果,就好像 FBO 没有清除它的缓冲区一样。

不正确、乱码的渲染

我不知道问题是什么。我怀疑这是设置模板纹理的问题......

我的设置中没有任何错误代码,所以我不知道问题出在哪里。

编辑:也许我没有正确地做到这一点。如果有人知道如何将模板缓冲区写入纹理,我真的不在乎我是否编写不同的 cod。我只需要一个有效的方法。