问题标签 [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 回答
296 浏览

opengl-es - OpenGL ES中AR叠加效果的自定义绘制顺序(10)

我正在开发一个增强现实应用程序,需要对三种不同几何图形的渲染进行排序。

级别 1
背景几何。这是一组代表基本架构的三角形。墙壁等

2 级
照片平面。作为纹理放置在空间平面上的建筑照片。该平面在几何上位于 1 级前面(从虚拟相机中看到)

3 级
动态几何。这些是诸如盒子之类的基元,用于增强场景。它们在几何上落后于 Level 2,因为它们正确地放置在 Level 1 的坐标系内

期望的效果:
a) 我希望 Level_2 始终绘制在 Level_1 的前面 这是通过将图像平面放置在更靠近相机的位置来自动实现的。

b) 我希望 Level_3 被 Level_1 正确遮挡,从而隐藏动态框的一部分,如果它部分放置在 Level_1 的墙后面。这也会自动发生在普通管道中。深度测试等

c) 我希望 Level_3 的所有片段/像素都绘制在 Level_2 之上,即使它们实际上在它后面。效果应该使对象看起来好像它们被照片的某些部分遮挡了。

我知道这是可能的,因为我在 X3Dom 中有一个应用程序(它呈现给 webgl),它可以通过“sortkey”属性实现这种效果。但我无法在纯 OpenGL 中重新创建相同的效果。我认为这应该是对 Stencilbuffer 或 Z-Buffer 技巧的简单使用,但我没有让它工作。我如何给 Level_3 几何体一个“总是通过”,以便它被绘制在其他所有东西之上,但也正确地被 Level_1 遮挡?或者我如何让 Level_2 只隐藏 Level_1 而不是 Level_3,即使它在两者前面?

基本上:
1) Level_2 隐藏 Level_1
2) Level_1 和 Level_3 相互遮挡
3) Level_3 的可见部分(相对于 Level_1)不被 Level_2 遮挡

有什么帮助吗?

谢谢!

0 投票
1 回答
116 浏览

ios - 简单的 OpenGL ES2.0 模板没有透明度

我正在尝试在 OpenGL 中制作模板蒙版。我一直在关注这个来源的模型(http://open.gl/depthstencils,更具体地说, http: //open.gl/content/code/c5_reflection.txt),据我所知,我有正确地遵循了这个例子。我的代码是绘制一个方形模板,然后在其上绘制另一个方形。我希望只看到第二个旋转绿色正方形中与第一个覆盖相同空间的部分。我实际看到的是两个重叠的正方形,一个旋转没有透明度。与示例的一个显着区别是我没有使用纹理。那是问题吗?我认为这将是一个更简单的例子。

我对 ES2.0 还很陌生,所以如果我在做一些明显愚蠢的事情,请告诉我。

初始化:

绘制循环:

编辑:以下着色器内容与我遇到的问题无关。模板不会在着色器中进行。

顶点着色器:

片段着色器:

0 投票
1 回答
2181 浏览

javascript - WebGL 模板缓冲区仅在 Firefox 中有效

我在 WebGL 中有一个模板缓冲区的半工作用法。这在 Firefox 中运行良好,但在 Chrome(和 Internet Explorer 中也是如此)中失败。应用程序的其余部分继续运行而没有错误,只是忽略了模板。

左:Firefox,右:Chrome

在这里,Firefox 正确地创建了模板,因此绿色矩形被渲染为带有孔。这是一个 jsFiddle 演示:http: //jsfiddle.net/XH9eC/3/

我打开模板模式并关闭颜色蒙版:

然后我在屏幕中间渲染正方形

然后我更改模板模式并打开颜色:

最后我渲染绿色背景。

如果重要的话,这是我用来渲染背景和方形模板的代码(我只是使用不同的顶点):

我在其他代码中遇到了这个问题,但尚未修复。我已经看到了 Chrome 中使用的模板缓冲区的其他示例。

0 投票
1 回答
707 浏览

opengl - 模板缓冲区似乎无法正常工作

我正在编写一个使用模板缓冲区的 SDL2/现代 OpenGL 应用程序。我在渲染器中编写了以下代码:

上面代码的目标是只绘制适合小矩形的大矩形部分。不幸的是,当我运行代码时会发生相反的情况,它会渲染一个带有小矩形大小的洞的大矩形。

我尝试了更多的模板功能,但它们的结果都是一样的,这似乎应该可以工作。那么,有没有人有任何想法或可以告诉我哪里出错了?

我显然没有在我的帖子中嵌入图片的声誉,但是:

预期结果: http: //i.imgur.com/RpbHzCV.jpg 实际结果:http: //i.imgur.com/Z5qDqHk.jpg

0 投票
1 回答
2471 浏览

javascript - 如何使用模板在 webgl 中创建 2d 剪贴蒙版?

我一直在研究一种创建与此类似的剪贴蒙版的方法(在 SVG 中完成)。

根据我的发现,我选择通过模板来实现这一目标。然而,我的实现是非常不正确的。我不完全确定如何工作gl.stencilOpgl.stencilFunc因为似乎我需要渲染片段来掩盖我的主要内容两次。一次在我渲染主要内容之前,一次在使用不同的参数之后。

这是工作测试:https ://dl.dropboxusercontent.com/u/1595444/experiments/two.js/issues/issue-56/stencil-buffer/test/clip.html

在此处输入图像描述

此测试的相关片段/部分可以在以下位置../src/renderers/webgl.js找到L67

模拟 webgl 模板以像 svg 示例一样工作的指导将不胜感激。

0 投票
1 回答
504 浏览

webgl - 深入考虑 Stencil

我正在使用正交投影来绘制我的对象。每个对象项都被添加到不同的缓冲区并在几个周期中被绘制。假设每个对象都有一个轮廓正方形并填充正方形(以不同的颜色)。所以我先画所有的填充物,然后画轮廓。

我正在使用深度缓冲区来确保轮廓不会超过所有填充,如图所示在此处输入图像描述

现在我面临一个问题,即每个对象上都包含另一个绘图项目(例如文本 - 点),它可能比这个正方形更长。所以我使用模板缓冲区在正方形上切割这个额外的绘图。虽然,这样做时没有考虑深度缓冲区。这意味着可以在另一个正方形上绘制一个文本项。如下图所示。在此处输入图像描述

有没有办法让它发生?

0 投票
1 回答
502 浏览

libgdx - libgdx 贴花未绘制到模板缓冲区中

我正在 libgdx 引擎中开发 3d 应用程序。

我刚刚发现 decalBatch 没有绘制到模板缓冲区中。我想为 3d 世界制作模板面具,但它根本不起作用。

这是适用于精灵批处理的代码,但不适用于贴花批处理。请帮忙!

编辑:

我发现应该清除深度缓冲区,启用和禁用 DepthMask,但我无法让它工作。

0 投票
1 回答
1393 浏览

libgdx - libgdx open gles 2.0 模板 alpha 遮罩

我正在寻找一种解决方案,用 open gles 2.0 在 libgdx 中使用模板缓冲区实现 alpha 屏蔽。

我已经设法使用模板缓冲区和着色器实现简单的 alpha 遮罩,如果片段的 alpha 通道大于某个指定值,它就会被丢弃。这很好用。

问题是当我想使用一些渐变图像蒙版或绑定 png 蒙版时,我没有得到我想要的(我得到没有 alpha 通道的“填充”矩形蒙版),而是我想要平滑淡出蒙版。

我知道问题是在模板缓冲区中只有 0 和 1,但我想写入模板一些其他值,这些值表示在片段着色器中传递的片段的实际 alpha 值,并以某种方式使用来自模板的值做一些混合。我希望我已经解释了我想要得到的东西,如果可能的话。

我最近开始玩OpenGL ES,所以我还是有一些误解。

我的问题是:如何设置和模板缓冲区来存储除 0 和 1 以外的值,以及如何在以后使用这些值进行 alpha 屏蔽?

提前Tnx。

这是目前我的模板设置:

0 投票
1 回答
420 浏览

java - opengl 模板似乎没有效果

我正在尝试通过创建一个纯白色矩形,用黑色矩形勾勒它的轮廓,并在角落放置圆形,来创建略微圆角的矩形 - 想法是这些将成为游戏中的平台。为简单起见,我的问题与此基本相同:How to set blend function on opengl for two重叠对象

我想使用模板测试来解决这个问题,因为我已经查过了,这似乎是一个很好的方法。

这是平台对象的渲染函数的样子:

inside、left、bottom、top 和 right 都是我自己的 Polygon 类的对象,它基本上只是为给定的多边形绘制三角形(实际上,现在它只能绘制我刚刚意识到的矩形......但我跑题了)

据我了解,这就是我的程序应该如何工作:

  1. 打开模板测试,然后我第一次调用 glStencilFunc 和 glStencilOp 使绘制的任何内容也将模板缓冲区上的该区域更改为 1。
  2. 绘制平台的内部矩形。这个区域现在应该在模板缓冲区上全为 1。
  3. 现在调用 glStencilFunc 可以防止在模板值为 1 的区域上绘图
  4. 绘制了平台的边界。从技术上讲,这些矩形与内部矩形重叠到边框宽度的一半,但由于内部矩形在模板缓冲区上全为 1,因此不应在此处绘制任何内容。
  5. 最终,我将在角落渲染圆圈。(这就是为什么绘制边界线也应该将这些区域更改为模板缓冲区中的所有 1)。

所以,我觉得我已经完成了我的研究,但它真的没有用。为了使模板工作,我可能会缺少三个主要的 OpenGL 功能吗?

0 投票
2 回答
538 浏览

opengl - 仅使用模板测试的遮挡查询

如果事先知道障碍物集严格位于相机和要测试的对象之间,如果我完全禁用深度测试,遮挡查询是否仍然有效?这是一种提高性能的尝试,因为从逻辑上讲,如果没有遮挡物位于被遮挡物后面,我不需要复杂的 z 测试。

我正在使用以下命令来初始化颜色/深度/模板缓冲区: