计算机图形学(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
F(x,y)=y-kx-b=0,其中k=\frac{\Delta y}{\Delta x}=\frac{y_1-y_0}{x_1-x_0}\\
假定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画圆法
F(x,y)=x^2+y^2-R^2; \\ d<=0,取P_u;\Delta d=2x_i+3\\ d>0,取P_d;\Delta d=2(x_i-y_i)+5\\ d_0=1.25-R;令d=d-0.25;d_0=1-R
算法步骤:
1.输入圆的半径R
2.计算初始值
d=1.25-R;x=0;y=R;
3.绘制点(x,y)及其在八分圆中的另外七个对称点

d<=0;d=d+2x+3;(x+1,y),M(x_i+1,y_i-0.5)\\ d>0;d=d+2(x-y)+5;(x+1,y-1)
5.当x<y时,重复步骤3和4,否则结束

椭圆的中点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算法:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容