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

opengl-es - glColorMask/glDepthMask 与片段着色器

在 OpenGL ES 2.0 中,如果使用 glColorMask/glDepthMask 禁用对颜色缓冲区和深度缓冲区的写入(因为我只想更改模板缓冲区),则片段着色器无法写入任何缓冲区。我可以合理地假设在这种情况下不会执行片段着色器吗?

0 投票
1 回答
379 浏览

opengl - 如何在OpenGL中做“AND”模具?

我渲染了一个场景,我正在做一些只在屏幕的一部分上进行的后期处理。我使用球体来“切割”该区域,但我得到了“完整”球体,而我需要对球体内部的表面进行“与”切割。这有点难以解释,但希望以下两个模型有所帮助。假设场景是蓝色的东西,绿色的球体是模板网格。右图显示了生成的模板。

所以......我该怎么做?目前我做这样的事情:

然而,这会导致模板缓冲区具有完整的球体,而我只想要留在球体内部的表面。

0 投票
1 回答
476 浏览

directx - 由默认创建的深度模板缓冲区引起的问题

我正在从阴影贴图上的 DirectX SDK 示例中学习。这个示例在初始化期间创建了一个模板表面,并说:

这是什么意思?我试图评论创建和操作模板缓冲区的语句,然后我得到了相当不稳定的结果:如果我让窗口更大,阴影效果很好,而当我让窗口更小时,阴影停止移动。有人可以向我解释吗?非常感谢!!!

0 投票
1 回答
660 浏览

opengl - 在 OpenGL 中正确使用 stencil_texturing

我正在尝试实现 OpenGL 的 stencil_texturing 扩展作为概念证明。我的显卡最高支持 GL 4.3,所以我可以使用 stencil_texturing。如果需要更多说明,这里提供的规范是:http ://www.opengl.org/registry/specs/ARB/stencil_texturing.txt 。

所以我测试的目标是将我的颜色缓冲区渲染到第 0 帧中的纹理,然后是第 1 帧中的深度缓冲区,最后是第 2 帧中的模板缓冲区。简单的部分已经完成,我已经渲染了颜色和深度缓冲区纹理美好的。我的问题在于模板缓冲区,我认为问题出在我缺乏对模板缓冲区的理解(很可能就是这种情况)或者是我滥用了 stencil_texturing。我试图在网上找到一些信息,但可用的信息很少。

为了让您了解我在这里渲染的内容是我当前的帧捕获: 颜色缓冲区深度缓冲区模板缓冲区

所以我对模板缓冲区的设想是只模板化中间三角形,所以中间三角形中的所有内容的值都是 1,纹理的每个部分的值都是 0。我不确定渲染时会如何出现但我想模板值为 1 的区域与值为 0 的区域不同。

下面是我的代码。它只是一个测试类,我将其放入为他们制作的框架中。我相信唯一没有定义的是 GLERR() ,它基本上调用 glGetError() 以确保一切正确。

0 投票
1 回答
2951 浏览

opengl - 如何在片段着色器中进行自定义模板测试

在我的项目中,我使用“丢弃”调用来执行自定义模板测试,该测试尝试仅在模板纹理定义的指定区域上绘制东西。这是片段着色器的代码:

此代码有效,但由于“丢弃”调用而出现性能问题。有没有其他方法可以通过 GPU 着色器做到这一点?告诉我怎么做。

0 投票
2 回答
5401 浏览

c++ - 离屏渲染(使用 FBO 和 RenderBuffer)和颜色、深度、模板的像素传输

我必须在 OpenGL 中渲染屏幕外,然后将图像传递给 QImage。另外,为了练习,我想将深度和模板缓冲区也传输到 CPU。

为了在屏幕外绘制,我使用了带有渲染缓冲区的帧缓冲区对象(而不是纹理,因为我不需要纹理)。

使用颜色缓冲区(实际的原始图像)进行像素传输操作。我明白了我的期望。但是深度和模板不起作用..深度的奇怪图像和模板没有任何关系。

首先,简单的部分,我实际绘制的内容:

这里是 FBO 和 3 渲染缓冲区的初始化:

最后,这里有 3 种像素传输方法:

这里是 2 个屏幕截图(颜色和深度,使用模板我得到一个空的 QImage):

在此处输入图像描述

在此处输入图像描述

颜色一正是我正在绘制的(翻转但我认为这是正常的)。深度..我期待一个带有渐变灰色三角形的白色图像..肯定我在图像格式上犯了一些错误(GL_FLOAT?)但我尝试了一些组合,这是最好的结果..紫罗兰色背景,里面有毛刺的颜色..和模板缓冲区..我期待黑色背景中有一个白色三角形轮廓但是..不知道为什么我什么都看不到..

编辑:

好的,永远不要单独使用模板缓冲区,所以我已经重构了一点。

声明 FBO 时:

深度的像素转移:

模板类似,但p_stencil与 rgb 组件一起使用

.. 结果图像是深度和模板的黑色图像

编辑

感谢 Nicolas 的回答,我设法将渲染缓冲区用于深度和模板缓冲区,并提取深度组件以适应QImage::Format_ARGB32以下代码:

.. 模板组件仍然存在一些问题(以下代码不起作用:它会产生故障图像):

0 投票
1 回答
763 浏览

c++ - DirectX - 带有实例化模板卷的延迟着色

我正在使用 DXUT 使用 DirectX9 创建图形应用程序。在我的应用程序中,我想实现延迟着色。这种照明方法要求我为场景中的每个灯光渲染一个模板体积(遮罩)。为了避免单独渲染卷,我想使用 DirectX 的实例化能力。使用顶点着色器 3.0 和像素着色器 3.0,我已经成功地绘制了任何给定模型的多个实例,但是,当我尝试绘制实例化模板卷时,似乎没有数据写入后缓冲区的深度模板表面。

我的延迟着色实现在伪代码中如下所示:

将所有场景几何体(Instanced Geometry Pass)绘制到后备缓冲区:

  • 启用 Z( D3DRS_ZENABLE, TRUE )
  • 启用 ZWrites( D3DRS_ZWRITEENABLE, TRUE )
  • 禁用模板(D3DRS_STENCILENABLE,FALSE)
  • 设置剔除模式(D3DRS_CULLMODE,D3DCULL_CCW)
  • 禁用 ColorWrites( D3DRS_COLORWRITEENABLE, 0 )
  • 禁用 Alphablending(D3DRS_ALPHABLEENDENABLE,FALSE)
  • 渲染场景

获取指向后台缓冲区的指针:

  • IDirect3DDevice9::GetRenderTarget(0, pBackbufferSurface)

设置 3 个渲染目标(COLOR(0)、NORMAL(1)、POSITION(2)):

  • IDirect3DDevice9::SetRenderTarget(0 -> 2, 颜色 -> 位置)

将所有场景几何图形绘制到 3 个渲染目标:

  • 启用 ColorWrites(D3DRS_COLORWRITEENABLE、CW_RED、CW_GREEN、CW_BLUE、CW_ALPHA)
  • 渲染场景

将后台缓冲区重置为设备 RenderTarget 0:

  • IDirect3DDevice9::SetRenderTarget(0, pBackbufferSurface)

将效果纹理( SrcColor )设置为 COLOR 渲染目标

  • ID3DXEffect::SetTexture("g_TextureSrcColor", pRTColor)

渲染全屏四边形并从 COLOR 渲染目标采样(绘制场景)


使用实例化技术模板所有场景灯(这里是实际代码):

这是实例缓冲区顶点声明:

此方法无需实例化即可正常工作...实例化是否会阻止深度模板写入?当我使用 PIX 进行调试时,它表明“像素未通过模板测试”。这是在渲染之前清除后台缓冲区的调用:

在创建设备期间,我修改设置以使用 AutoDepthStencilFormat D3DFMT_D24S8,如下所示:

如果我将 IDirect3DDevice9::Clear() 的模板参数(最后一个参数)更改为 1。模板卷通过了模板测试...这是因为我设置模板操作以将模板值增加 1,如果像素为体积掩码与后缓冲区上的像素相交,并且在该事件中,承认光的像素颜色。这表明存在以下两个问题之一:

  1. 在“实例化几何通道”期间绘制场景(对象)时......后缓冲区不存储绘制对象时的深度(因此模板测试具有“0”值用于比较或
  2. 绘制模板卷(灯)时,后缓冲区不存储绘制卷的深度......

这是由于我的实例化方法吗?是因为着色器版本(vs3、ps3)还是 DX 版本?

0 投票
0 回答
1033 浏览

opengl - OpenGL,延迟着色,点光和模板通道的边界体积,光衰减

目前我正在尝试在我的引擎中实现延迟着色。我主要基于在网络上创建的一个教程(由于链接限制,我没有在此处粘贴链接:))但我也使用其他来源,并且我知道延迟着色的工作原理。我当前的实现基于计算所有灯光类型的全屏四边形上的灯光。为了获得更快的速度,我想将边界球用于带有模板通道的点光,但我有一些问题。

第一个也是最大的一个是当我希望在光通道中渲染球体以仅计算受光影响的像素。当我在模板通道中绘制球体,然后在全屏四边形上计算光时,我认为一切正常(我只有错误的球体大小,但它仅用于测试)

但是当我试图在模板通道中使用的同一个球体上渲染它时,我得到了奇怪的结果,这可能是由于纹理坐标造成的。当我不使用它们时,我的一切都是黑色的。当我使用它们时,我得到了这个

在教程中,我看到人们只渲染仅包含顶点位置的球体,一切正常,所以我不知道出了什么问题。

我还必须对教程中提供的代码进行一些更改

而且我也想知道为什么当我在球外时,这种变化会帮助我解决另一个问题(我相信你知道问题是什么,我不需要解释它)。

我想问你的最后一个问题是,仅基于光功率(即浮点数)计算球体大小和光衰减的最佳公式是什么?

0 投票
2 回答
1672 浏览

opengl - 不透明时设置Opengl Stencil Buffer

我试图配置我的模板缓冲区,以便在启用时,它会在绘制的像素不透明时设置(从而创建光可以碰撞的像素图)。我所做的是:

然后,我使用以下代码进行测试:

但是,有两个问题:

  1. 它似乎并没有忽略透明像素,因为它应该;
  2. 如果一个区域与另一个区域重叠,则它会反转 - 例如,它设置为一个,然后在同一区域中绘制另一个区域,然后再次将其重置为 0。

我不知道为什么会这样。我猜我的面具可能有问题 - 我不确定 OpneGL 在颜色缓冲区中使用了多少像素。此外,根据文档,GL_INCR 应该加到最大值,而不是返回。由于我的模板缓冲区大小是一位,它应该设置为 1,尝试再次增加,失败并保持为 1(而不是重置)。

0 投票
1 回答
2289 浏览

opengl - 早期模板剔除

根据模板测试,我正试图让早期片段剔除工作。我的场景如下:我有一个片段着色器,它做了很多工作,但在渲染场景时只需要在很少的片段上运行。这些片段几乎可以位于屏幕上的任何位置(我无法使用剪刀快速过滤掉这些片段)。

在渲染通道 1 中,我生成了一个具有两个可能值的模板缓冲区。通过 2 的值将具有以下含义:

  • 0:什么都不做
  • 1:可以继续,(例如,进入片段着色器,并渲染)

Pass 2 正确地渲染了场景。模板缓冲区是这样配置的:

现在我运行我的应用程序。所选像素的颜色会根据模板值进行更改,这意味着模板测试工作正常。

然而,我应该会看到早期模板剔除带来的巨大而惊人的性能提升......但没有任何反应。我的猜测是模板测试要么发生在深度测试之后,要么甚至在片段着色器被调用之后。为什么?

nVidia 显然拥有一项关于早期模板剔除的专利: http ://www.freepatentsonline.com/7184040.html 这是立即启用它吗?

我使用的是 nVidia GeForce GTS 450 显卡。早期的模板剔除应该与这张卡一起使用吗?使用最新驱动程序运行 Windows 7。