问题标签 [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 投票
1 回答
715 浏览

opengl - glStencilFunc(GL_NEVER, 0, 0) 仍然呈现?

我在使用模板缓冲区时遇到了问题,它似乎归结为根本不起作用。给定以下代码:

三角形还在画!?我在这里错过了一些微不足道的事情吗?

注意:我没有渲染到帧缓冲区,我正在使用 glStencil...Separate 只是为了确保它与正面\背面无关,我保留了一些对我来说似乎不相关的代码。

0 投票
1 回答
1020 浏览

hlsl - 模板缓冲区测试设置 DirectX9

我有一个函数可以呈现所需颜色的三角形。我正在尝试渲染一个黄色三角形,然后在其上渲染一个红色三角形,并启用模板测试。我使用一个圆圈作为我的模板窗口。我的模板测试方程和操作应该是什么以获得以下输出。仅在 DirectX09 中进行所有渲染。 期望的输出 请指导以下 API 的几个好的和简单的示例......

SetRenderState(D3DRS_STENCILFUNC,
SetRenderState(D3DRS_STENCILREF,
SetRenderState(D3DRS_STENCILMASK,
SetRenderState(D3DRS_STENCILWRITEMASK,
SetRenderState(D3DRS_STENCILZFAIL,
SetRenderState(D3DRS_STENCILFAIL,
SetRenderState(D3DRS_STENCILPASS,

我们如何在 DirectX09 着色器效果文件(vs_3_0 和 ps_3_0)中使用 Stencil 操作?

0 投票
2 回答
6157 浏览

opengl - OpenGL中的反射和深度

我正在尝试在 OpenGL 中创建镜像。我发现的大多数参考资料都建议使用模板缓冲区来定义镜子本身的边界,并结合使用平移和缩放矩阵来进行实际反射。当观察场景时,我设法让它工作,这样镜子前面就没有物体了。然而,当一个物体在镜子前面时,重叠部分不会显示出来,使它看起来好像它在镜子后面。我很有可能误解了模板缓冲区的工作原理,因为这是我第一次尝试使用它,但我也可能在深度或其他方面犯了一些错误。我会很感激任何建议。这是代码。

0 投票
0 回答
538 浏览

opengl - opengl 模板缓冲区多个同时使用

我已经成功地将 OpenGL 的模板缓冲区用于场景中的单个实例。但是,我不确定如何在同一场景的两个不同地方使用它。依次定义两个模板形状会阻止其中任何一个工作,并且我尝试将一个用途嵌套在另一个用途中也不起作用。我已经看到在同一场景中多次使用模板缓冲区的示例,但我无法理解或调整代码。这是我到目前为止能够完成的工作。

程序运行截图

0 投票
2 回答
895 浏览

opengl - OpenGL水反射

我正在尝试将森林中的一堆树木反射到附近的湖中。我按照所有标准步骤使用模板缓冲区绘制反射。但是“水”似乎不允许看到下面的物体。这是我的功能:draw_sea()- 绘制反映的计划drawFigTree(fig_tree)- 绘制下面的树木。问题出在哪里?

0 投票
1 回答
518 浏览

java - OpenGL ES 2.0 中的模板纹理

我一直在尝试在Libgdx项目中进行一些模板制作。到目前为止,我只能模版出多边形(插图后的代码)。

问题:我应该如何在 OpenGL ES 2.0 中模版出非多边形形状?(即我不希望将透明像素绘制到模板缓冲区)

我应该如何在不使用 GL_ALPHA_TEST 的情况下实现这一点(因为 OpenGL ES 2.0 不允许这样做)?

非常感谢任何帮助或指示,并在此先感谢。

编辑:如果您能提供一些代码示例以供理解,那将非常有帮助。

请考虑下图:

在此处输入图像描述

这是渲染代码:

0 投票
0 回答
401 浏览

directx-10 - 深度模板和阴影资源为空

在花了大约 3 天的时间试图让阴影贴图工作后,我在将阴影贴图传递给着色器时遇到了一些麻烦。

首先我初始化深度模板和资源视图,然后我绘制(我相信)到深度模板。我发现的问题是深度模板从来没有与之关联的任何数据。

Pix 在资源视图或深度模板中没有显示任何数据,我无法将深度模板的图像保存到文件中(我来自非阴影深度模板)。我可以调用 DrawSceneShadow() 并将其渲染到渲染目标并得到我想要的。

感谢您提供任何帮助。

初始化

渲染场景

0 投票
1 回答
4462 浏览

objective-c - 使用 GL_STENCIL_TEST 渲染凹多边形

我正在开发一个适用于 Quartz Composer 的自定义几何库,并尝试在插件中绘制一些凹多边形。

我实现了 poly2tri 库,因此用户可以选择是否进行三角测量,但它不适合每帧多边形变换渲染。

我是 OpenGL 的菜鸟,我一直在阅读和测试很多关于模板缓冲区和奇/偶操作的内容,但即使是似乎对其他人有用的代码,也不适用于我。

渲染上下文是 CGLContextObj,我正在使用 NVidia GEForce GT650 开发 MacBook Pro Retina 显示器。我读到所有配置都没有模板缓冲区,但它看起来有时可以工作,尽管不是我想要的那样。

我想知道具有相同配置的人是否正在使用有效的代码并且可以查看我的代码。特别是,我也很好奇请求的通过次数,根据顶点的数量或我猜的“凸面缺陷”......

我的信息来自:

...但仍然不清楚...

这是我的代码(实际上是其中一个,因为我测试了很多配置)和结果图片。实际上,我曾经将实际渲染放在为每个多边形调用的方法中,但我将其重写为非常清晰:


编辑

事实上,我知道我必须绘制每个三角形,以便反转模板缓冲区中的位值。所以我将我的代码重写为:

但它仍然不起作用。这是我的结果以及原始图像和解释的链接。

http://what-when-how.com/opengl-programming-guide/drawing-filled-concave-polygons-using-the-stencil-buffer-opengl-programming/

模板失败

编辑 2:

事实上,Quartz Composer 启用的上下文并没有实现模板缓冲区。使用模板缓冲区直接在 OpenGL 中渲染似乎是不可能的。

0 投票
0 回答
315 浏览

opengl - OpenGL,使用模板计算屏幕外硬阴影

我试图弄清楚是否以及如何计算来自屏幕外多个光源的硬阴影。

序言:场景非常复杂,多达数百万个三角形,多达数百种不同的光源、灯光、材质和深度启用以及最大精度(至少 10kx10k 像素地面分辨率)。阴影只不过是平面投影阴影,也就是说,我通过预乘阴影矩阵(给定光源位置和平面)来渲染对象本身。多个物体,多个光源,但只是一个平面。

因此,实时是不可能的。同样不可能考虑增加模板值,因为我只有一个字节(255 个有用值)并且我可能有超过 255 个光源。

因此我的想法是在屏幕外渲染(纹理或渲染缓冲区图像)。

对于每个光源,我计算我的阴影矩阵并应用它。然后我用特定的模板编号(即 1)渲染我的第一个对象。然后我渲染我的第二个对象。我只需要在模板编号为 1 的地方渲染它,并且我需要将所有其他像素归零,因为我只对硬阴影感兴趣。然后是第三个对象,以此类推。最后,我对第二个光源重复所有过程,依此类推。

可能吗?更好的纹理或渲染缓冲图像?计算出硬阴影后,我需要在 cpu 上将其取回以对其进行分析并将其渲染到场景中的地面上。

理想情况下,我只需要附加到我的 FBO 的模板缓冲区,但他们在这里说:

Stencil 永远不会制作 STENCIL 缓冲区。所有 GPU 和所有驱动程序都不支持独立的模板缓冲区。如果需要模板缓冲区,则需要制作一个 Depth=24,Stencil=8 缓冲区,也称为 D24S8。请在此页面上搜索有关 GL_EXT_packed_depth_stencil 的示例。

这在今天仍然有效吗?

环顾四周,我在这里找到了一种通过在每个对象之间渲染全屏多边形来将所有其他像素归零的方法,但我想知道是否有更有效的方法..?

0 投票
2 回答
2370 浏览

java - 使用 SpriteBatch 时的 LibGDX 模板缓冲区

这是我之前的问题和帖子的延续,请参见此处。感谢我在那里收到的答案,我觉得我能够更接近我的目标,以及进一步学习 OpenGL,但在弄清楚使用模板缓冲区的基础知识后不久,我遇到了一个问题.

似乎当我将精灵绘制到模板缓冲区时,它会绘制整个正方形区域,而不是像我无知地希望的那样仅绘制不完全透明的像素。我隐约明白为什么会这样,但我不确定解决方案在哪里。我已经对模板本身进行了很多试验,并且我修改了 spritebatch 用来丢弃低 alpha 片段的着色器,但我似乎看不到更大的图景。

作为问题的直观示例,我将继续使用我在上一个问题中使用的示例。现在,试图在彼此上画两个圆圈(所以它们完美融合,没有重叠),我得到了这个:

模板测试

所以,基本上,有没有办法让我使用 LibGDX 的 Sprite 和 SpriteBatch 功能在复杂形状上使用模板缓冲区(圆圈仅用作示例),还是我需要寻找替代路线?

编辑 ::