WorldWind源码剖析系列:大气层散射球类AtmosphericScatteringSphere
大氣層散射球類AtmosphericScatteringSphere代表地球外面的大氣層散射球模型,可以控制開啟/關(guān)閉渲染該對(duì)象。該類的類圖如下。
?
?
該類所包含的主要字段、屬性和方法如下:
public float m_radius;//大氣層散射球半徑,默認(rèn)為地球赤道半徑的1.025倍
protected int m_numberSlices; //大氣層散射球切片數(shù)目,默認(rèn)為75
protected int m_numberSections; //大氣層散射球半徑分割段數(shù),默認(rèn)為75
public static float m_fInnerRadius = 0; //大氣層散射球內(nèi)半徑
public static float m_fOuterRadius = 0; //大氣層散射球外半徑
public static int TilesHigh = 4; //大氣層散射球瓦片高度
public static int TilesWide = 8; //大氣層散射球瓦片寬度
System.Collections.Generic.List<MeshSubset> m_meshList = new System.Collections.Generic.List<MeshSubset>();//存儲(chǔ)大氣層散射球剖分的格網(wǎng)子集
Vector3 m_lastSunPosition = Vector3.Empty;//太陽位置
System.Threading.Thread m_backgroundThread = null;//渲染大氣層散射球的后臺(tái)線程
bool active = false;//是否激活大氣層散射球
System.DateTime m_lastOpticalUpdate = System.DateTime.MinValue; //大氣層散射球最后的不透明度更新時(shí)間
bool m_canDoShaders = false;//是否能夠執(zhí)行著色器
short[] m_indices = null;//剖分散射球時(shí)的頂點(diǎn)索引,用來構(gòu)造索引緩沖區(qū)
short[] m_indicesHighResolution = null;//精細(xì)的頂點(diǎn)索引,實(shí)際是通過指定精細(xì)的格網(wǎng)頂點(diǎn)密度是前者的2倍來重新計(jì)算實(shí)現(xiàn)的,75/4=18.75,取整為18,則精細(xì)的格網(wǎng)頂點(diǎn)密度為36
float[] fCameraDepth = new float[4] { 0, 0, 0, 0 };//相機(jī)深度
float[] fLightDepth = new float[4];//光照深度
float[] fSampleDepth = new float[4];//采樣深度
float[] fRayleighSum = new float[] { 0, 0, 0 };//瑞利散射和
float[] fMieSum = new float[] { 0, 0, 0 };//米爾散射和
Vector3 vPos = new Vector3();//光照位置
float[] fAttenuation = new float[3];//環(huán)境光
Vector3 vCamera = new Vector3();相機(jī)位置
public void Init(float radius, int slices, int sections)方法用來初始化大氣層散射球,內(nèi)部調(diào)用SunCalculator類、TimeKeeper類和BoundingBox類的靜態(tài)函數(shù),這兩個(gè)類在本篇結(jié)束時(shí)附后講解。將散射球切分成4行×8列=32塊,每一步內(nèi)部又按照指定的格網(wǎng)子集密度(如縱、橫密度均為18)進(jìn)一步剖分計(jì)算需要繪制的格網(wǎng)頂點(diǎn)。默認(rèn)經(jīng)度和緯度的分割間隔均為45度。內(nèi)部又調(diào)用CustomVertex.PositionColored[] CreateMesh(double minLat, double maxLat, double minLon, double maxLon, int meshPointCount)函數(shù)根據(jù)輸入的經(jīng)緯度范圍創(chuàng)建格網(wǎng)子集。
public void Update(DrawArgs drawArgs)方法用來更新大氣散射球的光照、模型等渲染元素,內(nèi)部實(shí)際上是發(fā)起后臺(tái)線程backgroundThread來實(shí)現(xiàn)的,線程綁定的處理函數(shù)為private void Updater()。而Update函數(shù)是在World類的public override void Update(DrawArgs drawArgs)中被調(diào)用的。
CustomVertex.PositionColored[] CreateMesh(double minLat, double maxLat, double minLon, double maxLon, int meshPointCount) 函數(shù)根據(jù)輸入的經(jīng)、緯度范圍和格網(wǎng)子集密度來創(chuàng)建格網(wǎng)子集的頂點(diǎn)數(shù)組。
short[] computeIndices(int meshPointCount)方法根據(jù)指定的格網(wǎng)子集密度來計(jì)算每個(gè)格網(wǎng)頂點(diǎn)的索引,以便渲染時(shí)索引緩沖區(qū)使用。其中,索引總數(shù)=縱向點(diǎn)數(shù)×橫向點(diǎn)數(shù)×2×3。在數(shù)組中索引范圍為[0,索引總數(shù)-1]。
void Interpolate(ref float[] p, float x, float y)被SetColor函數(shù)調(diào)用。
public void SetColor(ref CustomVertex.PositionColored pVertex, DrawArgs drawArgs)被UpdateColor和getAtmosphereColor函數(shù)調(diào)用。
int getAtmosphereColor(DrawArgs drawArgs,CustomVertex.PositionColored pVertex)被ColoredSpherePartial函數(shù)調(diào)用。
private void UpdateColor(DrawArgs drawArgs, MeshSubset meshSubset, bool doHighResolution)函數(shù)暫時(shí)未被調(diào)用,所以處理顏色函數(shù)可以暫時(shí)不用分析。
private Mesh ColoredSpherePartial(DrawArgs drawArgs, float radius, double startLat, double endLat, int slices, int stacks, double lonSpan, double heading) 被UpdateSkyMesh函數(shù)調(diào)用。
void UpdateLightVector(),根據(jù)太陽位置更新光照位置和方向,被Render()和Updater()函數(shù)調(diào)用。
private void UpdateSkyMesh(DrawArgs drawArgs, double horizonSpan)被Render()函數(shù)調(diào)用。
public void Render(DrawArgs drawArgs) 方法在World類的public override void Render(DrawArgs drawArgs)中被調(diào)用的。
void MakeOpticalDepthBuffer(float fInnerRadius, float fOuterRadius, float fRayleighScaleHeight, float fMieScaleHeight) 被Updater()函數(shù)調(diào)用。
實(shí)際上,大氣散射球類只需要重點(diǎn)關(guān)注Update(DrawArgs drawArgs)和Render(DrawArgs drawArgs)兩個(gè)方法,其余方法均直接或間接的被這兩個(gè)方法調(diào)用。而這兩個(gè)方法又分別被World類的Update(DrawArgs drawArgs)和Render(DrawArgs drawArgs)函數(shù)調(diào)用。
轉(zhuǎn)載于:https://www.cnblogs.com/rainbow70626/p/4584201.html
總結(jié)
以上是生活随笔為你收集整理的WorldWind源码剖析系列:大气层散射球类AtmosphericScatteringSphere的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多谐振荡器工作周期分析
- 下一篇: SLAM知识图谱(知识树/技能树)