计算机图形学复习(自用) 男娘i 2022-12-29 04:59 266阅读 0赞 ### 文章目录 ### * * * * 1. dll文件与lib文件的区别与作用 * * :one: 各种文件 * :two: 内存结构 * 2. 相机拍摄景物模型 * 3. OpenGL支持绘制的图元 * * GL\_POINTS * GL\_LINE\_STRIP * GL\_LINES * GL\_LINE\_LOOP * GL\_TRIANGLES * GL\_TRIANGLE\_STRIP * GL\_TRIANGLE\_FAN * GL\_QUADS * GL\_QUAD\_STRIP * GL\_POLYGON * 4. OpenGL 的缺省投影方式 * * 正投影/平行投影 * 5. \*\*直线段的扫描算法\*\* * * \*\*DDA算法\*\* * 特点: * \*\*Bresenham算法\*\* * 6. Quzi * 7. 三维观察流程 * 8. 关于多边形的几个概念 * 9. 多边形扫描线转换的扫描线算法 * * 交点取舍问题: * 多边形边界上的像素取舍: * \*问题:如果某些变正好位于扫描线上,则交点算几个/0个\* * \*\*算法实现\*\* * * \*\*求交、排序、配对、填色方法:\*\* * \*\*分析:\*\* * 10. 画有效边表以及新边表 * 11. 图形流水线 * * CPU与GPU的区别 * 图形流水线的几个步骤以及各操作内容 * 12. 阶段性复习 * * glColor3f(1.0,0.5,0.5)中的 f 是什么意思 * 什么是透视投影和平行投影 * glFrustum 和 gluPerspective * * glFrustum (GLdouble left,GLdouble right, GLdouble bottom,GLdouble top,GLdouble near,GLdouble far) 函数中的6个参数的含义是什么 ? * gluPerspective(60.0,1.0,1.5,20.0) 中参数的含义又是什么 ? * 什么是视区?如何用 glViewport 来定义一个视区 * glLoadIdentity 的作用是什么 * heap 与 stack 的区别 * OpenGL缺省设置时,相机在什么位置,观察方向是哪里 * 为什么说OpenGL是一个状态机? 试着说出它的几种状态量 * 13. 区域填充 * * 四联通、八连通 * 区域的表示方法 * 边界表示的 4 连通区域填充算法(递归算法) * 边界表示的8连通区域填充算法(递归算法) * 使用邻接点的递归算法分析 * 区域填充的扫描线算法(递归算法) * 14. 反走样 * * 走样的现象 * 反走样的方法 * 15. 裁剪 * * 编码裁剪法 * * 编码 * 编码特征 * Liang—Barskey 算法 * * 问题:计算出来的u值都满足 0 < u <1 吗? * 如何选取合适的u~s~和u~e~ * 16. 多边形的裁剪 * * 能否用直线的裁剪算法裁剪多边形的每条边 * Sutherland-Hodgman 算法 * * 优点 * 缺点 * Weiler-Atherton算法(双边裁剪算法) * * 多边形顶点的排列顺序 * 17. Drawcall * 18. 内存泄漏 * 19. 图形变换 * * 平移变换 * 旋转变换 * 比例变换 * 合矩阵 * 点的坐标变换 * 20. 二维观察流程 * 21. 窗口到视区变换的特点 * 22. 绕任意轴做旋转变换的问题可以分三步 * 23. 三维观察 * * 观察坐标系及其定义 * 投影类别以及概念 * * 透视投影 * 平行投影 * 正轴测 * 斜投影 * 灭点 * 主灭点 * 24. 光照模型与消隐 * * 简单光照模型 * 环境光的经验模型 * 漫反射 * Lambert 光照模型 * 镜面反射 * Phong 光照模型 * 完整的 Phong 光照模型 * 消隐算法中的基本技术 * * 背面剔除 * Z-Buffer 算法 * Z-Buffer算法和光线投射法的比较 * 明暗处理 * Ray Tracing 的终止条件 * Blinn-Phong 光照模型 * GL LightModel 参数 * 25. 纹理与阴影 * * 类型 * 颜色纹理基本思想 * 连续法和离散法的比较 * 纹理的实施策略 * * 三个空间和两个映射 * 减轻走样的方法 * 纹理值如何参与光照计算 * 26. OpenGL 函数汇总 * * 1. glviewport(GLint x, GLint y, GLsizei width, Glsizei height) * 2. glClearColor(R,G,B,A) * 3. glClear(mask) * 4. glFlush(void) * 5. auxInitDisplayMode(GLbitfield mask) * 6. glFrustum (GLdouble left,GLdouble right, GLdouble bottom,GLdouble top,GLdouble near,GLdouble far) * 7. gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) * 8. gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz) * 9. glutInitDisplayMode(mode) * 10. glutPostRedispaly() * 11. glutSwapBuffer * 12. glBlendFunc() * 13. glShadeModel() * 14. glHint(target,hint) * 16. glDepthFunc(func) * 17. glFrontFace(mode) * 18. glEnable() * 19. glLightModeli() * 9. glutInitDisplayMode(mode) * 10. glutPostRedispaly() * 11. glutSwapBuffer * 12. glBlendFunc() * 13. glShadeModel() * 14. glHint(target,hint) * 16. glDepthFunc(func) * 17. glFrontFace(mode) * 18. glEnable() * 19. glLightModeli() #### 1. dll文件与lib文件的区别与作用 #### ##### 1️⃣ 各种文件 ##### .h 文件:变量、函数的声明 .C/Cpp:函数的实现 .obj:每个 cpp 文件编译的结果文件,二进制 .exe 文件:多个 obj 文件连接成的可执行文件 **lib**:编译时 cpp 文件需要 include lib 库中对应的 h 文件,**连接时 obj + lib = exe** **dll** :编译时 include h 文件,连接时 lib 不存储函数体,只存储每个函数在 dll 中相对起始地址的偏移量,只有在程序运行时才把 dll 文件调入内存 ##### 2️⃣ 内存结构 ##### 对于lib文件,每个程序运行时都会将其调用到运行空间内,同一个 lib 在内存中复制了多个地方 对于 dll 文件,dll 文件单独占据一块内存空间 #### 2. 相机拍摄景物模型 #### ![0597d4015bfd5431a700016841df84f4.png][] #### 3. OpenGL支持绘制的图元 #### ##### GL\_POINTS ##### ![39496a8f1d01440b6327196b1d2d8d4e.png][] ##### GL\_LINE\_STRIP ##### ![372e0e4c6a2915648f1f8297581e32bb.png][] ##### GL\_LINES ##### ![69fe980f7573e4bbcbd5c775d2e0dc75.png][] ##### GL\_LINE\_LOOP ##### ![45b50da6155b921564e8a7ccabc5138e.png][] ##### GL\_TRIANGLES ##### ![c47600642cc8d6d66dcd1f5d29f30527.png][] ##### GL\_TRIANGLE\_STRIP ##### ![image-20201217155612227][] ##### GL\_TRIANGLE\_FAN ##### ![image-20201217155620963][] ##### GL\_QUADS ##### ![image-20201217155628573][] ##### GL\_QUAD\_STRIP ##### ![image-20201217155636824][] ##### GL\_POLYGON ##### ![image-20201217155646656][] #### 4. OpenGL 的缺省投影方式 #### ##### 正投影/平行投影 ##### ![image-20201217155836605][] #### 5. **直线段的扫描算法** #### ##### **DDA算法** ##### k<=1时:yi\+1 = yi+k,x++ k>1时:xi+1 = xi \+ 1/k,y++ ##### 特点: ##### DDA算法消除了浮点数乘法,但是仍存在浮点数加法 增量算法 参数都是浮点表示,每一步都要四舍五入后取整 ##### **Bresenham算法** ##### ![image-20201217162046040][] #### 6. Quzi #### ![image-20201217162210918][] #### 7. 三维观察流程 #### ![image-20201217162323059][] #### 8. 关于多边形的几个概念 #### * **区域**:指一组相邻而又连通、并具有相同属性的象素集;区域的封闭轮廓线通常是封闭的简单多边形;区域轮廓可由多边形逼近。 * **区域填充**:在区域内,生成某一属性的实心或图案的过程。 * **多边形的两种表示形式**:**顶点表示**用多边形的顶点序列来表示;**点阵表示**是用位于多边形内的象素集合来表示; * **扫描转换多边形或多边形的填充**:从多边形顶点表示到点阵表示的转换。 #### 9. 多边形扫描线转换的扫描线算法 #### **原理**:按顺序计算扫描线与多边形的相交区域,用要求的颜色显示这些区间的象素,即完成填充工作 **步骤**: 1. 求交:计算扫描线与多边形每个边的交点。 2. 排序:把所求出的交点按照X递增(减)排序 3. 交点配对:第一与第二,第三与第四等等,每对交点代表扫描线与多边形的一个相交区域。 4. 区间填色:把相交区域内的象素设置成多边形的颜色,把相交区域外的象素设置成背景色。 **注意**:交点不一定有偶数个 **问题**: ##### 交点取舍问题: ##### 若共享顶点的两条边分别落在扫描线的两边,交点只算一个; 若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个。 ![image-20201217163244532][] ##### 多边形边界上的像素取舍: ##### 多边形上方的水平边界线将不被填充;多边形非水平边的局部最高点不被填充。 多边形填充时边界“下闭上开,左闭右开” ##### *问题:如果某些变正好位于扫描线上,则交点算几个/0个* ##### ##### **算法实现** ##### ###### **求交、排序、配对、填色方法:** ###### 为了计算交点,最方便的方法是把多边形的每条边放到一张表中; 处理每条扫描线时,按顺序取出每条边并求交。 ###### **分析:** ###### 一条扫描线往往仅与几条边相交,甚至和所有边都不相交,但计算时依然要遍历多边形的所有边进行求交计算,效率低下!如果对于某条扫描线来说,已经知道了它会和哪些边相交最好! #### 10. 画有效边表以及新边表 #### 有效边/活性边的内容: ![image-20201217164526092][] ![image-20201217170945576][] #### 11. 图形流水线 #### ![image-20201219085658643][] ##### CPU与GPU的区别 ##### > CPU负责时序逻辑,GPU负责图形绘制 ##### 图形流水线的几个步骤以及各操作内容 ##### > GPU中分顶点操作、光栅化、片源操作 > > 顶点操作中包括几何变换、投影、裁剪,以及视口变换,目的是将三维模型转化为二维图形 > > 光栅化是目的是确定哪些像素构成图形 > > 片源操作包括贴图、颜色测试、深度测试以及渲染等 #### 12. 阶段性复习 #### ##### glColor3f(1.0,0.5,0.5)中的 f 是什么意思 ##### > glColor3f(R,G,B) 中 f 表示参数类型为 float 型 ##### 什么是透视投影和平行投影 ##### > 透视投影:从某个投射中心将物体投射到单一投影面上得到的投影 > > 平行投影:在一束平行光线照射下形成的投影 ##### glFrustum 和 gluPerspective ##### ###### glFrustum (GLdouble left,GLdouble right, GLdouble bottom,GLdouble top,GLdouble near,GLdouble far) 函数中的6个参数的含义是什么 ? ###### > 以相机为原点 > > left 指近平面左边的坐标值 > > right 指近平面右边的坐标值 > > top 指近平面上边的坐标值 > > bottom 指近平面下边的坐标值 > > near 指近平面离相机的距离 > > far 指远平面离相机的距离 ###### gluPerspective(60.0,1.0,1.5,20.0) 中参数的含义又是什么 ? ###### > 函数原型为 gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) > > fovy 定义视野在 Y-Z 平面的角度,范围为\[0,180\] > > aspect 是投影平面宽度与高度的比值 > > zNear 是近平面到视点的距离 > > zFar 是远平面到视点的距离 ###### 什么是视区?如何用 glViewport 来定义一个视区 ###### > 窗口:在世界坐标系中由用户指定的一个区域,用来指定要显示的图形。 > > 视区:在设备坐标系(屏幕)上指定的一个区域,用来指定窗口内的图形在屏幕上显示的大小及位置。 > > 函数原型为 glViewport(GLint x, GLint y, GLsizei width, Glsizei height) > > x,y 指定了视区左下角点的位置 > > width height 指定了视区矩形的宽高 ###### glLoadIdentity 的作用是什么 ###### > 恢复到初始坐标系,屏幕中心 ###### heap 与 stack 的区别 ###### > heap 中存储着例如 new 或者 malloc 函数生成的数据结构,需要手动分配与释放 > > stack 中存储着函数的参数值、局部变量等,由编译器自动分配与释放 ###### OpenGL缺省设置时,相机在什么位置,观察方向是哪里 ###### > 相机在坐标原点, 观察方向沿 z 轴负方向 ###### 为什么说OpenGL是一个状态机? 试着说出它的几种状态量 ###### > OpenGL 记录当前的状态例如颜色,光照等等,每当绘制一个图元的时候就将这些状态赋予图元,当用户输入新的状态变量时,输入的状态会覆盖掉原来的状态 > > 例如 glColor(), glMaterial, glMatrixMode #### 13. 区域填充 #### ##### 四联通、八连通 ##### > 4连通区域:从区域内任一点出发,可通过4个方向,即上、下、左、右的组合,在不越出区域的前提下,到达区域内的任意象素; > > 8连通区域:从区域内任一点出发,可通过8个方向,即上、下、左、右、左上、右上、左下、右下的组合,在不越出区域的前提下,到达区域内的任意象素; > > **一个4连通区域必然是8连通的,反过来不成立!** ##### 区域的表示方法 ##### > 边界表示法:把位于给定区域的边界上的像素一一列举出来的方法 > > 内点表示:枚举出给定区域内所有像素的表示方法 ##### 边界表示的 4 连通区域填充算法(递归算法) ##### > 算法的输入:种子点坐标(x,y),填充色和边界颜色。 > > 可以利用栈结构简单地实现**4-连通边界填充算法**,原理为:种子象素入栈;当栈非空时重复执行如下三步操作: > > * 栈顶象素出栈; > * 将出栈象素置成填充色; > * 检查出栈象素的 4-邻接点,若其中某个象素点不是边界色且未置成填充色,则把该象素入栈。 ##### 边界表示的8连通区域填充算法(递归算法) ##### > 算法的输入:种子点坐标(x,y),填充色和边界颜色。 > > 可以利用栈结构简单地实现 \*\*8-\*\***连通边界填充算法**,原理为:种子象素入栈;当栈非空时重复执行如下三步操作: > > * 栈顶象素出栈; > * 将出栈象素置成填充色; > * 检查出栈象素的 8-邻接点,若其中某个象素点不是边界色且未置成填充色,则把该象素入栈。 ##### 使用邻接点的递归算法分析 ##### > 缺点:把太多的象素压入堆栈,一方面降低了算法效率,另一方面还要求很大的存储空间来实现栈结构 ##### 区域填充的扫描线算法(递归算法) ##### > 首先将种子象素入栈;当栈非空时作如下三步操作: > > (1)栈顶象素出栈; > > (2)填充出栈象素所在扫描行的连续象素段,直到遇到边界象素为止,即每出栈一个象素,就对包含该象素的整个扫描线区间进行填充; > > (3)在区间中检查与当前扫描线相邻的上下两条扫描线的有关象素是否全为边界象素或已填充的象素,若存在非边界、未填充边界的象素,则把每一区间的最右象素取作种子象素入栈 #### 14. 反走样 #### ##### 走样的现象 ##### > 1. 阶梯 > 2. 图形细节失真 > 3. 狭小图形遗失和动态图形的闪烁 ##### 反走样的方法 ##### > 1. 提高分辨率 > 2. 过取样:把低分辨率屏幕象素细分成更多的子象素,以子象素为取样点确定原屏幕象素的亮度等级。即:在低分辨率屏幕上显示高分辨率结果 > 3. 区域取样 #### 15. 裁剪 #### ##### 编码裁剪法 ##### ###### 编码 ###### > 四位代码CTCBCRCL > > CL=1(端点在XL左); > > =0 (端点在XL右) > > CR=1(端点在XR右); > > =0 (端点在XR左) > > CB=1 (端点在YB下); > > =0 (端点在YB上) > > CT=1 (端点在YT上); > > =0 (端点在YT下) ![image-20201219102820201][] ###### 编码特征 ###### > 设线段两个端点的代码分别为 code1 和 code2 > > 若 code1 | code2 = 0, 则线段全在窗口内 > > 若code1 & code2 ≠ 0, 则线段全在窗口外 ##### Liang—Barskey 算法 ##### ![image-20201219103821808][] > 基本思想:求得两个交点的参数 Us Ue > > 原理: > > 直线段AB的两端点为(x1,y1),(x2,y2),其参数方程表示为: > > ![image-20201219103857460][] ![image-20201219104013212][] > > 直线上的点位于窗口内的条件 > > ![image-20201219104507068][] > > 即 > > ![image-20201219104539581][] > > 统一表达式为: > > ![image-20201219104611245][] > > 特殊情况: > > ![image-20201219104647145][] > > ![image-20201219104703361][] > > 一般情况: > > 求U=qk/qk ###### 问题:计算出来的u值都满足 0 < u <1 吗? ###### > 不是 ###### 如何选取合适的us和ue ###### > us 的值由线段从外到内遇到的窗口边界所决定,对于这些边界计算: > > uk = qk / pk, 取:us = max \{ 0 , uk \} > > ue 的值由线段从内到外遇到的窗口边界所决定,对于这些边界计算: > > uk = qk / pk,取: ue = min \{ 1 , uk \} > > 确定了us、ue之后,由参数方程计算它们对应的两点坐标,再用直线的扫描转换算法生成落在窗口内部的部分。 > > * p1、p3 < 0: > > u1、u3 是由外到内遇到窗口边界时的参数, > > us=max(u1,u3,0) = u1; > > * p2、p4 > 0: > > u2、u4 是由内到外遇到窗口边界时的参数, > > ue=min(u2,u4,1) = u4; > > **如果us > ue ,则直线完全不可见** #### 16. 多边形的裁剪 #### ##### 能否用直线的裁剪算法裁剪多边形的每条边 ##### > 把多边形作为直线段的集合进行裁剪,则可能被裁剪为离散的线段集合,不再保持封闭性。 ##### Sutherland-Hodgman 算法 ##### > 基本思想: > > * 逐边裁剪、两次分解 > * 首先将多边形对于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪; > * 其次,将多边形对一条直线的裁剪分解为各边对直线的裁剪。 > * 也称为逐边裁剪算法。 ###### 优点 ###### > * 裁剪算法采用流水线方式,适合于硬件实现。 > * 可以推广到任意凸多边形裁剪窗口 ###### 缺点 ###### > 裁剪凹多边形时可能出现多余的边 ##### Weiler-Atherton算法(双边裁剪算法) ##### ###### 多边形顶点的排列顺序 ###### > 使多边形区域位于有向边的右侧。外环(顺时针)、内环(逆时针) #### 17. Drawcall #### > 通过调用它的次数评价一个程序,次数越小,刷新率可以越高 #### 18. 内存泄漏 #### > 指针未释放,指向的地址块无法被利用 #### 19. 图形变换 #### ##### 平移变换 ##### ![image-20201219111822131][] > 齐次坐标表示 > > ![image-20201219112356690][] ##### 旋转变换 ##### ![image-20201219111906470][] > θ 为绕原点逆时针旋转的角度 > > 齐次坐标表示 > > ![image-20201219112424414][] ##### 比例变换 ##### ![image-20201219112102679][] > 齐次坐标表示 > > ![image-20201219112449221][] ##### 合矩阵 ##### ![image-20201219112541182][] ##### 点的坐标变换 ##### > 1. 写出原坐标系到新坐标系的变换矩阵 > 2. 变换后的点坐标等于原坐标乘上变换矩阵的逆矩阵 #### 20. 二维观察流程 #### ![image-20201219113333830][] #### 21. 窗口到视区变换的特点 #### > * 改变窗口、视区大小,在视区内得到大小变化的像; > * 改变视区大小可改变输出对象的大小; > * 如果视区大小不变: 窗口扩大,像缩小,窗口缩小,像放大; > * 如果视区为全屏,窗口内容将满屏显示; > * 改变视区位置可获得不同显示位置的输出对象,不在窗口区域内的内容不会在视区内出现; > * 如果sx = sy,则窗口的宽高比 = 视区的宽高比,则物与像的形状相似,像不会产生畸变;否则将产生畸变 #### 22. 绕任意轴做旋转变换的问题可以分三步 #### > * 将旋转轴正方向变换到z轴正向:Tt(-x1,-y1,-z1) Rx(α) Ry(β) ; > * 绕z轴旋转角度θ:Rz(θ) > * 用步骤1中的逆变换将旋转轴变换回原来位置: > > Ry(-β) Rx(-α)Tt(x1,y1,z1) > > 复合矩阵:R(θ) = Tt(-x1,-y1,-z1) · Trx(α) · Try(β) · Trz(θ) · Try(-β) · Trx(-α) · Tt(x1,y1,z1) > > ![image-20201219115313840][] > > ![image-20201219115327318][] #### 23. 三维观察 #### ![image-20201220122058098][] ##### 观察坐标系及其定义 ##### > 观察坐标系:照相机所在的坐标系 > > 组成: > > * 坐标原点 > * n 轴:镜头方向的反方向 > * v 轴:照相机向上的方向 > * u 轴:u = v x n > > ![image-20201220122531400][] ##### 投影类别以及概念 ##### > ![image-20201220123406223][] > > ###### 透视投影 ###### > > 投影中心与投影平面距离无限 > > ###### 平行投影 ###### > > 投影中心与投影平面距离有限 ##### 正轴测 ##### > * 正轴测有等轴测、正二测和正三测三种。 > * 当投影面与三个坐标轴之间的夹角都相等时为等轴测; > * 当投影面与两个坐标轴之间的夹角相等时为正二测; > * 当投影面与三个坐标轴之间的夹角都不相等时为正三测。 > > ![image-20201220123727606][] ##### 斜投影 ##### > * **斜投影图**,即斜轴测图,是将三维形体向一个单一的投影面作平行投影,但投影方向不垂直于投影面所得到的平面图形。 > * 常用的斜轴测图有斜等测图和斜二测图。 ##### 灭点 ##### > 不平行于投影平面的平行线,经过透视投影收敛于一点,称为灭点 ##### 主灭点 ##### > 物体上平行于坐标轴的平行线在投影平面上的灭点叫做主灭点 > > 主灭点最多为三个 > > * 若某坐标轴与投影面垂直,则只有一个主灭点。 > * 按照主灭点个数,透视投影分为: > 一点透视 > 两点透视 > 三点透视 #### 24. 光照模型与消隐 #### ![image-20201220124723333][] ##### 简单光照模型 ##### > * 仅处理光源直接照射物体表面时的反射,而不考虑物体之间光照的相互作用 > * 将反射光认为是由环境光、漫反射光和镜面反射光三个分量组成的 ##### 环境光的经验模型 ##### > 在空间中均匀分布的光,在**任何位置任何方向上**的光强度都一样,而且入射至物体表面后将向空间**各方向均匀反射**出去。 > > P点对环境光的反射强度为:Ia = Ka \* Il > > Ka:物体表面对环境光的反射系数(0-1) > Il: 环境光强度 ##### 漫反射 ##### > * 漫反射表示特定光源在物体表面的反射光中向各个方向均匀发射出去的光。 > * 经常用来模拟粗糙,没有光泽(如粉笔)的表面对光的反射 > > 经验模型: > > ![image-20201220125221445][] > > Il:入射光强度 > Kd:漫反射系数,和物体表面性质有关 ##### Lambert 光照模型 ##### > 环境光反射 + 漫反射 ##### 镜面反射 ##### > ![image-20201220125502085][] > > Il:入射光强度; > > Ks:镜面反射系数; > n:镜面反射的汇聚指数 > > ![image-20201220125614997][] > > **α 是理想镜面反射方向和视线方向夹角** > > **α 越大,进入眼睛中的光强越少** > > n 是汇聚系数,衡量光斑大小,n越大光斑越小,亮度越亮 ##### Phong 光照模型 ##### > 环境光 + 漫反射 + 镜面反射 ##### 完整的 Phong 光照模型 ##### > 加入衰减函数 > > **I = Ia · Ka \+ f(d) ·Il · \[Kd(L·N)+Ks(V ·R)n\]** ##### 消隐算法中的基本技术 ##### > * 深度测试 > * 背面剔除 > * 排序 > * 包围盒测试 ###### 背面剔除 ###### > 自隐藏线自隐藏面消除的主要方法· > > * 前面 > > Vview . Nf < 0 > * 后面 > > Vview . Nb > 0 > * 剔除依据 > > 后面总是被前面遮挡,是不可见的 ##### Z-Buffer 算法 ##### > * 帧缓存来存放每个象素的颜色值 > > * 初值可放对应背景颜色的值 > * 深度缓存来存放每个象素的深度值。 > > * 初值取成 z 的极小值(如远截面的z值) > > 步骤 > > * 初始化:**把 Z 缓存中各 (x,y) 单元置为 z 的最小值,而帧缓存各 (x,y)单元置为背景色;** > * 在对每个要扫描转换的多边形转换成帧缓存中的信息时,对于多边形内的每一采样点 (x,y) 进行处理: > > * 计算采样点 (x,y) 的深度 z(x,y); > * 如 z(x,y) 大于 Z 缓存中在 (x,y) 处的值,则把 z(x,y) 存入 Z 缓存中的(x,y) 处,再把多边形在 z(x,y) 处的颜色值存入帧缓存的 (x,y) 地址中。 Z-Buffer算法() { 帧缓存全置为背景色 深度缓存全置为最小z值 for(每一个要扫描转换的多边形) { 扫描转换该多边形 for(该多边形所覆盖的每个象素(x,y) ) { 计算该多边形在该象素的深度值z(x,y); if( z(x,y)大于Z缓存在 (x,y) 的值 ) { 把 z(x,y) 存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处 } } } } > **优点**:思想很简单, 就是在象素级上以近物取代远物。该方法实现起来远比总体排序简单,有利于硬件实现。 > > **缺点**:需要较多存储空间。如象素为500x500个时,就需要25万个深度值的存储空间。而深度值一般用浮点,如4个字节,则需要1M空间 ##### Z-Buffer算法和光线投射法的比较 ##### > 如果三角形中有m个象素,椭圆中有n个象素,则Z-buffer算法是针对性的计算,这 m + n 象素所对应的真正的颜色值;而光线投射法则是计算 W \* H 个屏幕象素对应的真正的颜色值 ##### 明暗处理 ##### > 常数明暗处理,对应于 glShadeModel(GL\_FLAT) > > 使用插值进行光滑着色(Gouraud 明暗处理):颜色插值,对应于 glShadeModel(GL\_SMOOTH) > > 缺点:Gouraud方法进行平滑处理虽然速度较快,但是由于是对颜色进行线性插值(而不是法线),因此会出现颜色平坦区域。不能很好的表现镜面反射效果(镜面反射和反射方向相关,而环境反射和漫反射与反射方向无关) > > Phong 明暗处理(法向插值),GL 不支持 > > **马赫带效应**:如果是用多边形作为曲面的近似表示,当曲面的离散度较粗时,使用常数明暗处理后,两个相邻的多边形连接处会比周围亮或暗 ##### Ray Tracing 的终止条件 ##### > 1. 发出的光线和所有物体都没有交点 > 2. 光线跟踪深度已达设置上限 > 3. 考虑来自发出的光线上的亮度对显示像素亮度的贡献系数 ##### Blinn-Phong 光照模型 ##### > 实际使用中,由于R计算不方便,因此常用 N\*H 代替 R\*V;H为沿L和V的角平分线的单位向量。 > > ![image-20201220132726304][] ##### GL LightModel 参数 ##### > <table> > <thead> > <tr> > <th align="left">参数名</th> > <th>默认值</th> > <th>含义</th> > </tr> > </thead> > <tbody> > <tr> > <td align="left">GL_LIGHT_MODEL_AMBIENT</td> > <td>(0.2,0.2,0.2,1.0)</td> > <td>整个场景的环境光</td> > </tr> > <tr> > <td align="left">GL_LIGHT_MODEL_LOCAL_VIEWER</td> > <td>0.0 或 GL_FALSE</td> > <td>镜面反射的角度如何计算</td> > </tr> > <tr> > <td align="left"><strong>GL_LIGHT_MODEL_TWO_SIDE</strong></td> > <td><strong>0.0 或 GL_FALSE</strong></td> > <td><strong>单面还是双面</strong></td> > </tr> > <tr> > <td align="left">GL_LIGHT_MODEL_COLOR_CONTROL</td> > <td>GL_SINGLE_COLOR</td> > <td>镜面颜色计算是否从环境和散射中分离</td> > </tr> > </tbody> > </table> #### 25. 纹理与阴影 #### ##### 类型 ##### > * **颜色纹理**:决定物体表面的材质属性 > > * 二维纹理:物体表面花纹、图案 > * 三维纹理:木材纹理 > * **几何纹理**:决定物体表面的凸凹不平的微观几何形状 > > * 桔子表面的皱纹、篮球表面 ##### 颜色纹理基本思想 ##### > * 给出期望在物体表面出现的纹理(花纹图案) > * 在物体表面和花纹图案之间建立一种映射关系 > * 在绘制物体表面可见点时,用映射关系计算出该点的颜色值参与光照计算。 ##### 连续法和离散法的比较 ##### > * 以连续法给出的纹理适合对花纹图案的**几何特性**进行描述,只能表示常见的可用公式描述的纹理图案,如粗布、简单的花纹等。另外,由于其函数值的**单分量特性**(即只有一个函数值 而不知道这个值对应的三个颜色分量),它常用来表达灰度显示下的纹理映射。 > * 以离散法给出的纹理适合表达色彩变化的图案,而且数字图像易于获取。由于其函数值可分为三个颜色分量,因此常用来表达**彩色显示**下的纹理映射。 ##### 纹理的实施策略 ##### ###### 三个空间和两个映射 ###### ![image-20201220133820937][] ###### 减轻走样的方法 ###### > * 将屏幕上一个象素的四个角点映射到观察空间中可见的物体表面上 > * 将观察坐标空间映射到纹理坐标空间 > * 将象素所对应的纹理坐标空间中的四边形内的所有纹素的值加权平均,结果作为物体表面的漫反射系数参与光照计算 > > *纹素: Texel ( texture + pixel 缩写) , 与象素对应,表示纹理空间中的一个点* ##### 纹理值如何参与光照计算 ##### > 求出物体表面的参数后,根据(u,v)得到该处的纹理值,并用此值取代光照明模型中的相应项,实现纹理映射。 > > ![image-20201220134120298][] > > * 直接替换 I 值:即不参与光照 > * 替换漫反射系数:参与光照 > * 影响法向N:参与光照 #### 26. OpenGL 函数汇总 #### ##### 1. glviewport(GLint x, GLint y, GLsizei width, Glsizei height) ##### > x,y 指定了视区左下角点的位置 > > width height 指定了视区矩形的宽高 ##### 2. glClearColor(R,G,B,A) ##### > R、G、B为颜色分量,A为alpha值 > > 作用:为 glClear 清除颜色缓冲区时指定 RGBA 值 ##### 3. glClear(mask) ##### > mask 取值 GL\_COLOR\_BUFFER\_BIT、GL\_DEPTH\_BUFFER\_BIT、GL\_STENCIL\_BUFFER\_BIT > > 作用:清除预设值的缓冲区,三个 mask 分别对应 glClearColor、glClearDepthf 和 glClearStencil ##### 4. glFlush(void) ##### > 作用:理科清除缓冲区,促使渲染命令尽快执行 ##### 5. auxInitDisplayMode(GLbitfield mask) ##### > mask 取值 AUX\_RGBA或AUX\_INDEX、AUX\_SINGLE或AUX\_DOUBLE > > 作用:显示窗口显示模式,RGB、单或者双缓存 ##### 6. glFrustum (GLdouble left,GLdouble right, GLdouble bottom,GLdouble top,GLdouble near,GLdouble far) ##### > 以相机为原点 > > left 指近平面左边的坐标值 > > right 指近平面右边的坐标值 > > top 指近平面上边的坐标值 > > bottom 指近平面下边的坐标值 > > near 指近平面离相机的距离 > > far 指远平面离相机的距离 ##### 7. gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) ##### > fovy 定义视野在 Y-Z 平面的角度,范围为\[0,180\] > > aspect 是投影平面宽度与高度的比值 > > zNear 是近平面到视点的距离 > > zFar 是远平面到视点的距离 ##### 8. gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz) ##### > eyex,eyey,eyez 是相机在世界坐标系中的位置 > > centerx,centery,centerz 是相机对准物体的交点在世界坐标系中的位置 > > upx,upy,upz 顶过相机向上方向在世界坐标系中的矢量 ##### 9. glutInitDisplayMode(mode) ##### > mode 取组合值 > > GLUT\_DOUBLE|GLUT\_RGBA|GLUT\_DEPTH|GLUT\_STENCIL ##### 10. glutPostRedispaly() ##### > 通知引擎重绘 ##### 11. glutSwapBuffer ##### > 交换缓存 ##### 12. glBlendFunc() ##### > 颜色混合,参数分为源因子以及目标因子,需要由 glEnable(GL\_BLEND) 启用 ##### 13. glShadeModel() ##### > 参数为GL\_Smooth 或者GL\_Flat,着色模式 ##### 14. glHint(target,hint) ##### > 反走样函数 > > hint 可取 GL\_FASTEST(最有效)、GL\_NICEST(最歌颂质量)、GL\_DONT\_CARE(无选择) > > target 可取 > > GL\_POINT\_SMOOTH\_HINT 指定点 > > GL\_LINE\_SMOOTH\_HINT 线 > > GL\_POLYGON\_SMOOTH\_HINT 多边形采样质量 > > GL\_FOG\_HINT 指出雾化计算是按像素还是顶点计算 ##### 16. glDepthFunc(func) ##### > 深度测试 > > func 常取 GL\_LESS 表示目标像素 z < 当前像素 z ,则绘制目标像素 > > 需要由 glEnable(GL\_DEPTH\_TEST) 启用 ##### 17. glFrontFace(mode) ##### > 用来定义前面,常取GL\_CCW 逆时针方向 ##### 18. glEnable() ##### > 启用某个函数 ##### 19. glLightModeli() ##### > centerx,centery,centerz 是相机对准物体的交点在世界坐标系中的位置 > > upx,upy,upz 顶过相机向上方向在世界坐标系中的矢量 ##### 9. glutInitDisplayMode(mode) ##### > mode 取组合值 > > GLUT\_DOUBLE|GLUT\_RGBA|GLUT\_DEPTH|GLUT\_STENCIL ##### 10. glutPostRedispaly() ##### > 通知引擎重绘 ##### 11. glutSwapBuffer ##### > 交换缓存 ##### 12. glBlendFunc() ##### > 颜色混合,参数分为源因子以及目标因子,需要由 glEnable(GL\_BLEND) 启用 ##### 13. glShadeModel() ##### > 参数为GL\_Smooth 或者GL\_Flat,着色模式 ##### 14. glHint(target,hint) ##### > 反走样函数 > > hint 可取 GL\_FASTEST(最有效)、GL\_NICEST(最歌颂质量)、GL\_DONT\_CARE(无选择) > > target 可取 > > GL\_POINT\_SMOOTH\_HINT 指定点 > > GL\_LINE\_SMOOTH\_HINT 线 > > GL\_POLYGON\_SMOOTH\_HINT 多边形采样质量 > > GL\_FOG\_HINT 指出雾化计算是按像素还是顶点计算 ##### 16. glDepthFunc(func) ##### > 深度测试 > > func 常取 GL\_LESS 表示目标像素 z < 当前像素 z ,则绘制目标像素 > > 需要由 glEnable(GL\_DEPTH\_TEST) 启用 ##### 17. glFrontFace(mode) ##### > 用来定义前面,常取GL\_CCW 逆时针方向 ##### 18. glEnable() ##### > 启用某个函数 ##### 19. glLightModeli() ##### > 设置光照模型 [0597d4015bfd5431a700016841df84f4.png]: /images/20221120/09089f3b1f0644af8e2925910eac656f.png [39496a8f1d01440b6327196b1d2d8d4e.png]: /images/20221120/14084f2c93de4eb0b2be7651fb5e98bc.png [372e0e4c6a2915648f1f8297581e32bb.png]: https://img-blog.csdnimg.cn/img_convert/372e0e4c6a2915648f1f8297581e32bb.png [69fe980f7573e4bbcbd5c775d2e0dc75.png]: https://img-blog.csdnimg.cn/img_convert/69fe980f7573e4bbcbd5c775d2e0dc75.png [45b50da6155b921564e8a7ccabc5138e.png]: https://img-blog.csdnimg.cn/img_convert/45b50da6155b921564e8a7ccabc5138e.png [c47600642cc8d6d66dcd1f5d29f30527.png]: https://img-blog.csdnimg.cn/img_convert/c47600642cc8d6d66dcd1f5d29f30527.png [image-20201217155612227]: https://img-blog.csdnimg.cn/img_convert/eb5521cb63fd39b5ec07f64f7f8a004d.png [image-20201217155620963]: https://img-blog.csdnimg.cn/img_convert/eb9edff3b1b28fffba1757e3a9730ea2.png [image-20201217155628573]: https://img-blog.csdnimg.cn/img_convert/ad6df3176d4832bb340eed3aa858b3c7.png [image-20201217155636824]: https://img-blog.csdnimg.cn/img_convert/5103a93a616080ed8425c517fc7f2eaa.png [image-20201217155646656]: https://img-blog.csdnimg.cn/img_convert/481722def10c707e65744aaf9c7b7bf4.png [image-20201217155836605]: https://img-blog.csdnimg.cn/img_convert/7051ca074c1e4454918c0989c672de94.png [image-20201217162046040]: https://img-blog.csdnimg.cn/img_convert/4883c5afa84ff8a4c6b865b17c646a48.png [image-20201217162210918]: https://img-blog.csdnimg.cn/img_convert/c973c54d82118cbc231efc97845ca926.png [image-20201217162323059]: https://img-blog.csdnimg.cn/img_convert/749e36e62b1f3c44d5a395eeb54550ef.png [image-20201217163244532]: https://img-blog.csdnimg.cn/img_convert/f17fc288e241aab6a6f9ebfb3df81e6e.png [image-20201217164526092]: https://img-blog.csdnimg.cn/img_convert/4d68577c7aedfc57fc1a0eea9e345798.png [image-20201217170945576]: https://img-blog.csdnimg.cn/img_convert/f19671fbb462a3d25c2e8b068ae11906.png [image-20201219085658643]: https://img-blog.csdnimg.cn/img_convert/f3752fab0b6a16e1d6ae27f41d61330c.png [image-20201219102820201]: https://img-blog.csdnimg.cn/img_convert/6bf20586cb135634f0968d5ca44b46d3.png [image-20201219103821808]: https://img-blog.csdnimg.cn/img_convert/1fb8a1305730237b59914faf91409b52.png [image-20201219103857460]: https://gitee.com/ZHAOWANG2001/Typora/raw/master/ing/image-20201219103857460.png [image-20201219104013212]: https://gitee.com/ZHAOWANG2001/Typora/raw/master/ing/image-20201219104013212.png [image-20201219104507068]: https://gitee.com/ZHAOWANG2001/Typora/raw/master/ing/image-20201219104507068.png [image-20201219104539581]: https://gitee.com/ZHAOWANG2001/Typora/raw/master/ing/image-20201219104539581.png [image-20201219104611245]: https://gitee.com/ZHAOWANG2001/Typora/raw/master/ing/image-20201219104611245.png [image-20201219104647145]: https://img-blog.csdnimg.cn/img_convert/7f4e7e45e07afdde4f8bb51f8c3534ec.png [image-20201219104703361]: https://img-blog.csdnimg.cn/img_convert/70b83c65c71233826c9159f057e95e01.png [image-20201219111822131]: https://img-blog.csdnimg.cn/img_convert/7e9e4a3dacfd3f2d90bbdb5bcd91a7ec.png [image-20201219112356690]: https://img-blog.csdnimg.cn/img_convert/9baa36c6f66f5c37ea8f0e0905cfb9ca.png [image-20201219111906470]: https://img-blog.csdnimg.cn/img_convert/631c518dd02ffebc1924b32f48e94fe6.png [image-20201219112424414]: https://img-blog.csdnimg.cn/img_convert/e53069ab9fcb6ced4657c52e85d47b15.png [image-20201219112102679]: https://img-blog.csdnimg.cn/img_convert/7719ecf2696d1022d7a742b99111fb87.png [image-20201219112449221]: https://img-blog.csdnimg.cn/img_convert/dd638a0018bacdb2cb140bf0dd190c5b.png [image-20201219112541182]: https://img-blog.csdnimg.cn/img_convert/5cf71b8176b17e0ebdb09f4ab2842302.png [image-20201219113333830]: https://img-blog.csdnimg.cn/img_convert/be998a32a3ce99ad2285266cbb47a83d.png [image-20201219115313840]: https://img-blog.csdnimg.cn/img_convert/81ca476fcfd677c787e8d5106fb01f9c.png [image-20201219115327318]: https://img-blog.csdnimg.cn/img_convert/72272b4f72042de62da25188584bd69f.png [image-20201220122058098]: https://img-blog.csdnimg.cn/img_convert/7d7d9533cf385bd20a96c08fe26f5ab6.png [image-20201220122531400]: https://img-blog.csdnimg.cn/img_convert/3311540016830d33d864fd0cff2b35fc.png [image-20201220123406223]: https://img-blog.csdnimg.cn/img_convert/4f80f5c64fdfa03dd6d337854a5d2027.png [image-20201220123727606]: https://img-blog.csdnimg.cn/img_convert/61237200ae32f5bb76f28f470ce77b90.png [image-20201220124723333]: https://img-blog.csdnimg.cn/img_convert/2a05611855f2536d8be9a3d2db2e64c9.png [image-20201220125221445]: https://img-blog.csdnimg.cn/img_convert/c7898abbd6bc01a8ad41b8d0d4250bf8.png [image-20201220125502085]: https://img-blog.csdnimg.cn/img_convert/863407bbaf46d35c6c1e94dc3f3a477b.png [image-20201220125614997]: https://img-blog.csdnimg.cn/img_convert/f4d5a1638e043073ea00f7ee280432e0.png [image-20201220132726304]: https://img-blog.csdnimg.cn/img_convert/fca487becb3e65d69679fd94c3197f64.png [image-20201220133820937]: https://img-blog.csdnimg.cn/img_convert/1b8d6297afeb30b23f79171b09a67365.png [image-20201220134120298]: https://img-blog.csdnimg.cn/img_convert/098e7a683514578333af82bab4384375.png
还没有评论,来说两句吧...