GAMES101(7-9):Shading GAMES101-ShadingVisibility/occlusion(可见性/遮盖)z-buffer算法 本质就是对一个物体的三角形面片的每个像素维护深度最浅处。 图示: 复杂度:假设每个三角形覆盖的像素数都是一个常数值,那么n个三角形复杂度就是$O(n)$ shading 基本理论我们可以认为材质影响着物体的着色 我们看一个图: 我们认为决定材质的三种光为:高光,漫反射,间接光照(环 2022-07-24 图形学 GAMES101
现代C++中的constexpr,内敛变量 constexpr简单认识constexpr编译期编程很烧脑,为此有时候一个简单的计算也需要写大量代码,C++为此做了很多改进,让编译期编程简单了很多。当然对于一些没有改进的东西仍需要模板元编程,因此模板元编程仍然是很重要的一部分。 考虑下面代码是否可以运行? 1234567891011121314int sqr(int n){ return n*n;}int main( 2022-07-24 C++
C++: SFINAE SFINAE一个基本的重载协议(SFINAE最初思想来源)SFINAE全称为:替换失败非错(substituion failure is not an error) 我们已经看了不少的模板特化,那么当一个函数名和某个函数模板名称匹配后,他的重载协议大致如此: 根据名称找出所有适用的函数和函数模板 对于适用的函数模板,要根据实际情况对模板形参进行替换;替换过程中如果发生错误,这个模板会被丢弃 在上 2022-07-24 C++
模板元编程(编译期计算)初探 模板元编程(编译期计算)初探编译期求Fib什么是编译期计算: 123456789101112131415161718192021222324template<int n>struct fib{ static_assert(n>=0, "Argument must be non-negative"); static const int value = fib& 2022-07-24 C++
C++:ObjectSlicing和多态 ObjectSlicing和多态前置知识多态不过多介绍,在之前写的文章中有讲到,主要从这两方面理解到多态即可: 1.虚指针(vptr)和虚表(vtbl) 2.动态绑定和静态绑定 ObjectSlicing对象切片12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class 2022-07-17 C++
C++ 理解智能指针(手写一个简单的智能指针) 简单手写一个智能指针,不会过多关注具体功能上的实现,而是思想上的实现。 比如指针上的诸多行为++,--这里不会多次提到,而使一些关于智能指针特性和思想的实现。 RAII与手写智能指针RAII准则,封装指针1234567891011121314151617181920212223242526272829303132class shape{public: shape() 2022-07-17 C++
GAMES101(1-4):图形学数学基础和Transformation GAMES101-现代计算机图形学入门Lec1: Overview本课包含的几个基本的tipic: 光栅化 Rasterization 曲线/曲面Curves and Meshes 光线追踪 Ray Tracing 动画/模拟 Animation/Simulation Lec2: Review of Linear Algebra向量 $\vec{a}$,代表一个方向,因此向 2022-06-26 图形学 GAMES101
GAMES101(5-6):Rasterization和反走样 GAMES101(5-6):Rasterization和反走样Rasterization(Triangles)简单来说光栅化的目的就是将想要展现的物体给真正现实到屏幕上的过程,因为我们的物体其实都是一个个顶点数据来表示的,如何表这些蕴含几何信息的数据转化为屏幕上的像素就是光栅化所考虑的东西。比如说一条直线,究竟该用哪些像素点去逼近它,一个三角形,又用哪些像素集合表示它,这都是光栅化的过程。 采样 2022-06-26 图形学 GAMES101
C++11新特性 ariadic Templates数量不定的模板参数下面是一个数量不定的模板参数的例子,print()函数做得是一个将一堆参数输出的动作。 每次取出第一个参数输出,剩下的参数包递归下去每次输出参数的第一个。但请不要忘记写void print(){ },因为当参数空的时候,你需要一个无参的print来结束print的递归。 如果你想知道 后面那一部分参数包有几个,你可以使用sizeof...(arg 2022-05-27 C++
Lambda函数-用法/实现/广义捕获 Lambda函数-用法/实现/广义捕获Lambda函数用法1234[捕获列表] (参数) mutable noexcept/throw() -> 返回值类型{ 函数体;}; 1.[捕获列表] [ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略。在方括号内部,可以注明当前 lambda 函数的函数体中可以使用哪些“外部变量”。 所谓外部变 2022-05-07 C++