3D图形渲染通道负载优化的几种方法

一般来说, 定位渲染通道瓶颈的方法就是改变渲染通道每个步骤的工作量, 如果吞吐量也改变了, 那个步骤就是瓶颈. 找到了瓶颈就要想办法消除瓶颈, 可以减少该步骤的工作量, 增加其他步骤的工作量.

一般在光栅化之前的瓶颈称作”transform bound”, 三角形设置处理后的瓶颈称作”fill bound”

定位瓶颈的办法

1. 改变帧缓冲或者渲染目标(Render Target)的颜色深度(16 到 32 位), 如果帧速改变了, 那么瓶颈应该在帧缓冲(RenderTarget)的填充率上.

2. 否则试试改变贴图大小和贴图过滤设置, 如果帧速变了,那么瓶颈应该是在贴图这里.

3. 否则改变分辨率.如果帧速改变了, 那么改变一下pixel shader的指令数量, 如果帧速变了, 那么瓶颈应该就是pixel shader. 否则瓶颈就在光栅化过程中.

4. 否则, 改变顶点格式的大小, 如果帧速改变了, 那么瓶颈应该在显卡带宽上.

5. 如果以上都不是, 那么瓶颈就在CPU这一边.

优化方法36条:

1. 尽量减少无用的顶点数据, 比如贴图坐标, 如果有Object使用2组有的使用1组, 那么不 要将他们放在一个vertex buffer中, 这样可以减少传输的数据量.

2. 使用多个streamsource, 比如SkinMesh渲染, 可以把顶点坐标和法线这些每一帧都要修改的数据放在一个动态VB中, 其它不需要修改的(如贴图坐标)放到一个静态VB中, 这样就减少了数据传输量.

3. 尽量使用16位的索引缓冲,避免32位的. 一方面浪费带宽, 一方面也不是所有的显卡都支持32位的索引缓冲.

4. 可以考虑使用vertex shader来计算静态VB中的数据.比如SkinMesh的顶点可以放到vectex shader中计算, 这样就可以避免每一帧都从AGP内存中向显存传送数据. 这样也可以使用静态VB了.

5. 坚决避免使用Draw**UP一族的函数来绘制多边形.

6. 在设计程序之前好好规划一下显卡内存的使用, 确保framebuffer, 贴图, 静态VB能够正好放入显卡的本地内存中.

7. 尽量使顶点格式大小是32字节的倍数.可以考虑使用压缩过的顶点格式然后用vertex shader去解. 或者留下冗余的部分, 使顶点大小刚好使32字节的倍数.

8. 顶点在顶点缓冲中的顺序尽量符合绘制的顺序, 考虑使用strips来代替list.

9. 如果可能尽量多的使用static vertex buffer代替dynamic vertex buffer

10. 动态VB使用DISCARD参数来lock更新, 使用NOOVERWRITE来添加.尽量不要使用不带参数的lock调用(0)

11. 尽量减少lock的次数, 有些东西并不一定非要每一帧都更新VB, 比如人物动画一般每秒钟更新30次VB基本上就够了.

12. 如果是因为需要绘制的顶点数据太多了可以考虑使用LOD, 但是现在的显卡的绘制能力都很强劲, 所以需要权衡一下LOD是否能够带来相应的好处, 如果过分的强化LOD很可能将瓶颈转移到CPU这边.

13. 避免过多的顶点计算,比如过多的光源, 过于复杂的光照计算(复杂的光照模型), 纹理自动生成的开启也会增加顶点的计算量. 如果贴图坐标变换矩阵不是单位矩阵, 也会造成顶点计算量的增加, 所以如果纹理变换已经结束, 记得要将纹理变换矩阵设为单位矩阵同时调整贴图坐标.

14. 避免Vertex shader指令数量太多或者分支过多, 尽量减少vertex shader的长度和复杂程度. 尽量使用swizzling代替mov

15. 如果图象质量方面的计算(pixel shader)范围很大, 并且很复杂, 可以考虑试试全屏反走样.说不定更快.

16. 尽量按照front – back的顺序来绘制.

17. 在shader中判断Z值可以避免绘制不可见的象素, 但是nvidia建议简单的shader不要这么做.(Don’t do this in a simple shader)

18. 如果可能, 尽量使用vertex shader来代替pixel shader.将计算从逐象素变成逐顶点.

19. 尽量降低贴图的大小.过大的贴图可能造成贴图cache过载, 从而导致贴图cache命中降低.过大的贴图会导致显存过载, 这时候贴图是从系统内存中取的.

20. 只要可能就用16位色的贴图, 如环境贴图或者shadow map.它们用32位色的贴图实在是浪费.

21. 考虑使用DXT 贴图压缩

22. 如果可能,使用简单的贴图过滤或者mip map, 除非必要否则尽量不要使用三线过滤和各项异性过滤. light map 和 环境贴图基本上都不需要使用它们.

23. 只有真正需要修改的贴图才使用Dynamic, 并且使用DISCRAD和WRITEONLY来lock

24. 太多的帧缓冲读写可以考虑关闭Z-Writes如有些多pass的渲染中的后续pass或者粒子系统等半透明几何物体(如果可以)

25. 可能的话尽量使用alpha test代替alpha blending

26. 如果不需要stencil buffer就尽量使用16位的Z buffer

27. 减小RenderTarget 贴图的大小, 如shadow map 环境贴图. 可能根本不需要那么大效果就很好.

28. Stencil 和 Z buffer 尽量一起clear. 他们本来就是一块缓冲.

29. 尽量减少渲染状态的切换, 尽量一次画尽可能多的多边形.(根据显卡性能决定最多画多少,不过一般再多也不会多到哪里去。 除非你根本不需要贴图和渲染状态的切换)

30. 尽量使用shader来代替Fixed Pipeline.

31. 尽量使用shader来实现来取代Multipass渲染效果.

32. 尽量优先先建立重要的资源, 如Render target, shaders, 贴图, VB, IB等等.以免显存过载的时候它们被创建到系统内存中.

33. 坚决不要在渲染循环中调用创建资源

34. 按照shader和贴图分组后再渲染.先按照shaders分组再按贴图.

35. Color Stencil Z buffer尽量在一次Clear调用中清除.

36. 一个Vertex buffer 的大小在2M-4M之间最好.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 稠密重建(MVS,Multiple View Stereo)是指从多个视角的图像中恢复出场景的三维几何信息。常见的MVS方法包括基于特征点匹配的方法、基于体素的方法和基于深度学习的方法。 首先是基于特征点匹配的方法。这种方法首先从多个视角的图像中提取出特征点,如SIFT或SURF特征点。然后通过特征点之间的匹配,计算出相机的投影矩阵,进而计算每个像素的深度值。常见的算法有PatchMatch和SfM(Structure from Motion)。 其次是基于体素的方法。这种方法将场景划分成许多体素(3D像素),然后根据相邻视角中的像素值和纹理信息,通过采样和插值等技术,进行重建。体素方法相比特征点方法可以更细致地重建场景,但计算开销较大。常见的算法有VoxelCarving和3D Delaunay三角剖分。 最后是基于深度学习的方法。近年来,深度学习方法在MVS中取得了显著的进展。这种方法利用深度学习模型,直接从图像中估计深度信息。通过训练大量的带有深度标签的图像对,网络能够学习到从图像到深度的映射关系,从而实现场景的重建。常见的算法有MVSNet和GANet等。 综上所述,稠密重建的几种方法分别基于特征点匹配、体素和深度学习。不同方法有各自的特点和优缺点。特征点匹配方法适用于场景中存在明显特征点的情况;体素方法能够更精细地重建场景,但计算开销较大;深度学习方法可以直接从图像中学习深度信息,但需要大量的训练数据。根据具体的应用场景和要求,可以选择适合的方法来进行稠密重建。 ### 回答2: 稠密重建(MVS)是一种计算机视觉技术,用于从一组多个图像中恢复场景的几何和外观信息。稠密重建是3D重建的一种形式,它试图在场景的每个像素位置上估计一个深度值或3D坐标。 实现稠密重建的方法几种,包括: 1.三角化方法:三角化是通过在多个视角下计算像素对应的3D坐标来进行稠密重建的一种方法。它基于基本几何原理和相机几何关系,并使用多个图像之间的匹配信息来计算3D位置。然后,通过对所有视角的三维点进行融合,可以得到稠密的3D重建。 2.基于立体匹配的方法:这种方法使用两个或多个视角的图像对之间的区域匹配来进行稠密重建。它通过计算图像中的像素间的位移或视差来估计深度或3D坐标。最常用的匹配方法是通过计算图像中的匹配成本,如像素间的差异,来找到最合适的匹配。然后,通过将视差映射到3D空间中,可以得到稠密的3D重建。 3.基于结构光或纹理投影的方法:这种方法使用结构光或纹理投影来捕捉场景的深度和纹理信息,并进行稠密重建。结构光方法是使用特殊的投影系统,如激光或投影仪,来投射结构化光模式或纹理,以获得场景的深度信息。然后,通过将深度信息与图像投影进行重建,可以得到稠密的3D模型。 总之,稠密重建是通过分析多个图像之间的几何和外观关系,计算像素的深度或3D坐标来实现的。三角化、基于立体匹配和基于结构光或纹理投影是几种常见的实现稠密重建的方法。这些方法在不同的应用和场景中有各自的适用性和限制性。 ### 回答3: 稠密重建(MVS)是一种计算机视觉技术,旨在通过多个图像或视频帧恢复物体的三维模型和纹理。下面是几种常用的稠密重建方法的详细解释: 1. 基于多视图立体匹配(MVS):这种方法通过在多个视角下捕获被重建场景的多张图像,并通过立体匹配算法计算场景中每个像素点的深度信息,从而恢复出场景的三维结构。该方法的优点是可以利用大量的图像信息来提高稠密重建的准确性,但缺点是计算复杂度较高。 2. 基于结构光:结构光是通过投射具有特定结构的光纹或光束,然后通过图像传感器进行捕捉,并通过计算来恢复三维表面形状和纹理的一种方法。这种方法适用于需要高精度的稠密重建,例如面部识别和三维扫描等应用。 3. 基于光场摄影:光场摄影是一种捕捉物体完整光场信息的技术,通过记录光线的强度、方向和位置,以及场景中的深度信息来实现。这种方法可以获得高质量的稠密重建结果,并在计算机图形学和虚拟现实等领域得到广泛应用。 4. 基于深度学习:近年来,深度学习在计算机视觉领域取得了显著的进展,对于稠密重建也有很大的应用潜力。通过使用神经网络等深度学习技术,可以自动学习场景的三维结构和纹理模型,并生成高质量的稠密重建结果。这种方法的优点是可以在大规模数据的基础上快速进行稠密重建,但缺点是需要大量的标注数据来进行训练。 总结来说,稠密重建的几种方法包括基于多视图立体匹配、结构光、光场摄影和深度学习等。选择适合的方法取决于具体应用场景的需求,如准确性、速度和成本等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值