c# – 为什么我需要depthBuffer才能使用RenderTexture?

我认为我不太了解Unity渲染引擎.

我使用RenderTexture生成屏幕截图(我需要稍后管理它):

    screenshotRenderTexture = new RenderTexture(screenshot.width, screenshot.height, depthBufferBits, RenderTextureFormat.Default);
    screenshotRenderTexture.Create();

    RenderTexture currentRenderTexture = RenderTexture.active;
    RenderTexture.active = screenshotRenderTexture;

    Camera[] cams = Camera.allCameras;

    System.Array.Sort(
            cams,
            delegate(Camera cam1, Camera cam2)
            {
                // It's easier than write float to int conversion that won't floor
                // depth deltas under 1 to zero and will correctly work with NaNs
                if (cam1.depth < cam2.depth)
                    return -1;
                else if (cam1.depth > cam2.depth)
                    return 1;
                else return 0;
            }
        );

    foreach(Camera cam in cams)
    {
        cam.targetTexture = screenshotRenderTexture;          
        cam.Render();
        cam.targetTexture = null;
    }

    screenshot.ReadPixels(new Rect(0, 0, textureWidth, textureHeight), 0, 0);
    screenshot.Apply();

    RenderTexture.active = currentRenderTexture;

但是,如果depthBufferBits为0,则渲染会导致所有类型的z缓冲区错误(以错误的顺序呈现的内容).

我理解一般意义上的深度缓冲是什么.但是,我不明白的是 – 如果使用RenderTexture来组合各个摄像机的渲染结果,为什么需要深度缓冲?这个抽象是如何工作的 – 确切地说 – 相机是否自己创建图像然后将其提供给RenderTexture,或者相机使用RenderTexture的深度缓冲区?它似乎是后者,因为我经历的错误(错误顺序的东西都是用相同的相机渲染的,所以问题是在一台相机内部订购东西,而不是在不同相机之间订购东西),但同时时间与C#级别的这些抽象结构的常识相矛盾.

最后 – 我可以以某种方式使用用于正常渲染的默认深度缓冲区吗?因为移动设备上每像素16位非常痛苦.

更新:

这是我试图做的事情:

    screenshotRenderTexture = new RenderTexture(
            screenshot.width,
            screenshot.height,
            0,
            RenderTextureFormat.Default
        );
    screenshotRenderTexture.Create();

    RenderBuffer currentColorBuffer = Graphics.activeColorBuffer;
    Graphics.SetRenderTarget(screenshotRenderTexture.colorBuffer, Graphics.activeDepthBuffer);
    yield return new WaitForEndOfFrame();
    Graphics.SetRenderTarget(currentColorBuffer, Graphics.activeDepthBuffer);

这就是我得到的:

SetRenderTarget can only mix color & depth buffers from RenderTextures. You're trying to set depth buffer from the screen.
UnityEngine.Graphics:SetRenderTarget(RenderBuffer, RenderBuffer)
<ScreenshotTaking>c__Iterator21:MoveNext() (at Assets/Scripts/Managers/ScreenshotManager.cs:126)

为什么它不能混合来自屏幕的深度缓冲区和RenderTexture的颜色缓冲区?

解决方法:

我不太了解Unity,但我知道他们的基础层,如果他们可以映射说D3D9,D3d10和OpenGL,那么他们的抽象必须使用一个共同点.

在这种情况下,D3D10是最受限制的,您不能在不同大小的渲染目标之间共享深度表面.如果您拥有相同大小的屏幕并在整个地方渲染目标,那么您确实可以将唯一的深度缓冲区绑定到不同的渲染目标.

深度缓冲区不是严格必要的,因为您已经观察到可以在没有深度缓冲区的情况下进行渲染,但结果只是按照绘制命令的顺序进行渲染. (在D3D中绘制call = DrawPrimitive,或者glDrawBuffers等等)甚至可以保证订单在三角形级别上符合规范,即使图形卡非常平行,它们也会被拒绝并行发布原语.通过一次绘制调用的不同运行绘制的一致性.

如果使用深度缓冲区,那些碰巧在较低深度绘制的对象之后进行绘制调用的对象将覆盖这些近似对象(在视图空间中)并给出错误结果,深度缓冲区有助于逐个像素地丢弃,一个物体的像素,其深度(在视图空间中)比之前已经在此像素处渲染的物体更深,但具有更接近的深度.

绑定深度缓冲区也有助于提高性能,因为如果一个块中的每个像素都具有特定值的最小深度,则原始光栅化器在顶点缓冲区退出后知道原始图像的整个部分永远不会在该块上呈现,并丢弃整个街区.这称为早期Z剔除,对性能有很大帮助.所以最好保持深度缓冲器堵塞.

相机在低级图形理论中没有概念,它只是一个视图矩阵表示,它是一个应用于整个世界的逆变换,将世界从世界空间转移到视图空间,作为任何单个顶点变换计算的一部分.这就是为什么在经典顶点着色器中,位置取自对象空间(在顶点缓冲流中),然后乘以对象矩阵变换,然后乘以视图矩阵变换,然后是投影矩阵变换,然后光栅化器划分一切都用’w’来划分视角.

这是通过利用这种“创建”相机概念的管道行为. Unity必须通过暴露相机类来抽象所有这些.也许相机类甚至有一个“纹理目标”成员来解释这个相机的渲染将被存储的位置.

是的,渲染是直接指向指定的渲染纹理,没有中间前端缓冲或其他,渲染目标是硬件支持的功能,并且在渲染结束时不需要复制.

渲染目标本身就是一个完整的配置,因为硬件多重采样它实际上可以绑定所需分辨率大小的多个缓冲区.

存在颜色缓冲器,例如MSAA4x中的4个RGBA表面,深度缓冲器,其通常是24位表示的固定点,以及用于模板表面的8位.所有这些表面都代表渲染目标配置,并且是渲染所必需的.

我希望这有帮助

原文地址:https://codeday.me/bug/20190629/1325234.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先