-前言-
錄影機在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複雜太多了,慢慢學習吧~~!