2-3光栅化和着色
2光栅化
定义视锥的话,需要定义一个宽高比和垂直可视角度
光栅,德语的屏幕,光栅化就是在屏幕上显示出来
视口变换:[-1,1]的立方体映射到[width,height],先不管z
采样:1判断像素点在不在三角形内‘
光栅化:对像素点进行赋值
2.1反走样和深度缓冲
一些失真
- 走样:锯齿的别名
- 摩尔纹
- 车轮效应
原因:采样率太低
解决办法:先滤波(模糊),再采样
实际:每个像素不再是二值,而是取像素内颜色的平均
- MSAA:像素内不同颜色面积不好求,变为求4个点的覆盖率
- FXAA
- TAA
超分辨率:低分辨率到高分辨率
3着色
3.1遮挡
- 画家算法:先画远的,再画近的,不行,有bug
- Z-buffering深度缓冲:深度表,一直更新最小深度
处理不了透明物体
3.2着色模型
着色定义:对物体应用不同材质
区域分类:高光,漫反射,环境光
漫反射
输入:观测方向v,法线方向n,光照方向i,表面参数
着色≠阴影
输出:着色点亮度Ld公式:正比于入射角,反比于距离高光
观察方向和镜面反射方向接近,即半程向量和法线方向接近
输出:Ls环境光
输出:La,常数
3.3着色频率
平面着色,求三角形平面法线,着色
顶点着色,求三角形顶点法线,着色,三角形内部颜色插值
(求法:周围平面法线按面积加权平均)
像素着色:插值求三角形内部每个像素法线,着色
3.4图形管线(可渲染管线)
在着色编程中,只需要对1个顶点或像素进行编程
顶点操作,就叫顶点着色器
像素操作,就叫像素着色器,片元着色器
GPU:图形管线的硬件实现,其中有一部分可编程(着色器)
- Vertex Processing:一系列变换
- Triangle Processing:顶点变成三角形
- Rasterization:光栅化
- Fragment Processing:片元处理,包括着色
- Framebuffer Operations:输出合并,缓冲区测试输出
3.5纹理映射
地球仪→映射到展开后的皮(贴图)
三角形的顶点映射到纹理uv坐标上
插值:重心坐标
要先在三维插值,再投影,不然重心坐标会变
纹理过小问题
映射后的纹理坐标非整数
解决方法:双线性插值纹理过大
映射后的纹理坐标是个区域,太大了,只取单个样本会导致摩尔纹(走样)
解决方法:Mipmap,类似范围查询求平均值,特点快,近似,方形
三线性插值各向异性过滤
纹理应用
- 表示环境光
- 球形环境贴图
- 立方体贴图(天空盒)
- 凹凸/法线贴图
- 位移贴图,真·凹凸
- 动态曲面细分
- 三维纹理
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 C++学习笔记!