-前言-
攝像機在3D引擎充當着眼睛的作用,能看到什麼不能看到什麼,都是Camera中的屬性所決定。因此我打算首先研究Camera中的一部分代碼,以此來研究Laya在3D渲染方面的知識。
本文只去瞭解Camera在幀渲染過程中做了什麼,具體每個細節如何實現,還需要慢慢研究的。
-正文-
攝像機渲染函數做了什麼
攝像機渲染函數render定義於laya.d3.js中,由幀循環渲染提交函數調用。
//渲染
render(shader=null,replacementTag=null){
if(!this._scene){
return;
}
var gl = Laya.LayaGL.instance;//WebGL2RenderingContext
var context = RenderContext3D._instance;//RenderContext3D
var scene = context.scene = this._scene;//Laya.Scene3D 當前場景
...//關於陰影部分的邏輯代碼
context.camera = this;
scene._preRenderScript();//Script腳本渲染前執行函數 執行腳本的onPreRender函數
//渲染對象
var renderTar = this._renderTexture || this._offScreenRenderTexture;
//開始渲染...........
//綁定幀緩衝區
//bindFrameBuffer,將renderTar的WebGLFrameBuffer綁定
(renderTar) && (renderTar._start());
//計算出當前攝像機的視窗範圍
context.viewport = this.viewport;
this._prepareCameraToRender();
this._applyViewProject(context,this.viewMatrix,this._projectionMatrix,renderTar ? true:false);
//***視野剪裁
scene._preCulling(context,this,shader,replacementTag);
//Scene3D的場景清除函數,主要設置WebGL渲染視窗
//gl.viewport
//gl.enable(gl.SCISSOR_TEST);//開啓視野剪裁
//gl.scissor(x,y,w,h)//設置視野範圍
scene._clear(gl,context);
//**渲染場景
scene._renderScene(context);
//用戶腳本執行
scene._postRenderScript();
(renderTar) && (renderTar._end());
//結束渲染..........
//其餘邏輯..
}
上面渲染函數核心就是渲染開始調用renderTar._start()到渲染結束renderTar._end之間的邏輯。
每一步都會做很多事情,都值得深入研究。
渲染開始
(renderTar) && (renderTar._start());
首先渲染開始綁定幀緩衝區,將renderTar的WebGLFrameBuffer綁定到WebGL
設置渲染視窗
context.viewport = this.viewport;
這一步也會計算攝像機的視窗範圍,視窗範圍一般就是遊戲窗口的大小。
設置shader中的視圖矩陣信息
this._applyViewProject(context, this.viewMatrix, this._projectionMatrix, renderTar ? true : false);
這部分設置了着色器程序裏面的視圖矩陣信息,這部分邏輯還需要比較紮實的矩陣知識,這樣才知道每個矩陣爲什麼之間要這樣運算。
視野裁剪
scene._preCulling(context, this, shader, replacementTag);
這部分通過算法設置render是否顯示,如果顯示就提交渲染提交,這部分是比較重要的函數,適合深入研究。
清除場景
上面的步驟都是對於數據的準備,接下來就開始進入渲染步驟了。
scene._clear(gl, context);
這一步清除當前場景
場景渲染
scene._renderScene(context);
這一步就是實質的場景渲染函數的邏輯了,也是很值得深入研究的一部分邏輯。這裏面就對應很多很多場景渲染函數,我個人打算是先簡單瀏覽一遍這部分所有代碼,再看看對應的書籍,最後再來細讀這部分代碼。這個過程儘管很長,不過對於剛入坑3D遊戲開發的,個人認爲這是比較穩妥的線路。3D的關於圖形學的技術比2D複雜太多了,慢慢學習吧~~!