歡迎關注微信公號【三維網(wǎng)格3D】,第一時間獲取最新文章
DrawCommand?是 Cesium 渲染器的核心類,常用的接口?Entity、Primitive、Cesium3DTileSet,以及地形和影像的渲染等等,底層都是一個個?DrawCommand?完成的。在進行擴展開發(fā)、視覺特效提升、性能優(yōu)化、渲染到紋理(RTT),甚至基于 Cesium 封裝自己的開發(fā)框架,定義獨家數(shù)據(jù)格式等等,都需要開發(fā)人員對?DrawCommand?熟練掌握。而這部分接口,Cesium 官方文檔沒有公開,網(wǎng)上的相關資料也比較少,學習起來比較困難,所以接下來我們用幾期文章,由淺入深,實用為主,力求全面地介紹?DrawCommand?及相關類的運用。

簡單列個計劃吧,可能部分內容合為一期來介紹:
入門;
顯隱控制;
支持?pick;
陰影(shadows);
實例化(instance);
支持?Entity?的貼地屬性;
解決抖動問題(RTC);
支持BatchTable。
本期我們先從一個簡單的示例來介紹?DrawCommand?基本屬性,通過這個示例,大家可以自己基于?DrawCommand?創(chuàng)建一個最基本的可用的 Primitive。
1、創(chuàng)建 DrawCommand

一個基本的 DrawCommand 至少包含:
vertexArray?:頂點數(shù)組,向 GPU 傳遞頂點屬性、索引(可選的)數(shù)組等幾何信息;
shaderProgram?:著色器程序對象,負責編譯、鏈接頂點著色器(vertexShader)、片元著色器(fragmentShader);
renderState?:渲染狀態(tài)對象,封裝如深度測試(depthTest)、剔除(cull)、混合(blending)等狀態(tài)類型的參數(shù)設置;
pass?:渲染通道,Cesium 提供的常用渲染通道(封裝在Cesium.Pass)有
ENVIRONMENT:環(huán)境,如天空盒(星空背景)
COMPUTE?:用于并行加速計算
GLOBE?:地形瓦片等
TERRAIN_CLASSIFICATION?:地形分類
CESIUM_3D_TILE?:3D Tiles 瓦片
CESIUM_3D_TILE_CLASSIFICATION?:3D Tiles 分類(單體化)
OPAQUE?:不透明物體
TRANSLUCENT?:半透明物體
不是必須但是常用的屬性:
modelMatrix?:模型變換矩陣,用于指定所繪制物體的參考系,包括位置、旋轉、縮放三方面參數(shù)。如果不設置,則參考系為世界坐標系,原點在地球球心;
uniformMap?:用于傳遞 uniform 具體的值,是一個回調函數(shù)字典對象,key 是 uniform 變量名,value 是回調函數(shù),回調函數(shù)的返回值可以是:
number?:數(shù)字類型,或者數(shù)字數(shù)組;
boolean?:布爾類型,true 或者 false,或者數(shù)組;
Cartesian2?:二維向量;
Cartesian3?:三維向量;
Cartesian4?:四維向量;
Color?:顏色,本身也是四維向量;
Matrix2?:2x2 矩陣;
Matrix3?:3x3 矩陣,一般可以傳法線矩陣(normalMatrix);
Matrix4?:4x4 矩陣,如 modelMatrix、viewMatrix、projectionMatrix 等等都是這個類型;
Texture?:二維貼圖;
CubeMap?:立方體貼圖。
2、使用 DrawCommand
DrawCommand的使用需要通過實現(xiàn)Primitive接口來完成,具體代碼如下(已經(jīng)省去創(chuàng)建DrawCommand部分)

3、基本屬性詳解
下面詳細介紹各個基本屬性及其創(chuàng)建方法。
3.1、modelMatrix
模型變換矩陣,用于指定所繪制物體的參考系,包括位置、旋轉、縮放三方面參數(shù)。Cesium 提供現(xiàn)成的一組方法(封裝在Cesium.Transforms)可以快速創(chuàng)建幾種常見的站心坐標系,最常用莫過于 ENU 坐標系了。

3.2、vertexArray
頂點數(shù)組的創(chuàng)建有多種方法,通常可以將幾何數(shù)據(jù)用Cesium.Geometry來表達,然后用Cesium.VertexArray.fromGeometry可以用更少代碼量完成創(chuàng)建。關鍵參數(shù):
attributeLocations?:頂點屬性索引,key 為屬性名稱,value 為頂點屬性緩沖區(qū)在同一個著色器程序中的索引,相當于將 js 中的頂點數(shù)組,傳遞到 shader 中的 attribute 變量。在后面創(chuàng)建shaderProgram時還需要用到;
context:從Primitive.update方法的frameState參數(shù)中獲取;
geometry:Cesium.Geometry,Cesium 自帶的幾何類型都提供一個靜態(tài)方法createGeometry來生成這個類型的幾何對象。

3.3、shaderProgram
著色器程序,負責編譯、鏈接頂點著色器(vertexShader)、片元著色器(fragmentShader)。熟悉整個流程之后,這一步的shader編寫就是分高下的關鍵所在了,或炫酷的視覺效果、或高效的并行算法,都在 shader 代碼。我們需要清楚:
需要聲明哪些attribute變量?這取決于geometry.attributes,變量名稱必須保持一致;變量類型取決于geometry.attributes中各個屬性的componentsPerAttribute值:
1——float;
2——vec2;
3——vec3;
4——vec4;
Cesium 提供哪些內置的uniform變量(通常前綴為czm_)?比如下面的czm_projection,內置uniform變量無需在我們的 shader 代碼中聲明,Cesium 會自動添加,下一節(jié)的uniformMap也無需包含;
需要聲明哪些uniform變量?除了內置變量,我們運算需要的外部傳遞的,每一個次運算所使用的值都相同的外部變量,都需要聲明。變量的值,通過下一節(jié)的uniformMap傳遞。

3.4、uniformMap
用于傳遞自定義?uniform?變量的值,是一個回調函數(shù)字典對象,key 是?uniform?變量名,value 是回調函數(shù),回調函數(shù)的返回值可以是:
number?:數(shù)字類型,在 shader 中類型為float;
boolean?:布爾類型,true 或者 false,在 shader 中類型為bool;
Cartesian2?:二維向量,在 shader 中類型為vec2;
Cartesian3?:三維向量,在 shader 中類型為vec3;
Cartesian4?:四維向量,在 shader 中類型為vec4;
Color?:顏色,本身也是四維向量,在 shader 中類型為vec4;
[]:元素為上述類型的數(shù)組
Matrix2?:2x2 矩陣,在 shader 中類型為mat2;
Matrix3?:3x3 矩陣,一般可以傳法線矩陣(normalMatrix),在 shader 中類型為mat3;
Matrix4?:4x4 矩陣,如 modelMatrix、viewMatrix、projectionMatrix 等等都是這個類型,在 shader 中類型為mat4;
Texture?:二維貼圖,在 shader 中類型為sampler2D;
CubeMap?:立方體貼圖,在 shader 中類型為samplerCube;
{}:結構體。

3.5、renderState
渲染狀態(tài)對象,封裝如深度測試(depthTest)、剔除(cull)、混合(blending)等狀態(tài)類型的參數(shù)設置。其中涉及多個技術,后面會展開部分來介紹,其余的在使用中慢慢掌握。

4、完整示例代碼

歡迎關注微信公號【三維網(wǎng)格3D】,第一時間獲取最新文章