摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”

第三章从 GPU 运行原理和数据流程的角度阐述了顶点着色程序和片段着色程序的输入输出,即,应用程序(宿主程序)将图元信息(顶点位置、法向量、纹理坐标等)传递给顶点着色程序;顶点着色程序基于图元信息进行坐标空间转换,运算得到的数据传递到片段着色程序中;片段着色程序还可以接受从应用程序中传递的纹理信息,将这些信息综合起来计算每个片段的颜色值,最后将这些颜色值输送到帧缓冲区(或颜色缓冲区)中。

这些是顶点着色程序和片段着色程序的基本功能和数据输入输出,实际上现在的着色程序已经可以接受多种数据类型,并灵活的进行各种算法的处理,如,可以接受光源信息(光源位置、强度等)、材质信息(反射系数、折射系数等)、运动控制信息(纹理投影矩阵、顶点运动矩阵等),可以在顶点程序中计算光线的折射方向,并传递到片段程序中进行光照计算。

这一章节中,我们将讲解Cg 语言通过何种机制确定数据类型和传递形式。读者要抱着如下几个问题阅读本章节:

1.      从应用程序传递到 GPU 的数据,分为图元信息数据(在GPU 处理的基本数据如顶点位置信息等)和其他的离散数据(在GPU 运行流程中不会发生变化,如材质对光的反射、折射信息),这两种输入数据如何区分?

2.      从应用程序传递到GPU 中的图元信息如何区分类型,即,顶点程序怎么知道一个数据是位置数据,而不是法向量数据?

3.      顶点着色程序与片段着色程序之间的数据传递如何进行?

7.1Cg 关键字

关键字是语言本身所保留的一个字符串集合,用于代表特定的含义,如前面所讲到的数据类型关键字 int 、 float 等,以及结构体关键字 struct 。 Cg 中的关键字很多都是照搬 C\C++ 中的关键字,不过 Cg 中也创造了一系列独特的关键字,这些关键字不但用于指定输入图元的数据含义(是位置信息,还是法向量信息),本质也则对应着这些图元数据存放的硬件资源(寄存器或者纹理),称之为语义词( Semantics ),通常也根据其用法称之为绑定语义词( binding semantics )。

除语义词外, Cg 中还提供了三个关键字, in 、 out 、 inout ,用于表示函数的输入参数的传递方式,称为输入 \ 输出关键字,这组关键字可以和语义词合用表达硬件上不同的存储位置,即同一个语义词,使用 in 关键字修辞和 out 关键词修辞,表示的图形硬件上不同的寄存器。

Cg 语言还提供两个修辞符: uniform ,用于指定变量的数据初始化方式; const 关键字的含义与 C\C++ 中相同,表示被修辞变量为常量变量。

下面将分别对上述的关键字进行详细阐述。这一章非常关键,尤其是语义词的使用方法和含义,再小的 Cg 程序都需要使用到语义词。

7.2uniform

Cg 语言将输入数据流分为两类(参见文献[3] Program inputs and Outputs ):

1.      Varying inputs , 即数据流输入图元信息的各种组成要素。从应用程序输入到 GPU 的数据除了顶点位置数据,还有顶点的法向量数据,纹理坐标数据等。 Cg 语言提供了一组语义词,用以表明参数是由顶点的哪些数据初始化的。

2.      Uniform inputs ,表示一些与三维渲染有关的离散信息数据,这些数据通常由应用程序传入,并通常不会随着图元信息的变化而变化,如材质对光的反射信息、运动矩阵等。 Uniform 修辞一个参数,表示该参数的值由外部应用程序初始化并传入;例如 在参数列表中写:

uniform float brightness,

uniform float4x4 modleWorldProject

表示从“外部”传入一个 float 类型数据,和一个4 阶矩阵。“外部”的含义通常是用 OpenGL 或者 DirectX 所编写的应用程序。

使用 Uniform 修辞的变量,除了数据来源不同外,与其他变量是完全一样的。

需要注意的一点是: uniform 修辞的变量的值是从外部传入的,所以在Cg 程序(顶点程序和片段程序)中通常使用 uniform 参数修辞函数形参,不容许声明一个用 uniform 修辞的局部变量!否则编译时会出现错误提示信息:

Error C5056:’uniform’not allowed on local variable

7.3const

Cg 语言也提供 const 修辞符,与 C\C++ 中含义一样,被 const 所修辞的变量在初始化之后不能再去改变它的值。下面的例子程序中有一个声明为 const 的变量被赋值修改:

const float a = 1.0;

a = 2.0;  // 错误

float b = a++; // 错误

编译时会出现错误提示信息: error C1026: assignment to const variable 。

const 修辞符与 uniform 修辞符是相互独立的,对一个变量既可以单独使用 const 或者 uniform ,也可以同时使用。

7.4输入\ 输出修辞符( in\out\inout )

参数传递是指:函数调用实参值初始化函数形参的过程。在 C\C++ 中,根据形参值的改变是否会导致实参值的改变,参数传递分为 “ 值传递( pass-by-value ) ” 和 “ 引用传递( pass-by-reference ) ” 。按值传递时,函数不会访问当前调用的实参,函数体处理的是实参的拷贝,也就是形参,所以形参值的改变不会影响实参值;引用传递时,函数接收的是实参的存放地址,函数体中改变的是实参的值。 C\C++ 采取指针机制构建引用传递,所以通常引用传递也称为 “ 指针传递 ” 。

Cg 语言中参数传递方式同样分为 “ 值传递 ” 和 “ 引用传递 ” ,但指针机制并不被 GPU 硬件所支持,所以 Cg 语言采用不同的语法修辞符来区别 “ 值传递 ” 和 “ 引用传递 ” 。这些修辞符分别为:

1.      in : 修辞一个形参只是用于输入,进入函数体时被初始化,且该形参值的改变不会影响实参值,这是典型的值传递方式。

2.      out : 修辞一个形参只是用于输出的,进入函数体时并没有被初始化,这种类型的形参一般是一个函数的运行结果;

3.      inout : 修辞一个形参既用于输入也用于输出,这是典型的引用传递。

举例如下:

void myFunction(out float x);  // 形参 x ,只是用于输出

void myFunction(inout float x);  // 形参 x ,即用于输入时初始化,也用于输出数据

void myFunction(in float x);  // 形参 x ,只是用于输入

void myFunction(float x);  / 等价与 in float x ,这种用法和 C\C++ 完全一致

也可以使用 return 语句来代替 out 修辞符的使用。输入 \ 输出修辞符通常和语义词一起使用,表示顶点着色程序和片段着色程序的输入输出。

Cg(C for Graphic)语言关键字(转)的更多相关文章

  1. FILE不是C语言关键字

    FILE不是C语言关键字,只是标准C中的标准输入输出中定义的一个新的数据类型 stdio.htypedef struct _iobuf{ char* _ptr; int _cnt; char* _ba ...

  2. 李洪强漫谈iOS开发[C语言-009] - C语言关键字

    // //  main.m //  04 - C语言关键字 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All r ...

  3. C语言关键字-volatile

    1.C语言关键字volatile     C 语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取 不能缓存 ...

  4. c语言关键字总结

    1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从 ...

  5. 1.C语言关键字(auto break case char const swtich)

    ANSI C标准C语言共有32个关键字,分别为: auto break case char const continue default do double else enum extern floa ...

  6. C/C++ 知识点---C语言关键字(32个)

    C/C++ 知识点 1.C语言关键字(32个) <1>.基本数据类型 [5] void :声明函数无返回值或无参数,声明空类型指针 char :声明字符型变量 int :声明整形变量 fl ...

  7. 执行Go程序的三种方式及Go语言关键字

    执行 Go 程序的三种方式及 Go 语言关键字 执行 Go 程序的三种方式 一.使用 go run 命令 二.使用 go build 命令 Step1. 对 go 源码源文件执行 go build 命 ...

  8. 继续学习:C语言关键字

    auto :声明自动变量 break:跳出当前循环 case:开关语句分支 char :声明字符型变量或函数 const :声明只读变量 continue:结束当前循环,开始下一轮循环 default ...

  9. 统计C语言关键字出现次数

    统计C语言关键字出现次数 <C程序设计语言>K&R版本第6章结构6.3结构数组内容 /* Name: 统计c语言关键字出现次数 Copyright: Author: lingr7 ...

  10. C语言关键字之sizeof

    C语言关键字 sizeof 是一个操作符,返回对象或类型所占内存字节数,类型为size_t(定义在<stddef.h>),有2种用法: sizeof unary-expression si ...

随机推荐

  1. 【软件project】菜鸟俯瞰软件project

    [背景]初次接触软件project,对软件project不是彻底的了解.但学完一遍软件project,我还是有些感触的. 以下我就对我这阶段的软工学习和理解做一下小小的总结,如有不妥之处.欢迎指正. ...

  2. opencms 安装出现以下的问题:Your &#39;max_allowed_packet&#39; variable is set to less than 16777216 Byte (16MB).

    一.问题 在安装opencms是会出现例如以下错误: MySQL system variable 'max_allowed_packet' is set to 1048576 Byte (1MB). ...

  3. Effective C++ 条款八 别让异常逃离析构函数

    class DBConn //这个class用来管理DBConnction对象 { public:   //自己设计一个新的DBConn接口 方法3 void close() { db.close() ...

  4. eclipse中progress一直在刷新问题处理

  5. CodeVS2492 上帝造题的七分钟2(树状数组+并查集)

    传送门 树状数组模板题.注意优化,假设某个数的值已经是1了的话.那么我们以后就不用对他进行操作了,这个能够用并查集实现. 这道题还有个坑的地方,给出查询区间端点的a,b,有可能a>b. #inc ...

  6. git svn 报错

    删除 openjdk 时 remove 了一大堆软件. 可能由于这个原因导致使用 git svn 命令时出现类似下面的错误. sam@sam-CW65S:pics$ git svn rebase Ca ...

  7. openwrt mt7620 内存大小检测

    单独编译内核: make V=s target/linux/install 相调函数调用流程: init/main.c : start_kernel() -> setup_arch(&c ...

  8. 豆瓣面试题strstr)

    /*(豆瓣2013面试题strstr) 有一个在给定字符串中查找子串的函数strstr, 该函数从给定的字符串src中查找substr并返回一个整数, 指明substr第一次出现的位置(从0开始计数) ...

  9. 用Java编写的http下载工具类,包含下载进度回调

    HttpDownloader.java package com.buyishi; import java.io.FileOutputStream; import java.io.IOException ...

  10. ABAP range 用法

    转自http://www.sapjx.com/abap-range-table.html 1. Range Table 概述 Range Table 为 SAP R/3系统标准内表的一种,结构与 Se ...