LayaBox引擎3D源碼閱讀(二、關於Camera渲染的研究)

-前言-

攝像機在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複雜太多了,慢慢學習吧~~!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章