博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
去除WPF中3D图形的锯齿
阅读量:6676 次
发布时间:2019-06-25

本文共 1419 字,大约阅读时间需要 4 分钟。

原文:

      理论上讲PC在计算3D图形的时候是无法避免不出现锯齿的,因为3D图形都是又若干个三角形组成,如果3D图形想平滑就必须建立多个三角形,你可以想象一下正5边形和正100边形哪个更接近圆形的道理一样,这样会大量消耗显卡的存储空间或是从内存共享的存储空间,导致程序的整体性能降低,但如果三角形很少,显卡的解析度毕竟有限,就会出现锯齿。最常见的处理方式在我们玩的3D游戏里都可以见到,就是所谓的反锯齿功能。反锯齿功能(反锯齿加速齿轮)的作用是为了让游戏画面中的棱角更平滑更圆润。而在游戏画面中的3D游戏里面的反锯齿选项中会有2X 4X 6X等是指你想开启几个反锯齿加速齿轮管线,开的越多画面越平滑圆润,效果也就越好。但是它是以显卡的显存资源的使用成正比的,如果游戏内存资源的使用率高出了显存或内存的极限,一般会导致游戏弹出或死机的发生。

      我们知道WPF中的图形呈现都是通过显卡的GPU来进行计算处理的,所以改变显卡的3D平滑处理设置也可以消除锯齿(比如设置为8X),但你会发现其他的问题又会出现,不仅程序运行变慢甚至视频播放不了等。既然WPF诞生的时候已经强调了WPF不必关心显卡的问题,因为通过使用软件计算而不依赖显卡提供的内在支持,WPF可以执行任何渲染操作,那么应该可以通过程序来去除锯齿,所以就不要打硬件的主意了。

     在程序中实现3D效果的时候,接触最多的就是Viewport3D了,它是用来为三维可视内容提供呈现图面的,这个类的一个属性叫做3D Antialiasing,意思就是去除3D锯齿,边缘模式的预设值是Unspecified,先看看效果:

    你会发现微小的锯齿仍然存在,消除锯齿不是很明显,还有一点不能容忍的是,一旦3D Antialiasing设置为Unspecified,系统就是多重取样,整个程序就会卡,直接影响的是呈现速度,所以为了保证程序的流畅度,我们需要把3D Antialiasing的值设置为Aliased,就是将非文本(始终通过反失真效果来显示文本对象,设置边缘模式值不会对其产生影响)绘图基元的边缘呈现为锯齿形边缘,这样就不会影响呈现速度,设置方法如下

XAML: <Viewport3D x:Name="myVisual" RenderOptions.EdgeMode="Aliased">

C#:RenderOptions.SetEdgeMode((DependencyObject)myVisual, EdgeMode.Aliased);

然后再看看效果:

 

     观察一下会发现,和开启了消除锯齿功能的效果没什么区别,只是程序不卡了,而且消除锯齿的功能只有在Vista和Windows7中才好用,对XP并不支持,可见

3D Antialiasing的方法仍然解决不了问题。

    说句公道话,上面的效果中那点锯齿其实很微不足道,你要是用过iphone或itunes,很多App中也存在这样的锯齿,但这微小的瑕疵是可以容忍的,你在去看看那些大型的3D游戏,锯齿随处可见。尽管可以容忍但在WPF中仍有好方法可以去掉锯齿的,方法非常简单,没有做不到,只有想不到。

     既然产生锯齿的位置都在边缘(Edge),解决方法就在边缘上,我们可以用Border实例作为3D模型的父容器,并把BorderBrush设置为Transparent,BorderThickness为2~3,这样边缘部分就变透明了,锯齿也不见了,效果如下:

 

转载地址:http://uwwao.baihongyu.com/

你可能感兴趣的文章
6421B Lab2 DHCP的配置及故障排除
查看>>
[C# 基础知识梳理系列]专题一:深入解析委托——C#中为什么要引入委托
查看>>
FOSCommentBundle功能包:其它添加评论到页面的方法
查看>>
SQL Server 2012笔记分享-17:理解并设置文件表(FileTable)
查看>>
MongoDB运行状态、性能监控与分析
查看>>
Exchange 2016共享邮箱不保存已发送邮件的问题
查看>>
[C#基础知识系列]全面解析C#中静态与非静态
查看>>
SQL Server 2012笔记分享-40:自动维护索引
查看>>
Nginx实战基础篇三 Nginx上虚拟主机的实现过程
查看>>
百度SiteApp开始清理未备案的网站
查看>>
Lync Server 2013 实战系列之五:标准版-定义拓扑生成器
查看>>
统计数据库大小
查看>>
【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
查看>>
Linux 学习_samba
查看>>
不说技术~有时,开发者还是应该讲究一点!
查看>>
如何做好工作流定义
查看>>
.NET I/O 学习笔记:目录和文件
查看>>
pgpool-II3.1 的begin transaction 和 自动追加 BEGIN/COMMIT问题
查看>>
(转)记hadoop故障一例:BlockAlreadyExistsException
查看>>
hdu 4284 Travel floyd + 状压DP
查看>>