计算机图形学知识点整理(一)

前言

整理一下这学期的课程《计算机图形学》的知识点。,课程内容来自中国大学生慕课->计算机图形学->华中科技大学

可编程渲染管线

  • 可编程渲染管线在流水中的三个阶段包括如下:
    应用程序阶段(1.图元顶点数据 2.摄像机位置 3.光照纹理等)->几何阶段(1.变换和投影后的点 2.颜色 3.纹理)->光栅化阶段(输出刀屏幕的各个像素的颜色值)。 一个物体要在荧幕上显示就需要经历上述过程。

  • 在计算机图形学中输入的是一段结构特征数据,输出则是图形信号。比如一条直线为例:输入是直线的方程,输出则是屏幕上最接近在直线方程的像素点集合。

  • 图形显示子系统结构 1.帧缓冲存储器(帧缓存):一块用来存储颜色或者灰度值的存储空间 2.显示控制器,用于显示帧缓存中的数据。从计算机的组成结构中,最初显示控制器和帧缓存不在相同部件中,由于数据需要通过总线传输,因此在图形显示时需要从主存取数据再到视频显示控制器进行显示,这样需要占用总线,增加了负担。同时数据进行显示时需要扫描转换的,因此就加重了cpu的负担。后来随着技术的发展,将帧缓存,cpu中用于计算图形显示计算的部分组合在一起形成了图形处理器。也就是现在说的显卡(独立显卡)。显卡中最主要的部件就是GPU

  • 应用程序阶段和几何阶段:应用程序阶段主要是由cpu完成计算的。几何阶段包括:1.顶点着色器 2.几何,曲面着色器 3.裁剪 4.屏幕映射。

    顶点着色器完成模型变换,视图变换,顶点着色(确定顶点上的材质的光照效果)。

    几何曲面着色器完成顶点的增删,进行曲面细分。

    裁剪主要完成将几何图形投影刀一个规范化的空间中。判断可见性。

  • 光栅化阶段 1.三角形的设置 2.三角形的遍历 3.片元着色器 4.片元操作。在遍历时通过插值得到许多图形的信息。这部分是固定的,由GPU完成。 片元着色则是将前面过程计算的数据进行图形的着色。 片元操作将帧缓存中的数据进行融合计算。最后才会得到每个帧缓存中每个像素点的颜色值。

着色器语言

  • openGL着色器语言 GLSL。着色器语言的代码以文本的形式保存,不通过cpu编译,在程序运行时通过显卡进行翻译。

    openGL中使用着色器的流程: 1.创建着色器对象 2.源码关联到着色器对象 3.编译着色器 4.创建程序对象 5.着色器对象关联到程序对象

  • GLSL中的数据类型: 标量(int, uint float ..) 矢量(vec4 a=vec4(1.0,2.0,3.0,4.0)..) 矩阵(mat2 m=mat2(1.0,2.0,3.0,4.0) 是一个2*2矩阵) 结构和数组

  • EBO VBO VAO

    EBO(element buffer object)索引缓冲区对象,是为了解决同一个顶点多洗重复调用的问题,可以减少内存空间浪费,提高执行效率。当需要使用重复的顶点时,通过顶点的位置索引来调用顶点,而不是对重复的顶点信息重复记录,重复调用。

    VBO(vertex buffer object)顶点缓冲区对象,是在显卡中开辟一块内存缓冲区,用于存储顶点的各类属性信息,如顶点坐标,顶点法向量,顶点颜色数据等。在渲染时,可以直接从VBO中取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CPU传输数据,处理效率更高。 所以可以理解为VBO就是显存中的一个存储区域,可以保持大量的顶点属性信息。并且可以开辟很多个VBO,每个VBO在OpenGL中有它的唯一标识ID,这个ID对应着具体的VBO的显存地址,通过这个ID可以对特定的VBO内的数据进行存取操作。

    VAO(vertex array object)顶点数组对象。每次绘制模型之前需要绑定顶点的所有信息,当数据量很大时,重复这样的动作变得非常麻烦。VAO可以把这些所有的配置都存储在一个对象中,每次绘制模型时,只需要绑定这个VAO对象就可以了。 VAO是一个保存了所有顶点数据属性的状态结合,它存储了顶点数据的格式以及顶点数据所需的VBO对象的引用。

  • 实验环境搭建,参考中国大学生慕课课程中视频讲解环境搭建过程。https://www.icourse163.org/course/0809HUST055-1003636001?utm_campaign=share&utm_medium=androidShare&utm_source=

  • 椭圆的扫描转换算法:Bresenham算法 1.输入椭圆的长半轴a和短半轴b。 2.计算初值 d=b^2+a^2(-b+0.25),x=0,y=b; 3. 绘制(x,y)的三个对称点。4 判断d符号,根据中点推导更新下一步的x和y 5.根据不等式 2a^2(y-0.5)>2b^2(x+1)判断是否在上半部分,是则重复3,4.否则转6 6. 进入下半部分,计算下部分d的初值。7.绘制(x,y)的三个对称点。 8.判断d的符号,根据中点推到下一步的x和y取值。 9. 当y>0时继续执行,否则画完整个椭圆。

    其中需要注意两个问题:1.判断何时从上半部分转到下半部分(即当法向量斜率小于1时进行转换,计算相邻取的两个点的斜率即可判断) 2.刚转入下半部分时,计算下半部分中点的初值。

  • 多边形区域填充算法(对有多个顶点组成的多边形内部进行区域填充): x-扫描线算法:1.确定多变形占有的最大扫描线数,得到多边形顶点的最大值和最小值。2.从ymin到ymax每次用一条扫描线填充 3.填充的步骤:a.求交 b.排序 c.交点配对 d.区间填色