C++ 复习3
函数模板的隐式或显式转换 对于类型不明确的情况,需要使用显式转换告诉编译器类型,隐式转换存在于编译器明确知道是什么类型的情况 。 template <typename T>const T& max(const T& a, const T& b){ return a > b?a:b;}void Test1(){ cout << max(1,2);//隐式 cout << max<double>(1,19.2);//显式} 无法为函数模板指定缺省的模板实参,但类模板可以 模板参数: 这里的typename T就是模板参数,而a,b则是调用参数。通过隐式转换,可以得到一些更简化的用法: template <typename RT, typename T1, typename T2>RT max(const T1& a, const T2& b){cout << "run two" ;r...
C++ 11新特性
1. 支持Long long类型 一般来说编译器支持int 为4个字节,double占用8个字节(2个字), 在C++11中加入了更高精度的long long类型,long double类型,以3、4个字表示(16个字节) 2. 列表初始化或赋值 说是列表初始化,其实本质上就是一种由花括号(类似于列表)的方式来初始变量。 int test_a = {1};test_a = {2}; //赋值int test_b{2};vector<int> test_c = {1,3,4} //同样适用于vector//int test_d = {1.2} //错误,类型转换无法发生在列表初始化//test_d = {1.3} //错误,类型转换无法发生在列表赋值map<string, string> authors = {{"1", "a"},{"2",...
C++ 复习2
一、概述 C++ 起源于1983年,1.0正式版于1998年发布又叫C++98。 2.0版本为C++11(即2011年推出的大版本)。 C++ 简单来说由 语言+标准库组成 C语言的缺点:数据-> 函数的处理方式,导致数据一定是全局才能给各个函数处理。这时C++的面向对象思想就解决了这一问题 c++ 用 class 将member data和member function包在一起来创建object 延展文件名(extension file name)不一定是.h或.cpp,可能是.hpp甚至没有。 二、文件头与类 2.1 Header(头文件)中的防卫式声明(guard) 为了防止多次include复制执行,保证只被一次include,使用防卫式声明。 #ifndef __COMPLEX__#define __COMPLEX__内容#endif 建议所有头文件都有这个声明 2.2 头文件内容布局 前置声明 class complex; 类声明 class complex{....} +类定义 complex::function ... 2.3 ...
GAMES104-NOTE4
1. 引擎中的GamePlay玩法 GamePlay is Everything 1.1 总览 • Event Mechanism • Script System • Visual Script • Character, Control and Camera GamePlay的挑战 各个子系统之间的协作 对于一些游戏中,可能存在各种类型玩法 如何针对市场情况,做出快速迭代 1.2 Event Mechanism Publish-subscribe Pattern 发送者 -> 事件注册到Dispatcher Dispatcher送到各个GO中 GO返回Callback 因此需要三个组件: 组件1: Event Definition 这里的问题是,游戏的玩法多样性导致无法从程序层面预先定义好类型。UE的解决方案下是允许自定义类,生成可编辑的界面。 但另一个问题是,这样还是会需要重编译代码,对于UE来说,允许一种C++代码编译出的DLL的注入机制。 组件2:Callback Registration 预先注册一个callback函数句柄,由某个时刻被Invoke。 ...
GAMES104-NOTE3
1. 游戏引擎的工具链-基础 1.1 总览 在商业引擎中实际工具链的开发是多于引擎本身的 基本Foundation of Tool Chains • What is Game Engine Tool Chains • Complicated Tool GUI • How to Load Asset - Deserialization • How to Make a Robust Tools • How to Make Tool Chain • What You See is What You Get (WYSIWYG) • One More Thing - Plugin 工具链更大的意义在于调合游戏开发各个环节的人的思维模式。 那这么一个庞大的系统的话,最外的基础我们叫做DCC(Digital Content Creation,比如3DMax、Maya、ZBrush、PS、Houdini大量第三方软件产生资产和素材),通过游戏的工具链,进入我们整个游戏的Pipeline。这里有个术语叫做:ACP(Asset Conditioning Pipeline),工具链就在ACP这一层...
GAMES104-NOTE2
1.粒子系统 1.1 基础概念 Emitter 发射器 Particle System 把众多的Emitter结合到一起 游戏中的粒子系统的编辑核心就是如何组合Emitter Spawn Position 发射生成点 Spawn Mode 生成的方式的种类,比如到达一定时机才进行Spawn发射 Simulate 粒子在空间的行为 使用最简单的显式积分 旋转 重力和大小 一些物理特性,如落地的与地面相遇时反弹 Billboard Particle 最古老,每个粒子都是sprite, 面向相机 如果尺寸大,建议用Animated texture,texture表面不断变化 Mesh Particle 每个粒子都是Model, 碎片来自于爆炸 Ribbon Particle Particle拖出一条光带,如刀剑的拖尾的效果。 在飞行过程中会不断拉出一个个的控制点 使用Catmull-Rom 曲线,把曲线拉得更光滑 1.2 Rendering Particle Sort Mode Global的方式 对于整个System进行排序,性能消耗大 通过...
GAMES104-NOTE1
1.游戏引擎导论 什么是游戏引擎 底层框架 生产力工具 复杂性的系统艺术集合 核心难点: 游戏引擎最重要的难点是Realtime,必须在33毫秒之内将结果计算出来,是所有系统的计算结果计算出来,这就是现代游戏引擎设计的核心难点。 游戏引擎不仅仅是一系列的算法,更是生产力的工具,需要成熟的工具链 学习的方式: 以framework为基准,自上往下再细致学习研究 2. 分层 Tool Layer 工具层 Function Layer 基本功能层 Resource Layer 资源层,包括数据等 Core Layer 核心层,内存管理,容器分配,数学运算模块,脚本运行时环境 Platform Layer 平台层,操作系统,平台文件系统,Graphics API, Platform SDK 2.1 Resource Layer: 以特定引擎的格式统一化导入 从Resource到Asset,通过Importer转换到引擎下 通过一个reference文件数据记录关联 GUID 做为唯一识别号 Runtime 资源管理器, 虚拟的文件系统加载和卸载Asset 管理...
计算机图形学编程笔记4
本笔记针对 GLSL-PathTracer源码学习 主要使用opengl实现 opencl: computing language 专注处理GPGPU情况,让显卡更能处理图形以外的计算, opencv, 图片分析的库,用于数字处理等。 一、各格式文件介绍 gltf: https://zhuanlan.zhihu.com/p/65265611 https://github.com/KhronosGroup/glTF/blob/main/specification/2.0/figures/gltfOverview-2.0.0b.png 本质上是一个JSON文件。这一文件描述了整个3D场景的内容。它包含了对场景结构进行描述的场景图。场景中的3D对象通过场景结点引用网格进行定义。材质定义了3D对象的外观,动画定义了3D对象的变换操作(比如选择、平移操作)。蒙皮定义了3D对象如何进行骨骼变换,相机定义了渲染程序的视锥体设置。 glb文件: 二进制版的gltf scene文件: 纯文件记录文件 hdr文件:环境贴图 二、第三方插件 TinyGLTF: 加载gltf model文件 T...
计算机图形学编程笔记3
一、材质 Material == BRDF 漫反射材质 假如一个物品不吸引能量,绝对白板在能量守恒的前提下,可以得出如图: 对半球的立体角积分就是PI。 得出BRDF如果完全不吸引时其实是1/PI Glossy材质 带点镜面,带点金属 Refractive材质 带折射,传播过程中会部分吸收 反射公式推导 折射 全反射现象 如果入射的介质的折射率大于反射的介质折射率时,会发生全反射现象,不会折射 统称BSDF => BTDF(折射)+BRDF Fresnel 入射光与法线的角度决定了有多少光会被反射 当我们人眼离物体表面(玻璃,水或者桌子等)比较近时,此时我们的视线几乎与表面垂直,我们可以看见更多折射过来的光(水底的鱼,玻璃外的东西)。而当们人眼离物体表面比较远时,此时我们的视线几乎与表面平行,我们可以看见更多反射过来的光(倒影)。如图: 通过菲涅尔效应我们不难发现,当入射光方向接近垂直表面时,大部分的能量会被折射,所以我们能看清水底的东西。而当入射光方向接近平行表面时,大部分的能量会被反射,所以我们会看见远处的倒影。 参考: https://zhuanl...
Git Note
工作流程 Rebase的工作流程: 示例: 使用指令: git rebase 【基】 【自己的分支】 切到dev分支下:使用 git rebase master (与 git rebase master dev 等价) 使用工具:记得这里的Branch是选择PICK的分支,右侧为新的基。下图所示,是在最新的master为基,把自己不同的提交pick到顶端去 总结,用指令是更形象更直观的说明rebase后的状态,而工具相关的设计需要根据实际选择的Pick来理解。 参考命令集: 保存本地更新并rebase远端: git stash cleargit stash git checkout developgit checkout .git fetch origin developgit rebase orgin developgit pull origin developgit submodule update --forcegit checkout workgit rebase developgit stash pop 把自己工作的目录推送到远端最新 git checko...








