GPU图形与shader

来源:互联网 发布:silence网络什么意思 编辑:程序博客网 时间:2024/05/17 22:18

  本文转自:http://jingyan.baidu.com/article/9f7e7ec054f4cf6f28155405.html

本篇介绍 shader language 的基本原理和运行流程

百度经验:jingyan.baidu.com

shader lab 初步了解

  1. 1

    shader language 被定位为高级语言,如,GLSL 的全称是“High Level Shading Language”,Cg 语言的全称为“C for Graphic”,并且这两种 shader language 的语 法设计非常类似于 C 语言。不过高级语言的一个重要特性是“独立于硬件”,在这 一方面 shader language 暂时还做不到,shader language 完全依赖于 GPU 构架,这一特征在现阶段是非常明显的!任意一种 shader language 都必须基于图形硬 件,所以 GPU 编程技术的发展本质上还是图形硬件的发展。在 shader language存在之前,展示基于图形硬件的编程能力只能靠低级的汇编语言。

  2. 2

    Shader language 目前主 要有 3 种语言:基于 OpenGL 的 GLSL,基于 Direct3D 的 HLSL,还有 NVIDIA公司的 Cg 语言。

  3. 3

    Programmable Vertex Processor 可编程顶点处理器又称为顶点着色器

    Programmable Fragment Processor 可编程片段处理器,又称为片段着色器

    END
百度经验:jingyan.baidu.com

shader Language 原理

  1. 1

    顶点和片段处理器被分离成可编程单元,可编程顶点处理 器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行 片段程序的单元。

  2. 2

    顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于 4 阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还 不行,这是顶点处理器的一个发展方向)。

  3. 3

    顶点程序运行在顶点处理器上,片段程序运行在片段处理器上,那么他们究竟控制了GPU渲染的那个过程。下图为可编程图形渲染管线

    GPU图形与shader步骤阅读
  4. 4

    各自的分工:

    从上表我们可以看出,

    顶点着色程序负责顶点坐标变换;

    片段程序负责像素颜色计算

    前者的输出是后者的输入。

  5. 5

    输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;

    纹理buffer存放纹理数据 Tip:目前大多数的可编程图形硬件只支持片段处理器处理纹理;

    从外部输入的常量最好放在常量寄存器中;

    临时寄存器存放着色程序在执行过程中产生的临时数据。

    GPU图形与shader步骤阅读
    END
百度经验:jingyan.baidu.com

Vertex Shader Program

  1. 1

    顶点着色程序从 GPU 前端模块(寄存器)中提取图元信息(顶点位置、法 向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等 操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需 要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传 递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送 光栅操作模块。

  2. 2

    在应用程序中设 定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到 vertex buffer 中;纹 理信息传递到 texture buffer 中。其中虚线表示目前还没有实现的数据传递。当前 的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。

  3. 3

    顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为 后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。例如,输入一个三角面片,顶点着色程序对其进行 phong 光照计算,只计算三个顶点的 光照颜色,而三角面片内部点的颜色按照硬件默认的算法(Gourand 明暗处理或 者快速 phong 明暗处理)进行插值,如果图形硬件比较先进,默认的处理算法较 好(快速 phong 明暗处理),则效果也会较好;如果图形硬件使用 Gourand 明暗 处理算法,则会出现马赫带效应(条带化)。

    而片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写,不但可控性好,而且可以达到更好的效果。

    由于 GPU 对数据进行并行处理,所以每个数据都会执行一次 shader 程序程 序。即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。

    GPU图形与shader步骤阅读
    END
百度经验:jingyan.baidu.com

Fragment Shader Program

  1. 1

    片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。

  2. 2

    片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于 GPU 而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一 个研究方向。

  3. 3

    Tips:

    什么是片断?片断和像素有什么不一样?所谓片断就是所有的三维顶点 在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素 都是经过深度比较的。

    END
百度经验:jingyan.baidu.com

注意事项

  • 目前大多数的可编程图形硬件只支持片段处理器处理纹理;

  • 顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为 后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。

  • 片段着色程序还有一个突出的特点是:拥有检索纹理的能力。

0 0