Shader的CG语言基础知识

Cg语言是为GPU编程设计的高级绘制语言,由NVIDIA公司开发。Cg极力保留C语言的大部分语义,并让开发者从硬件细节 中解脱出来,Cg同时也有一个高级语言的其他好处,如代码的易重用性,可读性得到提高,编译器代码优化。  

Cg语言主要参照ANSI C建模,但也从C++和Java以及早期的绘制语言如RenderMan and the Stanford shading language中吸取了一些思想。这些使得很容易写程序然后由编译器进行优化,提高了可读性。而且Cg的设计考虑了GPU的体系结构,如可编程多处理器单元(顶点处理器,像素处理器,外加不可编程单元). 这些部分和应用都是通过数据流连接起来。Cg语言允许分别为顶点和像素写程序。Cg API引入了profiles的概念以处理顶点和像素编程所缺乏的通用性。一个Cg profile就定义了一套整个Cg语言的子集以适应不同的硬件平台和API。Cg程序可以根据运行时的需要或者事先编译成GPU汇编代码。这样可以很容易地将一个Cg像素程序和手写的顶点程序结合起来,或者甚至采用不可编程的OpenGL或者DirectX顶点流水线,反之亦然 。

CG语言官方首页:http://developer.nvidia.com/page/cg_main.html 里面包含了大量的例子和说明,但是全是E文的。

基础语法

Shader本身是一个单纯的单元,就是对输入(顶点或像素或物体)进行能做的算术运算,然后把结果送出的一个固件。


1. 内置元类型
float: 32 bit浮点类型
half:  16 bit浮点
int:   32 bit 整形
fixd:  12 bit定点
bool:  布尔值
sampler*: 纹理对象的句柄
string:  不是每个都支持

上述类型很多都被cg提供内置的向量数据类型(build-in vector data types),如

float1、float4,
bool2, bool3,
float1x1
float2x3

eg:
这里写图片描述
这里写图片描述
类型转换跟C是一样的,用强制转化。
类型定义的时候可以在常量后跟后缀,如2.0f,1.0h,3x。目前值有f,h,x(fixed)三种。

2. 支持类型

数组

float a[10]; 
float4 b[10]; 
int length = a.length; //获取长度,上面两个返回都是10
float b[2][3] = { { }, { } };
int length1 = b.length; // length1 = 2;
int length2 = b[0].length; // length = 3;

结构
以struct开始,紧跟名字,内容用{};包住。不要忘记最后的分号。
结构中可以带function,是C++中的用法。
结构不支持继承。

3. 特定关键字
in , out , inout,
uniform (被修饰的变量从外部传入), const ,
4. 输入语义关键字

Vertex Shader的输入:

POSITION, NORMAL, BINORMAL, BLENDINDICES, BLENDWEIGHT, TANGENT, PSIZE, 
TEXCOORD0 ~ TEXCOORD7

如:in float4 modelPos: POSITION

Vertex Shader的输出, 也就是Pixel Shader的输入

POSITION, PSIZE, FOG,COLOR0 ~ COLOR1, TEXCOORD1 ~ TEXCOORD7

Pixel Shader的输出:

COLOR

eg:
这里写图片描述

5. 入口函数

通过观察程序的输入输出语义绑定,就可以区分入口函数对应到顶点程序还是片段程序。

6. 内置函数库
reflect  求发射向量
refract  求折射向量
mul      矩阵相乘
normalize  归一化

eg:
这里写图片描述
CG语言入门系列资料介绍:

很好很全面的东西:

http://blog.csdn.net/liu_lin_xm?viewmode=contents
由www.J2meGame.com精心收集,转载请说明。

下一篇:Unity3D Shader学习总结(一)

猜你喜欢

转载自blog.csdn.net/kitok/article/details/79550240