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的共通之处很多。在早期的官方文档里，这两者被解释成贴了两个牌的同一门语言。
 細節 
 資料型別 
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;
 }

 參照 
 程序设计语言
 计算机图形学
 Vertex and pixel shaders
 High level shader language
 OpenGL shading language
 Shader Model
 OpenGL
 DirectX

 外部連結 
 NVIDIA
 Cg home page
 OpenGL home page
 DirectX home page
 ShaderTech - GPU Programming
 NeHe Cg vertex shader tutorial
 Far Cry
 A glimpse at Cg Shader Toolkit
 Virtools

Category:C語言家族
Category:著色器語言