去除WPF中3D图形的锯齿

简介: 原文:去除WPF中3D图形的锯齿      理论上讲PC在计算3D图形的时候是无法避免不出现锯齿的,因为3D图形都是又若干个三角形组成,如果3D图形想平滑就必须建立多个三角形,你可以想象一下正5边形和正100边形哪个更接近圆形的道理一样,这样会大量消耗显卡的存储空间或是从内存共享的存储空间,导致程序的整体性能降低,但如果三角形很少,显卡的解析度毕竟有限,就会出现锯齿。
原文: 去除WPF中3D图形的锯齿

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

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

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

1

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

XAML: <Viewport3D x:Name="myVisual" RenderOptions.EdgeMode="Aliased">
C#:RenderOptions.SetEdgeMode((DependencyObject)myVisual, EdgeMode.Aliased);

然后再看看效果:

0 

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

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

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

 

2

目录
相关文章
|
8月前
|
C# Windows
WPF技术之图形系列Polygon控件
WPF Polygon是Windows Presentation Foundation (WPF)框架中的一个标记元素,用于绘制多边形形状。它可以通过设置多个点的坐标来定义多边形的形状,可以绘制任意复杂度的多边形。
451 0
|
C# 前端开发
WPF - 图形设计器(Diagram Designer)
原文:WPF - 图形设计器(Diagram Designer)   OpenExpressApp计划中包括建模工具,计划是采用MetaEdit+模型来作为元模型,使用codeproject的《WPF Diagram Designer》一系列文章来做为设计器实现参考,本篇介绍一下codeprojcet的这四个文章,推荐给对图形设计器感兴趣的人去看看,通过WPF的模板功能和其他功能可以很方便的设计出图形编辑器。
3358 0
|
8月前
|
C# 开发者 Windows
WPF技术之图形系列Path控件
WPF Path是Windows Presentation Foundation (WPF)框架中的一个标记元素,用于绘制复杂的几何路径形状。它可以通过设置一系列的路径命令以及相应的参数来定义形状,可以绘制任意复杂度的路径。
617 0
|
8月前
|
C# Windows
WPF技术之图形系列Line控件
WPF Line是Windows Presentation Foundation (WPF)中的一个图形控件,用于在界面上绘制线条。它可以用来表示直线、分割线、边框等,提供了一种简单但有力的方式来显示和布局线条。
874 0
|
8月前
|
前端开发 C# Windows
WPF技术之图形系列Rectangle控件
WPF Rectangle是Windows Presentation Foundation (WPF)中的一个图形控件,用于在界面上绘制矩形。它是一个非常常见的UI元素,可用于显示、布局和交互。
611 0
|
8月前
|
数据可视化 前端开发 C#
WPF技术之图形系列Ellipse控件
WPF Ellipse是Windows Presentation Foundation (WPF)中的一个图形控件,它用于绘制椭圆形状。在WPF中,Ellipse可以用于创建具有椭圆形状的可视化效果,可以设置其位置、大小、填充颜色等属性。
759 0
|
前端开发 Windows
C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码
原文:C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码 C#WPF 如何绘制几何图形? 怎么绘制坐标系?绘制sin曲线(正弦曲线)? 这离不开Path(System.Windows.Shapes)和StreamGeometry(System.Windows.Media)类。
2109 0
|
C#
WPF利用HelixToolKit后台导入3D模型
原文:WPF利用HelixToolKit后台导入3D模型 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37591671/article/details/75044423 ...
3198 0
|
C# 前端开发 图形学
WPF实现3D翻转的动画效果
原文:WPF实现3D翻转的动画效果 1、前端代码实现 1.1 原理见代码注析 ...
2090 0
|
C# C++
3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子
原文:3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子 3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子   所用的软件 3ds Max 9.
1196 0