首页 > 编程语言 >LayaBox引擎3D源码阅读(二、关于Camera渲染的研究)

LayaBox引擎3D源码阅读(二、关于Camera渲染的研究)

时间:2022-11-13 07:55:05浏览次数:41  
标签:Camera 渲染 renderTar scene 源码 context ._ gl 3D

前言

摄像机在3D引擎充当着眼睛的作用,能看到什么不能看到什么,都是Camera中的属性所决定。因此我打算首先研究Camera中的一部分代码,以此来研究Laya3D渲染方面的知识。

本文只去了解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());
首先渲染开始绑定帧缓冲区,将renderTarWebGLFrameBuffer绑定到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复杂太多了,慢慢学习吧~~!

标签:Camera,渲染,renderTar,scene,源码,context,._,gl,3D
From: https://www.cnblogs.com/as3Gui/p/16885349.html

相关文章

  • LayaBox引擎3D源码阅读(一、从继承链开始学习)
    前言在转到3D游戏开发的时候,始终会有所不适,首先最难让人不习惯的就是,空间的转换没办法那么快的就转换过来。另一个始终是分不清纹理,材质,网格,贴图这些名词之间到底什么关系......
  • (作者推荐)【RocketMQ入门到精通】— RocketMQ中级特性能力 | ​长轮询Pull和Push模式
    名言警句任何先进的技术均与魔法无异追本溯源【​​经历了6个月的失踪,我将带着干货终究归来!【RocketMQ入门到精通】​​】RocketMQ消费机制回顾   在众多MQ的体系中,一......
  • Hive3源码总结2
    大数据技术之Hive源码2接上文2.4HQL生成AST(抽象语法树)2.5对AST进一步解析 接下来的步骤包括:1)将AST转换为QueryBlock进一步转换为OperatorTree;2)对OperatorTree进行逻辑优......
  • STL源码
    STL源码:源码定义:1.allocator<T>是一个类,allocator_type是他的别名  T是一个数据类型,value_type是T的别名,pointer是T*的别名 2.try和catch的用法: 3.size_t和siz......
  • C++学习------cerrno头文件的作用与源码学习
    引言cerrno是C++对errno.h头文件的封装,里面实现了一个errno宏,返回上一次的错误码。我们来看看这个宏的具体实现以及其背后的原理。cerrno头文件代码位置:​​www.aospxref.......
  • python3.9 不支持 Axes3D
    学自动编码器的时候用了下axes3D,在pycharm里面跑代码,跑出来的图永远都是空白,没有任何报错,很服。看到知乎有老哥提问,python3.9是不是不支持axes3D,但是没有有意义的回答,抱......
  • Linux-0.11操作系统源码调试
    学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《Orange's:一个操作系统的实现》等书就是教学这个的;另一种方式就是调试操作系......
  • WINDOWS下从源码编译Carla0.9.13+UE4.26
    CARLA是一个开源的自动驾驶模拟器,基于UE4。本篇文章讲述如何在windows系统上从源码编译Carla0.9.13+UE4.26。参考官方文档:https://carla.readthedocs.io/en/0.9.13/build_......
  • 这些不知道,别说你熟悉 Nacos,深度源码解析!
    SpringCloud应用启动拉去配置我们之前写过一篇文章,介绍了一些Spring提供的扩展机制。其中说到了ApplicationContextInitializer,该扩展是在上下文准备阶段(prepareContext......
  • Go 语言项目源码解析:定时任务库 cron
    环境准备首先我们将源码克隆(Fork)为自己的个人仓库,只需要在GitHub项目主页点击Fork按钮,然后输入项目名称点击确认即可。克隆完毕后,可以下载到本地,或者直接在科隆后的Git......