Cg语言
Cg语言(C for Graphics)是为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顶点流水线,反之亦然。
由于Nvidia和微软合作紧密,Cg语言和HLSL的共通之处很多。[1]在早期的官方文档里,这两者被解释成贴了两个牌的同一门语言。[2]
细节
编辑资料类型
编辑Cg有6种数据类型(data types),跟C语言相当类似,有一些是为GPU特别定义的,类型如下:
- float - 32位浮点数
- half - 16位浮点数
- int - 32位整数
- fixed - 12位定点数
- bool - 布尔值
- sampler* - 代表纹理对象(texture object)
示例
编辑- A sample Cg vertex shader
// input vertex
struct VertIn {
float4 pos : POSITION;
float4 color : COLOR0;
};
// output vertex
struct VertOut {
float4 pos : POSITION;
float4 color : COLOR0;
};
// vertex shader main entry
VertOut main(VertIn IN, uniform float4x4 modelViewProj) {
VertOut OUT;
OUT.pos = mul(modelViewProj, IN.pos); // calculate output coords
OUT.color = IN.color; // copy input color to output
OUT.color.z = 1.0f; // blue component of color = 1.0f
return OUT;
}
引用
编辑外部链接
编辑- NVIDIA(页面存档备份,存于互联网档案馆)
- OpenGL home page(页面存档备份,存于互联网档案馆)
- DirectX home page(页面存档备份,存于互联网档案馆)
- ShaderTech - GPU Programming
- NeHe Cg vertex shader tutorial
- Far Cry(页面存档备份,存于互联网档案馆)
- A glimpse at Cg Shader Toolkit
- Virtools(页面存档备份,存于互联网档案馆)
- ^ Fusion Industries :: Cg and HLSL FAQ ::. 2012-08-24 [2020-04-25]. (原始内容存档于2012-08-24).
- ^ The Cg Tutorial - Chapter 1. Introduction. developer.download.nvidia.cn. [2020-04-25]. (原始内容存档于2022-04-15).