WorldWind系列十:RendableObject中的DirectX渲染分析:ImageLayer为例

学习WW有一段时间了,但是若想开发自己基于WW的插件,必然会遇到RendableObject中的DirectX渲染问题。所有需要渲染绘制的 WW三维插件,最终是通过继承RendableObject并实现自己的Initialize()、Update()、Render()方法的。想写自己的Render()方法不是简单的事情,你必然要学习DirectX编程,否则,你连看懂示例中的底层Render()方法都很难,谈何开发自己的插件。

为了突破DirectX编程对我学习WW插件的阻挠,我“快餐式”地突击学习了DirectX,对基本流程和基本原理有了一定认识。今天下午我也对BMNG插件中RendableObject子类——ImageLayer为例进行了分析学习。现在与大家分享一下。

注:请务必先学过

Direct3D学习(资料收集),否则看下面的内容无异于浪费你宝贵的时间。

Image Layer重载实现的Initialize()方法。

Initialize方法代码

/// <summary>
         /// Layer initialization code
         /// </summary>
         public override void Initialize(DrawArgs drawArgs)
         {
             try
             {
         //获取绘制设备对象
                 this.device = drawArgs.device;
                 if(_imagePath == null && _imageUrl != null && _imageUrl.ToLower().StartsWith("http://"))
                 {
           //根据URL地址,在本地构建同样层次的文件夹路径。这里有个知识点getFilePathFromUrl()方法,自己定位学习
                     _imagePath = getFilePathFromUrl(_imageUrl);

                 }
                 FileInfo imageFileInfo = null;
                 if(_imagePath != null)
                     imageFileInfo = new FileInfo(_imagePath);
                 if(downloadThread != null && downloadThread.IsAlive)
                     return;
                 if(_imagePath != null &&
                     cacheExpiration != TimeSpan.MaxValue &&
                     cacheExpiration.TotalMilliseconds > 0 &&
                     _imageUrl.ToLower().StartsWith("http://") &&
                     imageFileInfo != null &&
                     imageFileInfo.Exists &&
                     imageFileInfo.LastWriteTime < System.DateTime.Now - cacheExpiration)
                 {
                     //attempt to redownload it
                   //启用新线程,下载影像图片。我稍后分析DownloadImage()方法,是重点之一
                     downloadThread = new Thread(new ThreadStart(DownloadImage));
                     downloadThread.Name = "ImageLayer.DownloadImage";

                     downloadThread.IsBackground = true;
                     downloadThread.Start();
                     return;
                 }
                 if(m_TextureStream != null)
                 {
            //从文件流中,更新Texture(纹理),重点分析
                     UpdateTexture(m_TextureStream, m_TransparentColor);
                     verticalExaggeration = World.Settings.VerticalExaggeration;
            //创建Mesh,稍后重点分析
                     CreateMesh();
                     isInitialized = true;
                     return;
                 }
                 else if(imageFileInfo != null && imageFileInfo.Exists)
                 {
           //从文件路径中更新纹理
                     UpdateTexture(_imagePath);
                     verticalExaggeration = World.Settings.VerticalExaggeration;
           //创建格网Mesh,为了获取Vertex集合。
                     CreateMesh();
                     isInitialized = true;
                     return;
                 }
                 if(_imageUrl != null && _imageUrl.ToLower().StartsWith("http://"))
                 {
                     //download it...
                     downloadThread = new Thread(new ThreadStart(DownloadImage));
                     downloadThread.Name = "ImageLayer.DownloadImage";

                     downloadThread.IsBackground = true;
                     downloadThread.Start();
                     return;
                 }
                 // No image available
                 Dispose();
                 isOn = false;
                 return;
             }
             catch
             {
             }
         }

时间: 2025-01-29 19:33:26

WorldWind系列十:RendableObject中的DirectX渲染分析:ImageLayer为例的相关文章

WorldWind系列十五:如何切割影像和DEM数据及其在WW中的应用配置

WorldWind学习系列十四中我从代码上分析如何加载DEM数据,里面涉及了算法,有学习和借鉴意义.但对于只求应用或者说是急于求成的网友来说,实用价值不是太大!我们分析代码是一种学习过程,不是目的,终究要落在如何应用自己的影像和DEM数据.如何基于自己的数据开发满足自己项目需求的新的WW插件.这是一过程,需要循序渐进,今天只跟大家分享一下如何切割自己的影像或DEM,及如何设置相应的XML配置. 我的学习和实践,主要是参考http://worldwindcentral.com/wiki/Dstil

WorldWind系列十二:Measure插件学习(上)

我在写自己的WorldWind插件时,遇到很大挫折,上周六本来想写个简单的画线的插件,费了九牛二虎之力终于画出了,如何以动画效果画出线的问题没解决.Direct3D中画线本来是个简单的事,画到球面上也不难,但是实践告诉我:我前期学习WW,又犯了眼高手低的毛病!改动人家写好的插件代码容易,但要把插件的整个流程都自己写,就没想象的简单啦,写代码不严谨的小问题就不说了,我周六画线的主要问题是Direct3D编程都浮在表面,连PrimitiveType中各类型的基元数和顶点的关系没搞清楚. 自己在画线上

WorldWind系列十四:DEM数据加载和应用——以SRTM为例(上)

DEM应用在WW的三维表现中占有很重要的位置,跟影像数据同等重要!幸好影像和DEM的加载和处理原理上几乎一致,对基于WW搞GIS三维开发来说是件好事,理解好任何一种,另一种触类旁通!前一篇,主要从功能上做了简单入门介绍,该篇将从代码级别分析WW内置的SRTM的DEM数据加载和应用,下一篇讲从二次开发角度上讲解如何处理.配置自己的影像和DEM数据.呵呵,因为DEM部分很重要,且是放假期间我也有时间,争取篇篇精彩! 两个缩写词介绍:因为这两个缩写词常出现,知道是什么缩写,就不觉得神秘啦! SRTM:

WorldWind系列十四:DEM数据加载和应用——以SRTM为例(下)

使用了TerrainAccessor.cs类120行代码 public virtual TerrainTile GetElevationArray(double north, double south, double west, double east, int samples) { TerrainTile res = null; res = new TerrainTile(null); res.North = north; res.South = south; res.West = west;

WorldWind系列十二:Measure插件学习(下)

添加层次控制 public void Render(DrawArgs drawArgs) { // Draw the measure line + ends Vector3 referenceCenter = new Vector3( (float)drawArgs.WorldCamera.ReferenceCenter.X, (float)drawArgs.WorldCamera.ReferenceCenter.Y, (float)drawArgs.WorldCamera.ReferenceC

Silverlight &amp;amp; Blend动画设计系列十二

Silverlight & Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation) 说到对象的旋转,或许就会联想到对象角度的概念.对象的旋转实现实际上就是利用对象 的角度改变来实现的位置变换,在<Silverlight & Blend动画设计系列二:旋转动画( RotateTransform)>一文中有对对象的不同角度变换的实现介绍,本篇要介绍的自由旋转( Free-form rotation)将借助<Fun

Silverlight &amp;amp; Blend动画设计系列十

Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动 如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯.因为 在Silverlight中的坐标系与Flash中的坐标系一样,一切都的颠倒的.在标准的数学坐标系 中,X轴表示水平轴,Y轴表是垂直轴,然而Silverlight中的坐标系是基于视频屏幕的坐标系 . Silverlight中的坐标系统和Flash中的坐标系统

WorldWind系列三

简单功能分析--主窗体的键盘监听处理及拷贝和粘贴位置坐标功能 在分析功能时发现,各功能都有自己的快捷键相应,比如今天要分析的 Copy Coordinates (Ctrl+C)和Paste Coordinates (Ctrl+P),以及主窗体的全屏功能也是通过快捷键(Alt+Enter).这就使我需要彻底分析一下主窗体的键盘监听处理啦. 主窗体的键盘监听处理 与WorldWind系列三:功能分析--截屏功能和"关于"窗体分析 中AboutDialog.cs分析类似,WorldWind主

WorldWind系列二:擒贼先擒王篇1

有了WorldWind系列一的基础,我们已经可以进行正常调试运行啦!可以先操作看看软件的功能吧,这样我们才可以知道WorldWind有哪些功能等待我们学习的. 开始我们的"WorldWind系列二:擒贼先擒王"分析WorldWind主窗体,从Main函数入口一步步解析学习.至少对于我来说,里面有很多知识要学的.(补充一下:无法进入WorldWind.cs窗体的设计界面,这个问题我早就发现了,但没解决,我们根据功能直接看代码吧) 1.使用System.Version在内部,读取软件版本信