Articles of 深度缓冲区

在FBO上获取线性深度值并处理小差异

我有一个渲染目标,我有一个颜色和深度附件。 在第二遍中,我需要运行一个宽度取决于深度的导数和值的滤波器。 现在,如果我尝试在第二次访问我之前渲染的纹理时显示深度信息,我只能看到一个灰色斑点: http://imgur.com/UFm5oI6 (不要留意背景,我只显示非背景值) 显示之前我修改它: float depthValue = texture(depthTexture, uv); depthValue =(depthValue – 0.1)/0.9; 因为我的临近剪辑是0.1和远一个是1.0 相反,如果我使用gDEBugger运行程序并查看深度纹理的内容,我所看到的是一个更清晰的结果: View post on imgur.com 为什么我看到的是完全不同的? gDEBugger如何显示值? 我从深度纹理中获取的值是否错误? 我应该不同深度值? 此外,内核的宽度并没有真正改变,因为它是根据深度值和深度导数计算出来的,而这两者实际上是相同的,至less从我所看到的来看。 有没有办法让这些差异更明显? 对不起,如果这是一个愚蠢的问题。 谢谢。

丢弃Z缓冲区中的透明像素

我正在用精灵来构建2D游戏。 我想使用Z缓冲来帮助阴影。 为此,我需要Unity将不透明像素写入 z缓冲区(又名深度缓冲区)。 在Unity中,精灵由多边形构成,它将整个多边形(包括透明像素)写入深度缓冲区。 这是我使用的着色器(在尝试使用此function时添加了一些垃圾) http://pastebin.com/khprCUA0 我努力了 AlphaTest更大0 alphatest:MyAlphaTestVar discard关键字 Cg的clipfunction 我怀疑一个灯光通道可能会写入深度,所以我添加了novertexlights和noambient 我会怀疑AlphaTest防止透明像素对帧或深度缓冲区有任何影响(如这里所建议的那样),但是他们仍然写入深度缓冲区! 以下屏幕截图显示了Z缓冲区中对象的不准确形状。 国王和树已经成为斑点,因为即使他们的透明像素更新在Z缓冲区(绘制使用http://willychyr.com/2013/11/unity-shaders-depth-and-normal-textures/ ): 将它与常规视图中对象的“正确”形状进行比较: 我该如何让Unity 不把透明像素写入z缓冲区? 编辑: Unity 5的帧debugging器是一个奇迹! 原来“深度纹理”实际上是在所有其他几何体之前的一个单独的通道中渲染的。 而且我很难find如何使用RenderType从这个通道中包含/排除某些对象。

使用多视图matrix的OpenGL优化模板绘图

我有一堆在CPU上的视图matrix,每个都有自己的索引。 在渲染场景之前,帧缓冲区中的深度值被设置为片段着色器对应于视图matrix的值。 如何高效地遍历深度缓冲区中的每个像素,并将相应的模板值写入模板缓冲区(这样我可以使用深度缓冲区来渲染场景),同时logging使用哪个视图matrix,以便渲染场景最less的可能次数? 模板值甚至不需要与指标相匹配; 某种dynamic的渲染器系统会更好。

使用网格在地形上绘制网格 – Shader Depth和Z-Buffer

我想要实现的是在地形上渲染一个(巨大的)网格。 为此,我正在使用四边形生成的网格,其中每个图块的顶点Y值与地形相同,以便像地形一样“塑造”这个网格。 我的问题是,这个网格应该总是呈现在地形,保持每个其他对象呈现在这个网格的顶部。 正如你应该猜到的,我是着色器编程的初学者。 所以这里有一些上限: 使用简单的不亮透明着色器 (使用ZTest,ZWrite和Cull值)渲染网格: 正如你所看到的那样,z格斗有问题,当格子总是被画在最上面的时候。 因为地形有很多的“峰”,四边形应该是有很多顶点的平面才能够跟随地形(或者上升很多的网格会使它漂浮在地形)。 将ZTest更改为始终 : 在这里我遇到了这样的问题:山背后的瓦片在不应该的时候仍然被绘制出来,这是因为它忽略了z-sorting,因此也渲染了其他物体。 我已经尝试使用另一个着色器通道首先写入到z缓冲区,以避免在山背后渲染瓦片没有成功。 我想我错过了与地形着色相关的东西,但我不知道它是什么。 任何帮助都感激不尽。

在精灵上使用深度缓冲区

我正在遵循这个指南: http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:tiled_maps 尝试创建也支持多个图层的平铺地图。 该指南说,一种方法是使用深度缓冲区,并说: 1)创建z缓冲区和2D投影; 2)对于平铺地图中的每个图层,设置cc_vertexz属性; 3)启用alphatesting并设置sprite alpha func。 第一个问题是:如果我使用多层的平铺地图,也需要点1和3吗? 前两点我没有问题,但至于第三点,我不知道该怎么做。 我应该CCSprite的子类并重写绘制方法,但问题是,当我创建一个平铺的地图已经有精灵,所以这些实例不属于我创建的子类。 我怎么绕过这个?

从着色器访问深度缓冲区

我读了这个演示文稿,并在第六张幻灯片上发现,不需要使用多个渲染目标,深度可以直接从深度缓冲区中获取。 从哪个版本的DirectX或OpenGL可以使用的function? 怎么做?

即使closures了EarlyZ,XNA DepthBias也会提高性能。 为什么?

我的3D场景由三个主要的多边形组成: 第一个和第二个多边形彼此重叠(具有相同的世界matrix并且使用相同的几何形状),第三个多边形垂直于前两个,并且位于离它们几米的位置。 所有三个多边形都使用向前着色器渲染,使用clip()函数执行alpha截断。 正如我在Radeon的文章中读到的 ,这导致了EarlyZtesting被closures,我的简单的主观testingcertificate了这一点:当第二个多边形的纹理是空的时候,我有大约480 FPS(导致在每个像素中调用剪辑)并且降低到415当它有一个丰富多彩的截面广场(见图片)。 我试图确保Ztesting发生:我试图先绘制第二个多边形,同时将它“上升”到地面上(多边形#2),从而使它靠近相机 – 它什么都不改变。 我也尝试从着色器中删除clip()函数,并按照预期接收FPS提升。 但显然这产生了不正确的结果,因为第二个多边形下面的地面从来没有被绘制过,因为它总是失败了Z检验。 所以我决定尝试使用DepthBias来绘制两个多边形,并且没有深度。 这是MSDN写到的: 设置或检索多边形的深度偏差,这是适用于基元深度的偏差量,以减轻相似深度基元的深度testing问题。 默认值是0。 属性值应用于基元深度的偏差量。 取值范围是0〜16(含)。 当我终于设法使其工作,我惊奇地得到了性能提升。 现在,我甚至设法将FPS应用到第三个多边形! 这是我如何使他们获得最佳performance: GraphicsDevice.RasterizerState = CCWLayer1; DrawSecond(gameTime); GraphicsDevice.RasterizerState = CCWLayer2; DrawThird(gameTime); GraphicsDevice.RasterizerState = CCWLayer3; DrawFirst(gameTime); public RasterizerState CCWLayer1 = new RasterizerState() { CullMode = CullMode.CullCounterClockwiseFace, DepthBias = 0.005f, }; public RasterizerState CCWLayer2 = new RasterizerState() { CullMode = […]

DepthStencilView和alphaBlendState

我用directx11创建了一个2D游戏,我想用深度缓冲区而不是画家的algorithm来绘制小精灵,但是我有一个问题,因为我对directx 3d编程不太好。 我可以创建一个depthstencilview,它可以工作,但看看下面的图像: 深色圆圈不是半圆形,它们使用相同的纹理和相同的网格:四边形。 首先渲染浅红色圆圈(0.5深度),然后深色(1.0f深度)。 第一个的alpha像素订阅深度缓冲区,所以第二个不能正确显示。 我需要aplha像素不订阅深度缓冲区我可以设置深度模具/ alpha混合状态来做到这一点? 对不起,英文不好

像素着色器中的计算深度不好? 我可以通过移动深度计算到顶点着色器来减less填充率吗?

我有一个DX10游戏是填充界限。 我已经意识到的事情之一可能是促成这一点,我计算像素着色器的深度(游戏使用对数深度缓冲区,以获得从1厘米到数百万米远的极端精度)。 我想到在像素着色器中编写深度正在破坏到早期Ztesting的能力。 这可以通过在顶点着色器中输出这个计算出来的深度值来解决吗?

渲染到纹理时如何使用默认帧缓冲区的深度/模板?

渲染到纹理(而不是深度纹理)时,是否可以使用默认的帧缓冲深度缓冲区? 这个想法是继续渲染场景的一部分,但在一个单独的纹理,所以我可以稍后申请一个后处理的效果,而不必承担另一个模板/深度缓冲区的成本。 何可以吗?