zoukankan      html  css  js  c++  java
  • 计算机图形学-渲染管线

    渲染管线

    一、流水线的概念

    • 流水线最终目的:生成或渲染一张二维纹理,输入是一个虚拟像机,光源,Shader,纹理等。

    • 硬盘 –>> RAM –>> 显存

    • CPU发指令从硬盘到RAM内存,GPU将要显示的缓存发到显存

    二、GPU渲染管线

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

    • 流水线三个概念阶段:应用阶段、几何阶段、光栅化阶段

      1、应用阶段:

      • 将需要在屏幕上显示出来的几何体,也就是绘制图元,比如点、线、矩形等输入到绘制管线的下一个阶段。输出图元的顶点数据、摄像机位置、光照纹理等参数。
    • 将数据加载到显存中:(硬盘–>内存RAM –>显存–> VRAM)

      • 设置渲染状态:使用哪个着色器、光源属性、材质等
    • 调用DrawCall:一个命令,CPU调用GPU的命令,一个DrawCall指向需要渲染的图元列表

      2、几何阶段:

      • 需要将顶点数据最终进行屏幕映射,输出屏幕空间二维顶点坐标,顶点对应的深度值,颜色等相关信息。
      • 将各个图元从模型坐标系转换到世界坐标系中,也就是模型变换
    • 根据光照纹理等计算顶点材质的光照着色效果

      • 根据摄像机位置、取景进行观察变换和裁剪
    • 进行屏幕映射,也就是把三维模型转换到屏幕坐标系

      3、光栅化阶段:

      • 输入是经过变换和投影后的顶点、颜色以及纹理坐标,工作是给每个像素正确配色,以便绘制整幅图形。
      • 由于输入的是三形顶点,所以需要根据三角形表面的差异,逐个遍历三角形计算各个像素的颜色值。之后根据其可见性等进行合并得到最后的输出。

    三、几何阶段

    • 顶点着色器:(可编程)模型变换(模型空间到世界空间)、视图变换(世界空间到观察空间)、逐顶点光照着色
    • 几何、曲面细分着色器:(可编程)顶点增删,曲面细分,增加点使曲面更光滑
    • 裁剪:(可配置)规范化投影变换(观察空间到规范化观察空间)、裁剪
    • 屏幕映射:(固定)(规范化观察空间到屏幕坐标系)

    四、光栅化阶段

    • 三角形设置:(固定)将顶点设置成三角形
    • 三角形遍历:(固定)遍历三角形,通过顶点的深度插值得到深度,得到三角形的每一个片元,片元是状态的集合,用来计算每个像素的最终颜色。状态包括屏幕坐标、深度信息、顶点信息、法线、纹理坐标等。
    • 片元着色器:(可编程)根据上面状态的集合对三角形的每一个片元计算颜色值
    • 逐片元操作:(可配置)模板测试、深度测试、颜色混合、帧缓存

    五、CPU到GPU

    应用程序调用CPU去显示,CPU从硬盘加载渲染需要的数据到内存,然后从内存里取到顶点数据传给显存。

    CPU再通过Shader语言调用显卡驱动来调用GPU,GPU取得显存里的顶点数据等来计算得到要显示到屏幕的帧缓存。

    六、Shader 语言

    OpenGL语言是GLSL(OpenGL Shading Language):优点是跨平台没有提供着色器编译器,由显卡驱动来完成着色器编译工作。依赖硬件而非操作系统层级的。

    DirectX语言是HLSL(High Level Shading Language):由微软控制着色器编译,支持平台受限。

    NVIDIA的CG(C for Graphic):真正的跨平台,会编译成相应的中间语言,因为跟微软合作,所以语法很像HLSL。

    HLSL、GLSL、Cg是高级语言,会被编译成汇编语言,也就是中间语言(Intermediate Language,IL),然后中间语言交给显卡驱动来翻译成真正的机器语言,即GPU可以理解的语言。

    顶点着色器:Vertex Shader

    几何着色器:Geometry Shader

    曲面细分着色器:Tessellation Shader

    片元着色器:Fragment Shader

    EBO(Element Buffer Object也叫IBO(Index Buffer Object))索引缓冲区对象,这个缓冲区主要用来存储顶点的索引信息。

    VBO(Vertex Buffer Object)顶点缓冲区对象,主要用来存储顶点的各种信息。好处:模型的顶点信息放进VBO,这样每次画模型时,数据不用再从CPU的内存取,而是直接从GPU的显存里取,提高效率。

    VAO(Vertex Arrary Object)顶点数组对象,保存了所有顶点数据属性的状态结合,存储了顶点数据的格式以及顶点数据所需的VBO对象的引用。本身并没有存储顶点的相关属性数据,这些数据是存储在VBO中的,VAO相当于是对很多个VBO的引用,把一些VBO组合在一起作为一个对象统一管理。

  • 相关阅读:
    在Linux中运行Nancy应用程序
    医疗行业信息化学习资源
    Windows Live Writer 的昨日荣光
    读书笔记:李叔同,说佛(上),为人十训
    使用Expression Tree构建动态LINQ查询
    读书笔记:季羡林关于如何做研究学问的心得
    XML序列化的时候如何支持Namespace
    Kafka Consumer
    Linux环境安装Golang
    Linux 下 zip 文件解压乱码如何解决
  • 原文地址:https://www.cnblogs.com/wwhhgg/p/13025584.html
Copyright © 2011-2022 走看看