美文网首页
3.1 Shader Language 原理

3.1 Shader Language 原理

作者: 代码咖啡 | 来源:发表于2018-08-18 23:02 被阅读26次

    文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!

    第 3 章 Shader Language

    In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG.


    shader language,称为着色语言,shade 在英语是阴影、颜色深浅的意思,Wikipedia 上对 shader language 的解释为:

    “The job of a surface shading procedure is to choose a color for each pixel on a surface, incorporating any variations in color of the surface itself and the effects of lights that shine on the surface(Marc Olano)”

    即,shader language 基于物体本身属性和光照条件,计算每个像素的颜色值

    实际上这种解释具有明显的时代局限性,在 GPU 编程发展的早期,shader language 的提出目标是加强对图形处理算法的控制,所以对该语言的定义亦针对于此。但随着技术的进步,目前的 shader language 早已经用于通用计算研究。

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

    目前,shader language 的发展方向是设计出在便捷性方面可以和 C++\JAVA 相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染 过程”同时“利用图形硬件的并行性,提高算法的效率”。Shader language 目前主要有 3 种语言:基于 OpenGL 的 GLSL,基于 Direct3D 的 HLSL,还有 NVIDIA 公司的 Cg 语言

    本章的目的是阐述 shader language 的基本原理和运行流程,首先从硬件的角度对 Programmable Vertex Processor(可编程顶点处理器,又称为顶点着色器)和Programmable Fragment Processor(可编程片断处理器,又称为片断着色器) 的作用进行阐述,然后在此基础上对 vertex programfragment program 进行具 体论述,后对 GLSLHLSLCg 进行比较。

    3.1 Shader Language 原理

    使用 shader language 编写的程序称之为 shader program(着色程序)。着色程 序分为两类:vertex shader program(顶点着色程序)和 fragment shader program(片断着色程序)。为了清楚的解释顶点着色和片断着色的含义,我们首先从阐述 GPU 上的两个组件:Programmable Vertex Processor(可编程顶点处理器,又 称为顶点着色器)和 Programmable Fragment Processor(可编程片断处理器,又 称为片断着色器)。文献[2]第 1.2.4 节中论述到:

    The vertex and Fragment processing broken out into programmable units. The Programmable vertex processor is the hardware unit that runs your Cg Vertex programs, whereas the programmable fragment processor is the unit that runs your Cg fragment programs.

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

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

    如上所述,顶点程序运行在顶点处理器上,片段程序运行在片段处理器上, 哪么它们究竟控制了 GPU 渲染的哪个过程。图 8展示了可编程图形渲染管线。

    图 8 可编程图形渲染管线

    对比上一章图 3 中的 GPU 渲染管线,可以看出,顶点着色器控制顶点坐标
    转换过程;片段着色器控制像素颜色计算过程
    。这样就区分出顶点着色程序和片段着色程序的各自分工:Vertex program 负责顶点坐标变换;Fragment program 负责像素颜色计算;前者的输出是后者的输入。

    图 9展示了现阶段可编程图形硬件的输入\输出。输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;纹理 buffer 存放纹理数据,目前大多数的可编程图形硬件只支持片段处理器处理纹理;从外部宿主程序输入的常量放在常量寄存器中;临时寄存器存放着色程序在执行过程中产生的临时数据。

    图 9 可编程图形硬件输入\输出

    相关文章

      网友评论

          本文标题:3.1 Shader Language 原理

          本文链接:https://www.haomeiwen.com/subject/rmjqiftx.html