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
复杂太多了,慢慢学习吧~~!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧