Cesium 高性能擴展之DrawCommand(一):入門

歡迎關注微信公號【三維網(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】,第一時間獲取最新文章

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 著色器語言 GLSL (opengl-shader-language)入門大全 基本類型: 類型說明void空類型...
    困惑困惑困惑閱讀 946評論 0 0
  • 基本類型: 類型說明void空類型,即不返回任何值bool布爾類型 true,falseint帶符號的整數(shù) sig...
    林鵬_dev閱讀 1,829評論 0 1
  • 早就聽過大名鼎鼎的 OpenGL,卻遲遲沒有實踐學習,有些慚愧。今天開始通過實踐+博文方式學習掌握 OpenGL。...
    王英豪閱讀 23,194評論 1 33
  • 著色器(Shader) 著色器是運行在GPU上的小程序。這些小程序為圖形渲染管線的一個特定部分而運行。從基本意義上...
    IceMJ閱讀 1,824評論 0 6
  • 前言 本文是關于OpenGL ES的系統(tǒng)性學習過程,記錄了自己在學習OpenGL ES時的收獲。這篇文章的目標是學...
    秦明Qinmin閱讀 4,535評論 0 24

友情鏈接更多精彩內容