function render中发生了什么?看下面
整理发现有下面几个步骤需要分析一下:
scene.globe.beginFrame(frameState);
scene.updateAndExecuteCommands(passState, backgroundColor);
scene.globe.endFrame(frameState);
scene.globe.beginFrame(frameState);
好像没什么重要的操作,就是reset相关
Globe.prototype.beginFrame = function (frameState) {
...
surface.beginFrame(frameState);
}
QuadtreePrimitive.prototype.beginFrame = function (frameState) {
}
scene.updateAndExecuteCommands(passState, backgroundColor);
Scene.prototype.updateAndExecuteCommands = function (){
...
executeCommandsInViewport(true, this, passState, backgroundColor);
}
这里到updateAndRenderPrimitives方法,比较重要,单独开一篇幅分析
function executeCommandsInViewport(firstViewport,scene,passState,backgroundColor){
...
updateAndRenderPrimitives(scene);
executeCommands(scene, passState); //
}
继续看executeCommands
function executeCommands(scene, passState) {
...
executeCommand(commands[j], scene, context, passState);
}
executeCommand
function executeCommand(command, scene, context, passState, debugFramebuffer) {
...
command.execute(context, passState);
}
DrawCommand.prototype.execute = function (context, passState) {
context.draw(this, passState);
};
进入Context进行绘制
Context.prototype.draw = function (
drawCommand,
passState,
shaderProgram,
uniformMap
) {
//>>includeStart('debug', pragmas.debug);
Check.defined("drawCommand", drawCommand);
Check.defined("drawCommand.shaderProgram", drawCommand._shaderProgram);
//>>includeEnd('debug');
passState = defaultValue(passState, this._defaultPassState);
// The command's framebuffer takes presidence over the pass' framebuffer, e.g., for off-screen rendering.
var framebuffer = defaultValue(
drawCommand._framebuffer,
passState.framebuffer
);
var renderState = defaultValue(
drawCommand._renderState,
this._defaultRenderState
);
shaderProgram = defaultValue(shaderProgram, drawCommand._shaderProgram);
uniformMap = defaultValue(uniformMap, drawCommand._uniformMap);
beginDraw(this, framebuffer, passState, shaderProgram, renderState);
continueDraw(this, drawCommand, shaderProgram, uniformMap);
};