GAMES101 作业3
本次作业要求实现一个简单的光栅化渲染器, 实现法向量、颜色、纹理颜色的插值, 实现 Blinn-Phong 模型, 实现高度图以及置换映射 我的所有GAMES101作业的仓库地址: GAMES101-Assignments 投影矩阵修改 之前的投影矩阵感觉有点问题, 这里重新实现一下 修改main.cpp中的get_projection_matrix()函数, 实现投影矩阵的...
本次作业要求实现一个简单的光栅化渲染器, 实现法向量、颜色、纹理颜色的插值, 实现 Blinn-Phong 模型, 实现高度图以及置换映射 我的所有GAMES101作业的仓库地址: GAMES101-Assignments 投影矩阵修改 之前的投影矩阵感觉有点问题, 这里重新实现一下 修改main.cpp中的get_projection_matrix()函数, 实现投影矩阵的...
纹理不但可以用来表示物体的颜色, 还可以用来记录很多信息. 环境光照 将任何一个方向来源的光照都记录下来, 保存在一个贴图中, 这个贴图就是环境光照贴图. 环境光也可以记录在一个球面上, 这个球面就是环境光照球(Spherical Environment Map) 环境光球展开后可以得到如下的图象: 展开后, 我们可以看到, 在上下边缘部分, 会有较大的扭曲, 为了解决...
重心坐标插值 在之前的课程中, 提到了逐顶点着色和逐像素着色, 其中逐顶点着色是在顶点上计算颜色, 然后在三角形内部的像素上对颜色进行插值, 逐像素着色是在每个像素上计算颜色, 但是每个像素的法线也是通过插值得到的. 插值的原因, 内容和方法 重心坐标的计算是为了在三角形内部的像素上进行插值 插值的原因: 根据三角形顶点的属性, 可以通过插值得到三角形内部所有点的属性 插值...
着色频率 把颜色应用在一个面上, 应用在一个顶点上, 或者应用在一个像素上, 这些都是着色的频率. 通常来说, 着色的频率越高, 渲染的效果就越好, 但是性能也就越差. 其中: 如果在顶点上着色(例如图中在矩形的四个顶点上着色), 那么在矩形内部的像素就会使用顶点的颜色进行插值. 逐三角形着色 又叫 平面着色 Flat Shading 一个三角面内的颜色完全相同, 根据三角形的...
实现一个三角形栅格化算法, 能够在屏幕上绘制实心三角形, 并正确处理深度缓冲, 最终实现输出预期的图像. 我的所有GAMES101作业的仓库地址: GAMES101-Assignments 判别点是否在三角形内 常用的方法: 计算顶点与三角形的顶点连线向量与三角形的边的叉乘, 如果三个叉乘的方向都一致, 则该点在三角形内. static bool insideTriangle(int...
着色的定义 着色(Shading) 在计算机图形学中, 指的是对不同物体应用不同材质的过程. Blinn-Phong 反射模型 高光(Specular Highlights): 比较光滑的物体表面, 会出现类似镜面反射的效果, 反射颜色较亮 漫反射(Diffuse Reflection): 光线击中物体表面后, 会均匀地反射到各个方向, 一般是物体表面颜色变换不明显的部分...
深度缓冲 画家算法 画家算法(Painter’s Algorithm): 从后往前绘制, 后绘制的像素会覆盖先绘制的像素 例如下图中, 从后往前绘制, 会先绘制远处的山脉, 再绘制草地, 草地会覆盖部分山脉的像素, 然后绘制树木, 树木会覆盖部分草地的像素, 也会覆盖部分山脉的像素: 但是画家算法有一个问题, 如果两个物体互相遮挡, 那么就会出现问题, 如下图所示: 深度缓...
这是GAMES101的正式作业的作业1, 要求实现两个矩阵计算, 包括模型变换(只有旋转)矩阵和透视投影矩阵 我的所有GAMES101作业的仓库地址: GAMES101-Assignments 模型变换矩阵 参数只有旋转角度rotate_angle, 要求实现绕Z轴旋转rotate_angle角度的矩阵 Eigen::Matrix4f get_model_matrix(float r...
指针 普通的指针: 指向某个内存区域的地址变量 如果一个指针指向的内存是动态分配的, 那么即使这个指针离开了所在的作用域, 这块内存也不会被自动释放, 从而导致内存泄漏. 如果一个指针指向的是一个已经被释放的内存区域, 那么这个指针就是一个悬空指针, 使用悬空指针会导致不可预知的错误. 如果定义了一个指针却没有初始化, 那么这个指针就是一个野指针, 使用野指针访问内存一般会...
虚函数表指针 虚函数引入后类的变化 class A {}; A a; cout << sizeof(a) << endl; // 输出对象的大小是1 一个空类, 只要对象占用内存空间, 那么这个类的大小至少是1; class A { void func1() {} void func2() {} }; A a; cout << s...