WorldWind系列六 渲染过程解析篇Word文件下载.docx
- 文档编号:21418597
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:10
- 大小:54.39KB
WorldWind系列六 渲染过程解析篇Word文件下载.docx
《WorldWind系列六 渲染过程解析篇Word文件下载.docx》由会员分享,可在线阅读,更多相关《WorldWind系列六 渲染过程解析篇Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
RenderableObjectList里通过该Timer.Elapsed事件实现了自动刷新渲染的功能。
这里还有个知识点,我们可以学习一下,就是Timer.Elapsed事件使用,请参考MS的
3.下面让我们一起看看WW实现渲染绘制的整个代码调用流程,主要分为两部分:
一、获取到所有的要绘制对象集合,二、绘制所有要绘制的对象。
分析入口还是从WorldWind.cs的MainAppliaction()方法开始的。
3.1获取到所有的要绘制对象集合,存放到World.cs中的RenderableObjects属性里
MainAppliaction()中调用OpenStartupWorld()
——》2974行OpenWorld(curWorldFile);
调用了privatevoidOpenWorld(stringworldXmlFile)方法
——》3049行worldWindow.CurrentWorld=WorldWind.ConfigurationLoader.Load(worldXmlFile,worldWindow.Cache);
调用了CongfigurationLoader.cs的publicstaticWorldLoad(stringfilename,Cachecache)方法
——》CongfigurationLoader.cs的110行newWorld.RenderableObjects=getRenderablesFromLayerDirectory(layerDirectory,newWorld,cache);
看代码
加载渲染对象代码
public
static
World
Load(string
filename,
Cache
cache)
Log.Write(Log.Levels.Debug,
"
CONF"
Loading
+
filename);
//
get
the
Wind
Settings
through
reflection
to
avoid
changing
signature
of
Load().
Assembly
a
=
Assembly.GetEntryAssembly();
Type
appType
a.GetType("
WorldWind.MainApplication"
);
System.Reflection.FieldInfo
finfo
appType.GetField("
Settings"
BindingFlags.Static
|
BindingFlags.Public
BindingFlags.GetField);
WorldWindSettings
settings
finfo.GetValue(null)
as
WorldWindSettings;
XmlReaderSettings
readerSettings
new
XmlReaderSettings();
if
(settings.ValidateXML)
validating
filename
against
WorldXmlDescriptor.xsd
and
LayerSet.xsd"
readerSettings.ValidationType
ValidationType.Schema;
/*
load
schema
validate
instead
hoping
for
an
inline
reference
*/
XmlSchemaSet
schemas
XmlSchemaSet();
schemas.Add(null,
settings.ConfigPath
/WorldXmlDescriptor.xsd"
/Earth/LayerSet.xsd"
readerSettings.Schemas
schemas;
readerSettings.ValidationEventHandler
+=
ValidationEventHandler(XMLValidationCallback);
readerSettings.ValidationFlags
|=
System.Xml.Schema.XmlSchemaValidationFlags.ReportValidationWarnings;
else
loading
without
validation"
ValidationType.None;
try
XmlReader
docReader
XmlReader.Create(filename,
readerSettings);
XPathDocument
docNav
XPathDocument(docReader);
XPathNavigator
nav
docNav.CreateNavigator();
XPathNodeIterator
worldIter
nav.Select("
/World[@Name]"
(worldIter.Count
>
0)
worldIter.MoveNext();
string
worldName
worldIter.Current.GetAttribute("
Name"
double
equatorialRadius
ParseDouble(worldIter.Current.GetAttribute("
EquatorialRadius"
));
layerDirectory
LayerDirectory"
(layerDirectory.IndexOf("
:
)
<
Path.Combine(Path.GetDirectoryName(filename),
layerDirectory);
TerrainAccessor[]
terrainAccessor
getTerrainAccessorsFromXPathNodeIterator(worldIter.Current.Select("
TerrainAccessor"
),
System.IO.Path.Combine(cache.CacheDirectory,
worldName));
newWorld
World(
worldName,
Microsoft.DirectX.Vector3(0,
0,
0),
Microsoft.DirectX.Quaternion(0,
equatorialRadius,
cache.CacheDirectory,
(terrainAccessor
!
null
?
terrainAccessor[0]
null)//TODO:
Oops,
should
be
able
handle
array
terrainAccessors
//加载所有要渲染绘制的对象
newWorld.RenderableObjects
getRenderablesFromLayerDirectory(layerDirectory,
newWorld,
cache);
return
newWorld;
catch
(XmlSchemaException
ex)
Log.Write(Log.Levels.Error,
Exception
caught
during
XML
parsing:
ex.Message);
File
was
not
read
successfully."
TODO:
pop
up
message
box
or
something.
null;
——》170publicstaticRenderableObjectListgetRenderableFromLayerFile(stringlayerFile,WorldparentWorld,Cachecache,boolenableRefresh)方法,真正加载绘制对象集合的函数。
3.2绘制所有要绘制的对象
WorldWind.cs中MainAppliaction()中
——》675worldWindow.Render();
调用了WorldWindow.cs的Render()方法
——》785m_World.Render(this.drawArgs);
调用World.cs的publicoverridevoidRender(DrawArgsdrawArgs)方法
分类分层次地调用渲染代码
override
void
Render(DrawArgs
drawArgs)
(m_WorldSurfaceRenderer
&
World.Settings.UseWorldSurfaceRenderer)
m_WorldSurfaceRenderer.RenderSurfaceImages(drawArgs);
Old
method
--
problems
with
RenderPriority
sorting
RenderableObjects.Render(drawArgs);
RenderStars(drawArgs,
RenderableObjects);
(drawArgs.CurrentWorld.IsEarth
World.Settings.EnableAtmosphericScattering)
float
aspectRatio
(float)drawArgs.WorldCamera.Viewport.Width
/
drawArgs.WorldCamera.Viewport.Height;
zNear
(float)drawArgs.WorldCamera.Altitude
*
0.1f;
distToCenterOfPlanet
(drawArgs.WorldCamera.Altitude
equatorialRadius);
tangentalDistance
Math.Sqrt(distToCenterOfPlanet
-
amosphereThickness
Math.Sqrt(m_outerSphere.m_radius
m_outerSphere.m_radius
Matrix
proj
drawArgs.device.Transform.Projection;
drawArgs.device.Transform.Projection
Matrix.PerspectiveFovRH((float)drawArgs.WorldCamera.Fov.Radians,
aspectRatio,
zNear,
(float)(tangentalDistance
amosphereThickness));
drawArgs.device.RenderState.ZBufferEnable
false;
drawArgs.device.RenderState.CullMode
Cull.CounterClockwise;
m_outerSphere.Render(drawArgs);
Cull.Clockwise;
true;
proj;
(World.Settings.EnableSunShading)
RenderSun(drawArgs);
//分类、分层次地调用渲染方法
//render
SurfaceImages
Render(RenderableObjects,
WorldWind.Renderable.RenderPriority.TerrainMappedImages,
drawArgs);
(m_projectedVectorRenderer
null)
m_projectedVectorRenderer.Render(drawArgs);
AtmosphericImages
WorldWind.Renderable.RenderPriority.AtmosphericImages,
LinePaths
WorldWind.Renderable.RenderPriority.LinePaths,
Placenames
WorldWind.Renderable.RenderPriority.Placenames,
Icons
WorldWind.Renderable.RenderPriority.Icons,
Custom
WorldWind.Renderable.RenderPriority.Custom,
(Settings.showPlanetAxis)
this.DrawAxis(drawArgs);
(Exception
Log.Write(ex);
——》分类绘制过程中是调用485行的privatevoidRender(WorldWind.Renderable.RenderableObjectrenderable,WorldWind.Renderable.RenderPrioritypriority,DrawArgsdrawArgs)方法。
被各类对象调用的渲染方法
private
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WorldWind系列六 渲染过程解析篇 WorldWind 系列 渲染 过程 解析