计算机图形学(MOOC)

https://www.icourse163.org/learn/HUST-1003636001?tid=1206895203#/learn/content?type=detail&id=1211820005&sm=1

计算机图形学

可编程渲染管线

欢迎来到图形世界

初识图形学
研究怎样用计算机来显式,生成和处理图形的原理,方法和技术的一门学科
输入:结构特征数据
输出:图像信号
计算机视觉跟图形学相反,它是输入图形信号,输出结果特征数据
光栅图形学:图元生成,区域填充,裁剪,反走样,消隐等基本图形概念及相应算法
光栅图形学的基础:光栅扫描式图形显示器器,该设备是画点设备(点阵单元发生器)
有趣的图形应用
CAD

认识图形系统

图形系统浅析
计算机图形系统的组成:交换,计算,输入,输出,存储
阴极射线管(CRT,Cathode Ray Tube):
彩色阴极射线管:
荫罩板和三色荧光屏:
扫描方式:
随机扫描:指哪扫哪
光栅扫描:从上往下扫描
光栅扫描是控制电子束按某种光栅形状进行的顺序扫描,而字符,图形是靠Z轴信号控制辉亮形成.
图形显示子系统结构
光栅扫描图形显示子系统:CPU+主存+GPU+视频显示控制器

可编程渲染管线

渲染管线的主要功能:决定在给定虚拟相机,三维物体,光源,照明模式,以及纹理等诸多条件的情况下生成会绘制一幅二维图像的过程
GPU渲染管线:

  1. 应用阶段[CPU]:将需要在屏幕显示的几何体(绘制图元),比如点,线,矩阵等输入到绘制管线的下一阶段.具体包括图元的顶点数据,摄像机位置,光照纹理等参数.
  2. 几何阶段[GPU]:将顶点数据最终进行屏幕映射
    1. 将各个图元放入到世界坐标中(模型变换)
    2. 根据光照纹理等计算顶点处材质的光照着色效果
    3. 根据摄像机的位置,取景范围进行观察变换和裁剪
    4. 最后进行屏幕映射(把三维模型转换到屏幕坐标系中)
  3. 光栅化阶段[GPU]:给每个像素正确配色,以便绘制整幅图形

探秘GPU渲染管线
A.几何阶段
顶点着色器(建模坐标系->世界坐标系):

  1. 模型变换:不同坐标系的模型变换到同一坐标系(世界坐标)中
  2. 视图变换:世界空间的内容转换到相机空间(观察空间)
  3. 顶点着色:确定顶点上材质上的光照效果
    几何着色器,也就是曲面细分(世界坐标系->观察坐标系):
  4. 输入的是顶点数据
  5. 可高效创建和删除图元
    裁剪(观察坐标系->屏幕坐标系):
  6. 投影变换,裁剪
    屏幕映射

B.光栅化阶段
图形设置->图形遍历->片元着色->片元操作

着色编程
索引缓冲对象(EBO):存储顶点的索引信息; (减少重复顶点数据)
顶点缓冲区对象(VBO):存储顶点的各种信息.(在显卡申请一段空间,数据直接从GPU里取)
顶点数组对象(VAO):

图形思维的起点

点和直线-DDA算法(上)
数值微分法(Digital Differential Analyzer):一种直接从直线的微分方程生成直线的方法
通过给定直线的两端点坐标P_0(x_0y_0)和P_1(x_1y_1),得到直线的微分方程:\\ \frac{dy}{dx}=\frac{\Delta y}{\Delta x}=\frac{y_1-y_0}{x_1-x_0}=k\\ x_{i+1} = x_i+\epsilon*\Delta x\\ y_{i+1} = y_i+\epsilon*\Delta y\\ \epsilon=\frac{1}{max(|\Delta x|,|\Delta y|)}\\ 使得\epsilon\Delta x或\epsilon\Delta y在最大位移方向上每次走一步
每次走一步:\\ 令:\epsilon=\frac{1}{max(|\Delta x|,|\Delta y|)}\\ 1.x方向:斜率值的绝对值小于1\\ \epsilon=1/|\Delta x| ,也就是\epsilon=|\Delta x|的导数\\ \begin{cases} x_{i+1}=x_i\pm 1\\ y_{i+1}=y_i\pm k \end{cases}\\ 2.y方向:斜率绝对值大于1: \epsilon=1/|\Delta y|\\ \begin{cases} x_{i+1}=x_i\pm 1/k\\ y_{i+1}=y_i\pm 1 \end{cases}\\

点和直线-Bresenham算法
中点Bresenham算法:输入P0和P1,输出最佳逼近这条直线的像素点集
y=kx+b

假定0<=k<=1,x是最大位移方向
如果:d=F(P_m(x+1,y+0.5))<0,说明P_m在理想直线下方,所以取P_u\\ 误差项:\\ 1.d<0时,d=F(P_m(x+2,y+1.5))=d+1-k\\ 2.当d>=0时,d=F(P_m(x+2,y+0.5))=d-k\\ d_0=F(P_m(0+2,0+0.5))=0+0.5-k\\ 将d放大2\Delta x倍去除小数\\ 步骤:\\ 在0<=k<=1情况下的整数的中点Bresenham算法:\\ 1.输入P0和P1\\ 2.计算初始值\Delta x,\Delta y,d=\Delta x-2\Delta y,x=x_0,y=y_0\\ 3.绘制点(x,y). 判断d的符号;d<0,则(x+1,y+1),d=d+2\Delta x-2\Delta y;\\ 否则(x+1,y),d=d-2\Delta y\\ 4.当直线没有画完时,重复步骤3,否则结束
例子:P_0(0,0)和P_1(8,5);\because k=5/8, \therefore最大位移方向为x方向\\ d_0 = \Delta x-2\Delta y= 8-2*5=-2\\ d<0往右上方时增量为:2\Delta x-2\Delta y=2*8-2*5=6\\ d>=0往正右方向的增量为-2\Delta y=-2*5=-10
改进Bresenham算法
d=0.5时,p_u和P_d到理想线距离一样\\ d>0.5,y_{i+1}=y_i+1; 否则y_{i+1}=y_i\\ 改进1:\\ d_0=0,令e=d-0.5,e_0=-0.5\\ e=e+k\\ x_{i+1}=x_i+1\\ e>0 y_{i+1}=y_i+1,此时e=e-1\\ e<=0 y_{i+1}=y_i\\ 改进二:\\ e=e*2\Delta x; e_0=-\Delta x\\ e=e+2\Delta y\\ x_{i+1}=x_i+1\\ e>0 y_{i+1}=y_i+1,此时e=e-2\Delta x\\ e<=0 y_{i+1}=y_i\\

朴素的软光栅二

圆(上)
x^2+y^2=R^2\\ y=\sqrt{R^2-x^2},x=\sqrt{R^2-y^2}\\ \because \Delta x>\Delta y;\therefore x方向为最大位移方向\\ x_{i+1}=x_i+1, x\in[0,R\sqrt{2}]\\ y_{i+1}=\sqrt{R^2-(x_{i+1})^2}\\ 方法二:\\ 圆的极坐标方程为:\begin{cases} x=Rcos\theta\\ y=Rsin\theta \end{cases}\\ 其中:\theta\in[0,π/4]\\ \theta_{i+1}=\theta+\Delta\theta\\ x_{i+1}=round(Rcos\theta_{i+1})\\ y_{i+1}=round(Rsin\theta_{i+1})

Bresenham画圆法

算法步骤:
1.输入圆的半径R
2.计算初始值
d=1.25-R;x=0;y=R;
3.绘制点(x,y)及其在八分圆中的另外七个对称点


5.当x

椭圆的中点Bresenham算法
椭圆方程:\frac{x^2}{a^2}+\frac{y^2}{b^2}=1;a是长半轴,b是短半轴\\ F(x,y)=b^2x^2+a^2y^2-a^2b^2\\ 引入法向量找到分界点:\\ N(x,y)=\frac{\partial F}{\partial x}i+\frac{\partial F}{\partial y}i=\\ 2b^2xi+2a^2yj\\ d1<=0 取p_u;\Delta d1=b^2(2x_i+3)\\ d1>0 取P_d;\Delta d1=b^2(2x_i+3)+a^2(-2y_i+2)\\ d1_0=b^2+a^2(-b+0.25)^2\\ 椭圆下半部分:\\ d2>0 取P_l; d2=a^2(-2y_i+3)\\ d2<=0 取P_r; d2=b^2(2x_i+2)+a^2(-2y_i+3)\\ d2_0=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2

多边形(上)
x-扫描思想:
1.确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(y_{min}和y_{max})\\ 2.从y=y_{min}和y=y_{max},每次用一条扫描线进行填充\\ 3.对一条扫描线填充的过程可分为四个步骤:\\ a.求交;b.排序;c.交点配对;d.区间填色\\ 交点个数=构成这个顶点的两条边位于扫描线上方的条数
多边形(中)
y-向连贯性算法:
1.创建一个链表,存放所有y坐标(节点称为桶)
2.每个节点存放最低y坐标相关的直线
数据结构:
桶表,链表

多边形(下)
边缘填充算法(重复访问的点很多)
栅栏填充算法:
按任意顺序处理多边形的每条边(处理每条边与扫描线的交点时,将交点与栅栏之间的像素取补)
边标志算法(先画边界后填色):
1.用一种特殊的颜色在帧缓器中将多边形的边界勾画出来;
2.将着色的像素点依x坐标递增的顺序两两配对;
3.将每一对像素所构成的扫描线区间内的所有像素置为填充色
算法步骤:
1.打标记:将多边形的每条边进行直线扫描转换(将多边形边界所经过的像素打上标记)
2.填充:Inside,初值:假,遇到标记点:取反,真:填充,假:不填充

区域填充
区域的定义:指已经表示成点阵形式的填充图形,它是像素集合
种子填充思想(Photoshop的油漆桶)
以边界表示为例看种子填充思想:
边界填充算法:
算法输入:种子点坐标(x,y),填充色和边界颜色
数据结构:栈结构
算法输出:最佳逼近的像素点集.
4-连通边界填充算法步骤:
种子像素入栈,栈非空时重复执行三步操作:
1.栈顶像素出栈
2.将出栈像素置成填充色
3.检查出栈像素的4-邻接点,若其中某个像素点不是边界色且未置成多边形色,则把该像素入栈
泛填充算法通常用于给区域重新着色

改变图元的模样
填充

必不可少的反走样
1.提高分辨率
2.过取样:重叠过取样
3.区域取样
4.加权区域取样点

探秘造型技术

初识造型技术
图形的构成:体-面-环-边-顶点的层次记录信息
实体的定义:正则形体+二维流形
r*A=c*i*A\\ A:一个点集;i:取内点运算;c:取闭包运算\\ i*A即为A的全体内点组成的集合,是一个开集\\ c*i*A为A的内点闭包,是一个闭集\\ r*A称为A的正则集
实体的完整定义:对于一个占据有限空间的正则形体,如果其表面是二维流形,则该正则形体为实体

样条上
在绘图术语中,样条是通过一组指定点集而生成平滑曲线的肉韧带.
样条曲线(spine curve)指由多项式曲线端连接而成的曲线,在每段的边界出满足特定的连续性条件
样条曲面:可以使用两组样条曲线进行描述
插值和逼近样条(Photoshop的钢笔):

样条下
Bezier曲线和曲面(样条逼近算法)

规则形体(上)
实体模型的三类表示:
1.边界表示(Boundary Representation):比如多边形平面和样条曲面
2.构造实体几何表示(Constructive Solid Geometry):
3.空间分割表示(Space-Partitioning)

不规则形体
1.分形几何
2.粒子系统

裁剪与屏幕映射

编码裁剪算法-Cohen-Sutherland(线段裁剪):
1.直线完全可见
2.直线完全不可见
3.直线与裁剪窗口相交
中点裁剪算法
裁剪思想(下)
Liang-Barsky裁剪算法(解方程组)

三维空间的多边形
Sutherland-Hodgeman多边裁剪:将多边形边界作为一个整体,每次用窗口的一条边界对要裁剪的多边形进行裁剪
Weiler-Atherton算法:

屏幕映射
顶点着色器->几何着色器->裁剪->屏幕映射
->模型变换->视图变换->投影变换->屏幕映射
建模坐标系->世界坐标系->观察坐标系->观察坐标系->屏幕坐标系
局部空间->世界空间->观察空间->裁剪空间->屏幕空间

你可能感兴趣的:(计算机图形学(MOOC))