創(chuàng)建一個自定義postProcessStage后期處理的代碼如下
1,先實例化化一個PostProcessStages類死嗦,包含以下參數(shù)
(1)fragmentShader 自定義片元著色器
(2)uniforms 自定義uniform變量
(3)textureScale 紋理的縮放比例拣度,如果為1表示紋理尺寸等于視口大小
(4)forcePowerOfTwo紋理尺寸是否為2的倍數(shù)
(5)sampleMode 配置紋理的采樣方式
(6)pixelFormat 輸出紋理的像素格式默認RGBA
(7)pixelDatatype 輸出紋理的像素數(shù)據(jù)格式刻炒,默認無符號byte
(8)clearColor 輸出紋理的清除顏色
(9)scissorRectangle 裁剪測試的矩形范圍
(10)name 實例化后期處理的名稱耙旦,名稱不能重復朋蔫,否則會拋出錯誤
2测垛,更新posttProcessStage的過程
(1)先執(zhí)行CesiumWidget類的startRenderLoop方法
(2)接著調(diào)用Scene的render方法
(3)在render方法中調(diào)用 scene.updateAndExecuteCommands方法
(4)在updateAndExecuteCommands調(diào)用executeCommandsInViewport方法
(5)在executeCommandsInViewport方法中捏膨,調(diào)用updateAndClearFramebuffers更新和清除幀緩沖區(qū)
(6)updateAndClearFramebuffers調(diào)用postProcess.update更新postProces集合
(7)在PostProcessStageCollection.prototype.update方法中先更新默認加載的postProcessStage例如faxx抗鋸齒,bloom泛光等,然后更新自定義postProcessStage數(shù)組里的每項
(8)在PostProcessStage.prototype.update執(zhí)行創(chuàng)建選中圖元紋理号涯,創(chuàng)建uniform變量目胡,創(chuàng)建uniform紋理變量,創(chuàng)建渲染命令链快,配置采樣器誉己,獲取幀緩沖區(qū)等操作
(9)createSelectedTexture創(chuàng)建選中紋理
這個方法要實現(xiàn)的大致就是從被選中的features數(shù)組依次取出單個feature的被拾取顏色塞到ids Uint8Array數(shù)組中,然后創(chuàng)建一張紋理儲存ids數(shù)據(jù)
(10)createUniformMap方法的作用是將自定義的uniform變量和cesium提供默認的uniform進行合并
(11)updateUniformTextures 更新uniform紋理
(12)createDrawCommand 創(chuàng)建渲染命令
如果存在選中id紋理的話域蜗,會給片元著色器自動加上選中feature的方法“czm_selected”巨双,接著調(diào)用context.createViewportQuadCommand創(chuàng)建視口內(nèi)的渲染命令
(13)createSampler 配置采樣器
3,執(zhí)行posttProcessStage渲染命令
(1)在Scene render方法中更新和渲染primitive完成后會調(diào)用scene.resolveFramebuffers方法處理幀緩沖區(qū)
(2)在resolveFramebuffers方法內(nèi)部執(zhí)行postProces集合的渲染命令
(3)在PostProcessStageCollection.prototype.execute 中先渲染默認的postProcess然后再渲染自定義的postProcess
(4)在PostProcessStage.prototype.execute執(zhí)行渲染命令
(5)PostProcessStage的頂點著色器,后期處理的頂點著色器比較簡單霉祸,使用的是Context.prototype.createViewportQuadCommand默認的頂點著色器
#define OES_texture_float
#line 0
#line 0
attribute vec4 position;
attribute vec2 textureCoordinates;
varying vec2 v_textureCoordinates;
void main()
{
gl_Position = position;
v_textureCoordinates = textureCoordinates;
}
(6)PostProcessStage的片元著色器
precision highp float;
#else
precision mediump float;
#define highp mediump
#endif
#define LOG_DEPTH
#define OES_texture_float_linear
#define OES_texture_float
uniform vec4 czm_viewport;
uniform float czm_pixelRatio;
#line 0
#line 0
uniform sampler2D colorTexture;
varying vec2 v_textureCoordinates;
const int KERNEL_WIDTH = 16;
void main(void)
{
vec2 step = czm_pixelRatio / czm_viewport.zw;
vec2 integralPos = v_textureCoordinates - mod(v_textureCoordinates, 8.0 * step);
vec3 averageValue = vec3(0.0);
for (int i = 0; i < KERNEL_WIDTH; i++)
{
for (int j = 0; j < KERNEL_WIDTH; j++)
{
averageValue += texture2D(colorTexture, integralPos + step * vec2(i, j)).rgb;
}
}
averageValue /= float(KERNEL_WIDTH * KERNEL_WIDTH);
gl_FragColor = vec4(averageValue, 1.0);
}