Cg (programming language)
Cg (short for C for Graphics[1]) is a high-level shading language developed by Nvidia for programming vertex and pixel shaders. Cg is based on the C programming language and although they share the same syntax, some features of C were modified and new data types were added to make Cg more suitable for programming graphics processing units. This language is only suitable for GPU programming and is not a general programming language. The Cg compiler outputs DirectX or OpenGL shader programs. Since 2012, Cg was deprecated, with no additional development or support available.[2]
A significant subset of Cg is shared with HLSL, as the language was developed in close collaboration with Microsoft.[3] In early documentation, they are considered the same language marketed differently.[4]
Background
Due to technical advances in graphics hardware, some areas of 3D graphics programming have become quite complex. To simplify the process, new features were added to graphics cards, including the ability to modify their rendering pipelines using vertex and pixel shaders.
In the beginning, vertex and pixel shaders were programmed at a very low level with only the assembly language of the graphics processing unit. Although using the assembly language gave the programmer complete control over code and flexibility, it was fairly hard to use. A portable, higher level language for programming the GPU was needed, so Cg was created to overcome these problems and make shader development easier.
Some of the benefits of using Cg over assembly are:
- High level code is easier to learn, program, read, and maintain than assembly code.
- Cg code is portable to a wide range of hardware and platforms, unlike assembly code, which usually depends on hardware and the platforms it's written for.
- The Cg compiler can optimize code and do lower level tasks automatically, which are hard to do and error prone in assembly.
Language
Data types
Cg has six basic data types. Some of them are the same as in C, while others are especially added for GPU programming. These types are:
- float - a 32bit floating point number
- half - a 16bit floating point number
- int - a 32bit integer
- fixed - a 12bit fixed point number
- bool - a boolean variable
- sampler* - represents a texture object
Cg also features vector and matrix data types that are based on the basic data types, such as float3 and float4x4. Such data types are quite common when dealing with 3D graphics programming. Cg also has struct and array data types, which work in a similar way to their C equivalents.
Operators
Cg supports a wide range of operators, including the common arithmetic operators from C, the equivalent arithmetic operators for vector and matrix data types, and the common logical operators.
Functions and control structures
Cg shares the basic control structures with C, like if/else, while, and for. It also has a similar way of defining functions.
Preprocessor
Cg implements many C preprocessor directives and its macro expansion system. It implements #include
.[5]
Environment
Compilation targets
Cg programs are built for different profiles that stand for GPUs with different hardware capabilities. These profiles decide, among others, how many instructions can be in each shader, how many registers are available, and what kind of resources a shader can use. Even if a program is correct, it might be too complex to work on a profile.[5]
The standard Cg library
As in C, Cg features a set of functions for common tasks in GPU programming. Some of the functions have equivalents in C, like the mathematical functions abs and sin, while others are specialized in GPU programming tasks, like the texture mapping functions tex1D and tex2D.
The Cg runtime library
Cg programs are merely vertex and pixel shaders, and they need supporting programs that handle the rest of the rendering process. Cg can be used with two graphics APIs: OpenGL or DirectX. Each has its own set of Cg functions to communicate with the Cg program, like setting the current Cg shader, passing parameters, and such tasks.
In addition to being able to compile Cg source to assembly code, the Cg runtime also has the ability to compile shaders during execution of the supporting program. This allows the runtime to compile the shader using the latest optimizations available for hardware that the program is currently executing on. However, this technique requires that the source code for the shader be available in plain text to the compiler, allowing the user of the program to access the source-code for the shader. Some developers view this as a major drawback of this technique.
To avoid exposing the source code of the shader, and still maintain some of the hardware specific optimizations, the concept of profiles was developed. Shaders can be compiled to suit different graphics hardware platforms (according to profiles). When executing the supporting program, the best/most optimized shader is loaded according to its profile. For instance there might be a profile for a graphics card that supports complex pixel shaders, and another profile for one that supports only minimal pixel shaders. By creating a pixel shader for each of these profiles a supporting program enlarges the number of supported hardware platforms without sacrificing picture quality on powerful systems.
Examples
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;
}
Applications and games that use Cg
- 3DVIA Virtools
- Adobe Photoshop
- Maya[6]
- Battlefield 2
- Cafu Engine
- Crystal Space
- Dolphinity Racer
- Earth's Special Forces - A Half-Life Mod
- Enemy Territory: Quake Wars
- Doom 3 BFG Edition
- EON Professional™/Ultra™ of EON Reality
- eyeon Fusion
- Far Cry
- Garshasp: The Monster Slayer
- GLScene
- Gun Metal
- Hitman: Blood Money
- Irrlicht Engine
- League of Legends
- Lightfeather 3D Engine
- LightWave 11.6[7]
- muvee Reveal
- OGRE
- OpenEmu
- Panda3D
- PCSX2
- PlayStation 3
- RetroArch
- R.U.S.E.
- Snes9x
- Unity game engine[8]
- Unreal Engine
See also
- Computer programming
- Computer graphics
- Vertex and pixel shaders
- High level shader language
- OpenGL shading language
- Shader Model
- OpenGL
- DirectX
References
- "Cg FAQ". NVIDIA DesignWorks. 8 March 2011. Retrieved 25 May 2017.
- "Cg Toolkit | NVIDIA Developer". 8 March 2011.
- "Fusion Industries :: Cg and HLSL FAQ ::". 24 August 2012. Archived from the original on 24 August 2012.
- "The Cg Tutorial - Chapter 1. Introduction". developer.download.nvidia.cn.
- Mark J. Kilgard, Cg in Two Pages, 2003.
- "Maya Cg Plug-in | NVIDIA".
- "LightWave - 11.6 Features Overview".
- "Unity - Manual: Writing Shaders".
Further reading
- Randima Fernando, Mark J. Kilgard, The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics, Addison-Wesley Professional, ISBN 0-321-19496-9
- Randima Fernando, GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics, Addison-Wesley Professional, ISBN 0-321-22832-4
- William R. Mark, R. Steven Glanville, Kurt Akeley, Mark J. Kilgard, Cg: A System for Programming Graphics Hardware in a C-like Language, Proceedings of SIGGRAPH 2003, doi:10.1145/1201775.882362
External links
- cgc-opensrc - Mirror for nvidia's open source compiler, 2002
- Some essential materials (e.g. the design paper) are gathered in these course notes from Siggraph 2005
- Nvidia-hosted materials:
- Cg home page
- Cg Tutorial (Free Book)
- Cg language, runtime, profile, standard library, CgFX state and command documentation.
- Cg FAQ
- NeHe Cg vertex shader tutorial
- Documentation for the Cg Shader standard used by emulators
- Aras Pranckevičius, Cross Platform Shaders in 2014.