Articles of 深度缓冲

在Unity中进行深度写入和深度testing

场景 :几个对象(o1,o2,..,on)必须使用z test禁用来渲染,但是z值必须写入深度缓冲区。 在另一个通道中,考虑到启用ztesting并考虑先前通过的先前值,需要渲染一些其他对象(t1,t2,…,tm)。 有没有可能通过Unity的材料脚本实现这一点? 我们的目标是支持一个自定义的渲染透明对象(场景描述中的o1,..,on)以及遮罩对象(t1,…,tm)。 我尝试使用这里提到的function,但结果是不正确的,即如果Z值完全被丢弃在通行证之间。 任何人都可以共享这个场景的代码存根?

Unity3D精灵VS网格四边形 – 深度,混合,阴影

我对团结是新的,但对游戏开发并不陌生。 在我的OpenGL ES 2.0(移动)游戏中,我创建了一个包含所有“精灵”的顶点数组,并将其填充到VBO中。 然后按照我需要的方式绘制它们,一次一个,回到前面,开始和closures深度testing和混合,以便构建我的场景。 可能不是超高效的(也许是批量绘图),但我现在的设备上可以达到60fps。 这个特定的场景有一个“纸张”的背景,写在纸上(相同的Z深度),然后在上面的3d对象。 三维物体将阴影投射到纸上。 (如有必要,我可以发布截图。) 为了完成这个任务,我渲染了任何投射阴影的对象的阴影贴图。 然后在纸上用阴影着色器渲染我的场景,而不是在纸上的东西上,然后再回到上面浮动或坐在纸上的3d物体。 现在我正在切换到Unity3D并移植这个工作的游戏。 我有两个问题,我不明白。 作为一个团结的新手,我带入了我的精灵表,并将它们设置为“高级”,但是作为精灵并且使用精灵编辑器进行切片。 但是Sprite渲染器没有用于投射或接收阴影的checkbox。 精灵只用于没有阴影和照明的2D游戏吗? 我必须切换到所有网格四边形,并使用网格渲染器,并手动处理我所有的“精灵”? 在统一论文和所有在同一个Z上的论文中绘制的东西,我有深入的问题。 在我的OpenGL版本中,我做了glDisable(GL_DEPTH_TEST); 并启用混合,绘制“墨水”的东西,然后重新启用深度,并绘制其余的3D场景。 在统一,我不知道如何closures深度或混合工作。 由于墨水必须在纸张上画出来,因此我无法使用不同的相机。

用解锁的D3DFORMAT抓取深度缓冲区

我目前在一个mod框架(Multitheft Auto)上掏腰包,试图读取D3DFMT_D24S8(DirectX9)中的深度缓冲区。 如果将格式更改为D3DFMT_D32F_LOCKABLE,然后lockingrectange,则可以读取它,但会导致渲染模糊,如下所示: 我目前开放hacky方法,如find指向缓冲区的指针,并读取深度没有正确locking和/或使用CUDA。 任何意见将非常感激。 谢谢!

如何使用Monogame和HLSL写入16位深度缓冲区?

我正在研究阴影映射。 部分实现涉及以建议的16位深度将3D模型绘制到深度缓冲区。 为此,我首先创建一个渲染目标如下: new RenderTarget2D(graphicsDevice, width, height, false, SurfaceFormat.HalfSingle, DepthFormat.Depth16) 我的HLSL着色器如下所示。 #define VShaderModel vs_4_0_level_9_1 #define PShaderModel ps_4_0_level_9_1 matrix World; matrix LightProjection; struct MapVOutput { float4 Position : SV_Position; float Depth : Depth; }; MapVOutput MapVShader(in float4 position : SV_Position) { MapVOutput output; output.Position = mul(position, mul(World, LightProjection)); output.Depth = output.Position; return output; } float MapPShader(MapVOutput […]

如何将Depth打印到Texture2D中,然后在DirectX11着色器的下一个通道中读取它

我正在编程DirectX 11(SharpDX)中的双通效果。 它应该在第一遍中将深度写入纹理,然后使用该纹理来提取像素着色器中第二个纹理的数据。 我得到的是一个白色的屏幕,只有界面,我不知道为什么没有打印。 可能是什么问题呢? 我会说我应该从深度纹理至less得到一些东西。 这是我如何设置深度纹理值: this.depthBuffer = new Texture2D(device, new Texture2DDescription() { Format = Format.R32_Typeless, ArraySize = 1, MipLevels = 1, Width = (int)host.ActualWidth, Height = (int)host.ActualHeight, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.DepthStencil | BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.None, }); this.depthBufferShaderResourceView = new ShaderResourceView(this.device, this.depthBuffer, new […]

改变视口的maxDepth

每当我将viewport的maxDepth从1.0更改为maxDepth (仅用于踢)时,屏幕上的所有内容都将消失。 这是为什么? 是否还有其他地方需要考虑深度变化,即光栅器? PS:我尝试了2.0和3.0这样的值,但仍然没有任何结果。 此外,这是否意味着projectionMatrix限制我的Z值在0和1.0之间,如果viewport#maxDepth = 1.0 ?

剪辑空间位置的Z值始终为1.0

我在屏幕上向z方向渲染大量四边形(20 x 2000)。 我想在最终的渲染目标中获得深度值。 但是看起来z总是1.0f。 我用OpenGLdebugging器检查了结果。 有什么建议? 顶点着色器: #version 410 layout(row_major) uniform UView { mat4 m_View; mat4 m_Projection; }; layout(row_major) uniform UModelMatrix { mat4 m_ModelMatrix; }; layout(location=0) in vec2 VertexPosition; out vec3 PSVSPosition; void main(void) { vec4 VSPosition = m_View * m_ModelMatrix * vec4(VertexPosition.xy, 0.0f, 1.0f); PSVSPosition = VSPosition.xyz; gl_Position = m_Projection * VSPosition; } […]

OpenGL:深度和文字渲染的奇怪之处

TL; DR我一如既往地用M,V,Pmatrix来渲染场景。 比我没有任何matrix渲染的东西(在这种情况下 – 文本),并使用单独的着色器对坐标与Z = -1。 不知何故,它比Z = 0.9坐标上的东西更接近相机。 我不明白为什么。 这是我无法弄清楚的。 考虑用于文本渲染的顶点着色器: #version 330 core layout(location = 0) in vec2 vertexPos; layout(location = 1) in vec2 vertexUV; out vec2 fragmentUV; void main() { fragmentUV = vertexUV; gl_Position.x = vertexPos.x*2 – 1; gl_Position.y = vertexPos.y*2 – 1; gl_Position.z = -1.0; gl_Position.w = 1.0; } 当Z […]

如何在HLSL中采样深度/模板纹理?

我在Direct3D 9的阴影映射。我试图避免渲染深度到32位渲染目标。 所以,我创建了一个深度/模板纹理(一个纹理w /用法Depth / Stencil)。 当我渲染时,我这样做: //device IDirect3DDevice9 *pd3dDevice = GetDevice(); // set an rt the same size as the depth/stencil texture(needs attention…this render target will not be rendered to) pd3dDevice->SetRenderTarget(0, GetShadowMapRT()); // set the shadow map depth/stencil texture surface pd3dDevice->SetDepthStencilSurface(GetShadowMapDSSurface()); pd3dDevice.SetStreamSource(0, GDEOctree.Geometry, Constants.OctreeVertexSize * GDEOctree.StaticGeometryVertexCount, 12); // set vertex format pd3dDevice.VertexFormat = SlimDX.Direct3D9.VertexFormat.Position; […]

Unity免费逆深度面具?

如何创建一个逆深度掩模? 在这种情况下,我将深度遮罩称为附加到通过当前摄像机层“捅出一个洞”的网格的着色器,以便让您通过使用ColorMask 0来查看相机渲染层。 我想要的是,网格来确定什么是不切出来的,没有通过网格看不到的东西被切除。