计算机图形学学习(3)—— 基础篇:可编程渲染管线

3.1 渲染管线的发展历程

  1. 图形编程的发展

    • 早期的图形编程:调用硬件供货商提供的函数库(用来绘制图元及其属性的函数库不存在)
    • 图形标准的产生:硬件供货商提供标准图形数据库,使得能够在设备无关的方式下生成图像
      • GKS(Graphical Kernel System, 图形核心系统)
      • PHISS(Programmer‘s Hierarchical Interactive Graphics System, 程序员层次式交互图形系统)
      • OpenGL
    • 固定管线
      • 图形API提供了一个对硬件进行操作的标准接口;从内部实现上来说,API对程序员提出的各种绘制图元或属性的请求都采用固定的方式来处理
      • 这种内部实现方式通常称为固定功能渲染流水线
    • 固定到可编程
      • 钩函数hooks的出现:突破固定功能流水线的限制,使用可编程着色器修改流水线中某些特定步骤的行为
    • 可编程流水线
  2. 基于GPU的可编程渲染管线
    • 功能:决定在给定虚拟相机、三维物体、光源、照明模式,以及纹理等诸多条件情况下生成或绘制一幅二维图像的过程
    • 流水线中的三个概念阶段
      • 应用阶段:将需要在屏幕上显示出来绘制的几何体,也就是绘制图元,比如点、线、矩形等,输入到绘制管线的下一个阶段。具体包括图元的顶点数据、摄像机位置、光照纹理等参数。
      • 集合阶段:将顶点数据进行屏幕映射。需要:
        • 将各个图元放入到世界坐标系中,也就是进行模型变换
        • 根据光照纹理等计算顶点处材质的光照着色效果
        • 根据摄像机的位置、取景范围进行观察变换和裁剪
        • 最后进行屏幕映射,也就是把三维模型转换到屏幕坐标系中
      • 光栅化阶段:给每个像素正确配色,以便绘制整幅图形

?

3.2 可编程渲染管线

  1. GPU渲染管线工作过程

  2. 几何阶段
    • 顶点着色器:

      • 模型变换:建模坐标系——>世界坐标系,将所有模型移入一个坐标系中
      • 视图变换:建立观察坐标系
      • 顶点着色:确定顶点上材质上的光照效果
    • 几何、曲面细分着色器
    • 裁剪:规范化的观察空间
    • 屏幕映射:转换为二维数据
  3. 光栅化阶段
    • 三角形设置
    • 三角形遍历
    • 片元着色器
    • 片元操作
      • 片元——>模板测试——>深度测试——>颜色混合——>帧缓存
        ?

        3.3 着色器编程

  4. 着色器语言 Shading Language
  5. GLSL(OpenGL Shading Language)OpenGL的着色器语言
    • 顶点着色器Vertex Shader、几何着色器Geometry Shader、曲面细分着色器Tessellation Shader、片元着色器Fragment Shader
    • 在OpenGL中使用着色器的流程:
      • 创建着色器对象
      • 源码关联到着色器对象
      • 编译着色器
      • 创建一个程序对象
      • 将着色器对象关联到程序对象
    • 与OpenGL的通信
      • OpenGL通过一组uniform全局变量将所有的数据传递到着色器
    • 数据类型
      • 标量:整数(int)、无符号整型(uint)、布尔类型(bool)及浮点型(float)
      • 矢量:一个矢量可以有2、3、4个分量

        vec4 a=vec4(1.0,2.0,3.0,4.0);

      • 矩阵

        mat2 m mat2(1.0,2.0,3.0,4.0);

      • 结构和数组:结构体的成员或者数组的基类型可以为任意的数据类型

        //lightsource为光源

        struct lightsource{

        ? vec3 color; //颜色

        ? vec3 position; //位置

        }

        lightsource spotlight[10]; //10个光源

    • 控制结构
      • 循环结构:for、while和do-while
      • 选择循环:if-then、if-then-else,GLGL3.0版本引入了switch结构
      • 注意:goto语句和标签是不允许使用的
  6. EBO、VBO和VAO
    • EBO

      • Element Buffer Object,也叫IBO:Index Buffer Object,索引缓冲区对象
      • 主要用来存储顶点的索引信息
    • VBO
      • Vertex Buffer Object,顶点缓冲区对象,主要用来存储顶点的各种信息
      • 好处:模型的顶点信息放进VBO,这样每次画模型时,数据不用再从CPU的势力范围内存里取,而是直接从GPU的显存里取,从而提高效率
    • VAO
      • Vertex Array Object,顶点数组对象
      • VAO是一个保存了所有顶点数据属性的状态结合,它存储了顶点数据的格式以及顶点数据所需的VBO对象的引用

原文地址:https://www.cnblogs.com/maeryouyou/p/11986584.html

时间: 2024-11-02 15:43:54

计算机图形学学习(3)—— 基础篇:可编程渲染管线的相关文章

Python学习笔记基础篇——总览

Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列表.字典.主文件判断.对象 Python学习笔记——基础篇1[第三周]——set集合 Python学习笔记——基础篇2[第三周]——计数器.有序字典.元组.单(双)向队列.深浅拷贝.函数.装饰器 Python学习笔记——基础篇[第四周]——迭代器&生成器.装饰器.递归.算法.正则表达式 Python

一步步学习javascript基础篇(3):Object、Function等引用类型

我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂数据类型(即引用数据类型) Object类型 我们用的最多的引用类型就属object类型了,一般用来存储和传输数据是再好不过的.然,它的两种创建方式我们是否了解呢? 1.通过构造函数来创建 如: var obj = new Object(); 在js中的引用类型有个非常灵活的用法,可以动态的附加属性和赋值.

渗透学习笔记--基础篇--sql注入(字符型)

环境:dvwa1.7数据库:mysql前置知识:sql语句(Click me)      在进行sql注入前,我们先熟悉熟悉select语句.一.打开我们的sql终端 二.进入之后可以看到有mysql>我们输入sql语句,即可返回我们想要的结果,注意分号哟!我们使用的dvwa,在我们前几章设置的时候,会在数据库中生成一个dvwa的database:这里我们使用它来进行我们的select 语句:(1)使用dvwa数据库use dvwa;(2)在users表里查询用户名为'admin'的所有信息se

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

[图形学] 计算机图形学 with OpenGL第一篇

<计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode8.3.2. 代码目录是:https://github.com/p0e0o0p0l0e0/Computer_Graphics.git 目标学习内容有以下几章,已经学到第8章. 第3章:计算机图形学软件 第4章:输出图元 第5章:图元的属性 第6章:实现图元及属性的算法 第7章:二维几何变换 第8章:二维观察 第9

Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 &amp; Socket编程基础)

FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/p/4766801.html metaclass 详解文章:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 得票最高那个答案写的非常好 Socket 编程 参考:http://www.cnblogs.co

Python学习笔记——基础篇【第六周】——面向对象

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,大家虽然都按老师讲的都知道OOP的三大特性是继承.封装.多态,并且大家也 都知道了如何定义类.方法等面向对象的常用语法,但是一到真正写程序的时候,还是很多人喜欢用函数式编程来写代码,特别是初学者,很容易陷入一

Python学习笔记——基础篇【第四周】

本节大纲 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 7.作业:计算器开发 a.实现加减成熟及括号优先级解析 b.用户输入1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

深度学习之基础篇(三)

1.神经网络中损失函数和优化函数的作用 训练出一个网络模型之后如何对模型进行评估?往往是衡量预测值与真实值之间的差异程度,这就是通过损失函数来完成的.另外损失函数也是神经网络中优化的目标函数,神经网络训练或者优化的过程就是最小化损失函数的过程,损失函数越小,说明模型的预测值就越接近真实值,模型的准确性也就越好.那么为了最小化损失函数则需要对网络模型的参数进行更新,确定如何更新参数这时则需要选择合适的优化函数(用以确定对网络模型参数进行更新的方法,步长和方向的确定).我们都知道,神经网络模型训练得