在上篇部落格中,使用GDAL提供的函數產生彩色渲染圖,但是不是立體的。在之前有一篇翻譯的博文中可以使用Mapnik進行立體渲染詳見“http://blog.csdn.net/liminlu0314/article/details/8550781”。仔細研究了下Mapnik中的渲染方式,發現使用的是一個很著名的開源庫——AGG。
AGG,全名:Anti-Grain Geometry,是一個開源的、高效的2D圖形庫,它的網站:http://www.antigrain.com/。 AGG是一個用標準的平台無關的C++寫成的通用圖形工具包。它可以應用在電腦程式中需要高品質的2D圖形的許多方面。例如,AGG可以用於渲染2D地圖。AGG只使用了C++和標準C的函數,如memcpy,sin,cos,sqrt等。基本的演算法甚至沒有使用C++ Standard Template Library。因此,AGG能夠在大量的應用軟體中使用,包括嵌入式系統中。另一方面,AGG允許對庫的一部分進行替換,比如在它不能適應效能的要求時。如果需要,你也能夠添加其他的色彩空間。因為AGG是基於C++的模板機制的。
關於AGG的介紹就這麼多了,想多瞭解的可以搜相關的內容,或者參考下面的參考連結。通過查看Mapnik的原始碼和AGG的原始碼,寫了一個簡單的使用DEM進行立體渲染的函數。函數的核心如下:
static void CalcResult(DT_8U *piR, DT_8U *piG, DT_8U *piB, DT_8U *piP, double dOpacity = 0.6){DT_8U sP = *piP;DT_8U sA = 255;DT_8U cover = static_cast<DT_8U> (dOpacity * 255 + 0.5);if(cover < 255){sP = (sP * cover + 255) >> 8;sA = (sA * cover + 255) >> 8;}//這裡千萬不能直接代入到下面的公式,否則會出錯,DT_8U是不帶正負號的整數DT_8U s1a = -sA;sP = sP + s1a;if(sP == 0)//如果SP為0,將其設定為255sP = 255;*piR = (DT_8U)(( *piR*sP ) >> 8);*piG = (DT_8U)(( *piG*sP ) >> 8);*piB = (DT_8U)(( *piB*sP ) >> 8);}
上面的函數的前三個參數,就是使用DEM直接進行顏色渲染的RGB值,第四個參數是計算山體陰影的灰階值,第五個參數就是一個透明度的選項。有了上面的函數就可以結合之前的部落格中的彩色渲染和山體陰影得到一個具有立體效果的彩色映像。具體效果如所示。
圖1 原始DEM資料
圖2 使用顏色表1,透明度為60%
圖3 使用顏色表1,透明度為90%
圖4 使用顏色表2,透明度為60%
顏色表1
0 110 220 110900 240 250 1601300 230 220 1701900 220 220 2202500 250 250 250
顏色表2
100%2550025545.5%255255025520.5%025502556.7%02502552553.5%01282552551.7%0642552550%010255255nv0000
上面的處理效果沒有GlobeMapper 的效果好,和Erdas的效果沒進行比較過(主要是現在的電腦沒裝)。希望對大家有用,關於立體渲染,關鍵就是上面的渲染函數,即dst(RGB) = F(R,G,B ,P)。
參考資料:
http://www.antigrain.com/
http://en.wikipedia.org/wiki/Anti-Grain_Geometry
http://www.cnblogs.com/Kane_zzt/archive/2008/08/19/1271793.html
http://blog.csdn.net/liminlu0314/article/details/8688486
http://blog.csdn.net/liminlu0314/article/details/8550781