Difference between revisions of "Cg"

From OpenGL Wiki
Jump to navigation Jump to search
 
(20 intermediate revisions by 7 users not shown)
Line 1: Line 1:
'''Cg''' or '''C for Graphics''' is a high level shading language created by [http://www.nvidia.com NVIDIA] to simplify vertex and fragment shader programming.
+
'''[http://developer.nvidia.com/page/cg_main.html Cg]''' or '''C for Graphics''' is a high level shading language created by [http://www.nvidia.com NVIDIA] to simplify vertex and fragment shader programming.  Though it now supports geometry and tessellation shaders as well. Note, that Cg has been [https://developer.nvidia.com/cg-toolkit discontinued and NVIDIA doesn't recommend to use it for new projects].
  
Although Cg shares many syntactical similarities with C/C++, some features were modified to accmodate the inherent differences between normal programming and GPU programming.
+
Although [[Cg]] shares many syntactical similarities with C/C++, some features were modified to accommodate the inherent differences between CPU programming and GPU programming.
  
 
==Background==
 
==Background==
As a result of technical advancements in graphics cards, 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.
+
As a result of technical advancements in graphics cards, 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 (and more recently geometry 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 (just as with CPU assembly languages). 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:
 
Some of the benefits of using Cg over assembly are:
 +
 
* High level code is easier to learn, program, read, and understand than assembly code.
 
* High level code is easier to learn, program, read, and understand 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.
 
* 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.
 
* The Cg compiler can optimize code and do lower level tasks automatically, which are hard to do and error prone in assembly.
  
==Benefits: Why use Cg==
+
== Benefits: Why use Cg ==
Initially Cg was the only way for OpenGL programmers to program graphics hardware. With the arrival of GLSL on the scene and with HLSL being more popular on DirectX, it was thought that Cg would soon die. However, due to its "platform independent" nature, and with the upcoming Playstation 3 from Sony using Cg as the primary shading language, there has actually been an increasing trend towards using Cg in many engines. There are many reasons as listed below:
+
 
 +
Initially Cg was the only high level language for OpenGL programmers to program graphics hardware. With the arrival of [[GLSL]] on the scene and with HLSL being more popular on DirectX, it was thought that [[Cg]] would soon die. However, due to its "platform independent" nature, and with the upcoming Playstation 3 from Sony using Cg as the primary shading language, there has actually been an increasing trend towards using Cg in many engines. There are many reasons as listed below:
 +
 
 
* Cg shaders are more portable and many platforms are supported. Initially there were compatibility problems on many hardware (particularly from IHVs other than NVIDIA), but most seem to have been resolved now.
 
* Cg shaders are more portable and many platforms are supported. Initially there were compatibility problems on many hardware (particularly from IHVs other than NVIDIA), but most seem to have been resolved now.
 
* Cg has a syntax similar to HLSL (DirectX) and that makes porting Cg shaders to HLSL very easy. Sometimes Cg shaders can be compiled on DirectX without any modification.
 
* Cg has a syntax similar to HLSL (DirectX) and that makes porting Cg shaders to HLSL very easy. Sometimes Cg shaders can be compiled on DirectX without any modification.
* Many games support multiple platforms and writing shaders in "native" shading languages can get extremely complicated, especially with engines providing many thousand built-in shaders. This is where Cg can come handy, providing the user with the "Where Once Run Everywhere" convenience. Information on whether Cg supports XBox-360 is not available.
+
* Many games support multiple platforms and writing shaders in "native" shading languages can get extremely complicated, especially with engines providing many thousand built-in shaders. This is where Cg can come handy, providing the user with the "Write Once Run Everywhere" convenience. Information on whether Cg supports XBox-360 is not available.
  
 
==Details==
 
==Details==
 +
 
===Data types===
 
===Data types===
 +
 
Cg has six basic data types, some of them are the same as in C, others are especially added for GPU programming, these types are:
 
Cg has six basic data types, some of them are the same as in C, 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, 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 C equivalents.
+
* '''float''' - a 32-bit floating point number
 +
* '''half''' - a 16-bit floating point number
 +
* '''int''' - a 32-bit integer
 +
* '''fixed''' - a 12-bit 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, 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 C equivalents.
  
 
===Operators===
 
===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.
 
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===
 
===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.
 
Cg shares the basic control structures with C, like if/else, while, and for. It also has a similar way of defining functions.
  
 
===The standard Cg library===
 
===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.
 
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===
 
===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 APIs, [[History_of_OpenGL|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.
+
 
 +
Cg programs are merely vertex, geometry, and pixel shaders, and they need supporting programs that handle the rest of the rendering process, Cg can be used with two APIs: [[History_of_OpenGL|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.
  
 
===A sample Cg vertex shader===
 
===A sample Cg vertex shader===
// input vertex
 
struct VertIn {
 
    float4 pos  : POSITION;
 
    float4 color : COLOR0;
 
};
 
  
// output vertex
+
<source lang="c">
struct VertOut {
+
// input vertex
    float4 pos  : POSITION;
+
struct VertIn {
    float4 color : COLOR0;
+
    float4 pos  : POSITION;
};
+
    float4 color : COLOR0;
 +
};
  
// vertex shader main entry
+
// output vertex
VertOut main(VertIn IN, uniform float4x4 modelViewProj) {
+
struct VertOut {
    VertOut OUT;
+
    float4 pos  : POSITION;
    OUT.pos    = mul(modelViewProj, IN.pos); // calculate output coords
+
    float4 color : COLOR0;
    OUT.color  = IN.color; // copy input color to output
+
};
    OUT.color.z = 1.0f; // blue component of color = 1.0f
+
 
    return OUT;
+
// 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;
 +
}
 +
</source>
  
 
==Applications and games that use Cg==
 
==Applications and games that use Cg==
 +
 
* [http://www.farcry-thegame.com/ Far Cry]
 
* [http://www.farcry-thegame.com/ Far Cry]
 
* [http://www.playstation.com/ PlayStation 3 compatibility]
 
* [http://www.playstation.com/ PlayStation 3 compatibility]
Line 72: Line 87:
  
 
==Further reading==
 
==Further reading==
*Randima Fernando, Mark J. Kilgard, ''The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics'', Addison-Wesley Professional, ISBN 0-32119-496-9
+
 
*Randima Fernando, ''GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics'', Addison-Wesley Professional, ISBN 0-32122-832-4
+
* Randima Fernando, Mark J. Kilgard, ''The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics'', Addison-Wesley Professional, ISBN 0-32119-496-9
*William R. Mark, R. Steven Glanville, Kurt Akeley, Mark J. Kilgard, [http://www.cs.utexas.edu/~billmark/papers/Cg/ ''Cg: A System for Programming Graphics Hardware in a C-like Language''], [http://www.cs.brown.edu/~tor/sig2003.html Proceedings of SIGGRAPH 2003].
+
* Randima Fernando, ''GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics'', Addison-Wesley Professional, ISBN 0-32122-832-4
 +
* William R. Mark, R. Steven Glanville, Kurt Akeley, Mark J. Kilgard, [http://www.cs.utexas.edu/~billmark/papers/Cg/ ''Cg: A System for Programming Graphics Hardware in a C-like Language''], [http://www.cs.brown.edu/~tor/sig2003.html Proceedings of SIGGRAPH 2003].
 
* Mark J. Kilgard, [http://xxx.lanl.gov/ftp/cs/papers/0302/0302013.pdf ''Cg in Two Pages''], 2003.
 
* Mark J. Kilgard, [http://xxx.lanl.gov/ftp/cs/papers/0302/0302013.pdf ''Cg in Two Pages''], 2003.
  
 
==See also==
 
==See also==
* [[Shading_languages:_GLSL|GLSL: OpenGL Shading Language]]
+
 
* [[History_of_OpenGL|OpenGL]]
+
* [[GLSL]] shading language
 +
* [[Shading languages]] (general)
 +
** [[Shading languages]]
 +
** [[Shading languages: General]]
 +
** [[Shading languages: Which shading language should I use?]]
 +
** [[Shading languages: How to detect shader model?]]
  
 
==External links==
 
==External links==
 +
* [http://developer.nvidia.com/page/cg_main.html Cg home page]
 
* [http://xxx.lanl.gov/ftp/cs/papers/0302/0302013.pdf Cg in Two Pages]
 
* [http://xxx.lanl.gov/ftp/cs/papers/0302/0302013.pdf Cg in Two Pages]
 
* [http://www.shadertech.com ShaderTech]
 
* [http://www.shadertech.com ShaderTech]
 
* [http://www.shadertech.com/articles/cgshaders_faq02.shtml Cg shader FAQ on shadertech]
 
* [http://www.shadertech.com/articles/cgshaders_faq02.shtml Cg shader FAQ on shadertech]
 
* [http://www.nvidia.com/ NVIDIA]
 
* [http://www.nvidia.com/ NVIDIA]
* [http://developer.nvidia.com/page/cg_main.html Cg home page]
 
 
* [http://www.opengl.org OpenGL home page]
 
* [http://www.opengl.org OpenGL home page]
 
* [http://www.microsoft.com/windows/directx/default.aspx DirectX home page]
 
* [http://www.microsoft.com/windows/directx/default.aspx DirectX home page]
 
* [http://www.cgshaders.org/ CgShaders.org]
 
* [http://www.cgshaders.org/ CgShaders.org]
* [http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=47 NeHe Cg vertex shader tutorial]
 
 
* [http://www.farcry-thegame.com/ Far Cry]
 
* [http://www.farcry-thegame.com/ Far Cry]
 
* [http://deathfall.com/feature.php?op=showcontent&id=12 A glimpse at Cg Shader Toolkit]
 
* [http://deathfall.com/feature.php?op=showcontent&id=12 A glimpse at Cg Shader Toolkit]
 +
 +
[[Category:Shading Languages]]

Latest revision as of 21:51, 1 February 2021

Cg or C for Graphics is a high level shading language created by NVIDIA to simplify vertex and fragment shader programming. Though it now supports geometry and tessellation shaders as well. Note, that Cg has been discontinued and NVIDIA doesn't recommend to use it for new projects.

Although Cg shares many syntactical similarities with C/C++, some features were modified to accommodate the inherent differences between CPU programming and GPU programming.

Background

As a result of technical advancements in graphics cards, 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 (and more recently geometry 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 (just as with CPU assembly languages). 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 understand 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.

Benefits: Why use Cg

Initially Cg was the only high level language for OpenGL programmers to program graphics hardware. With the arrival of GLSL on the scene and with HLSL being more popular on DirectX, it was thought that Cg would soon die. However, due to its "platform independent" nature, and with the upcoming Playstation 3 from Sony using Cg as the primary shading language, there has actually been an increasing trend towards using Cg in many engines. There are many reasons as listed below:

  • Cg shaders are more portable and many platforms are supported. Initially there were compatibility problems on many hardware (particularly from IHVs other than NVIDIA), but most seem to have been resolved now.
  • Cg has a syntax similar to HLSL (DirectX) and that makes porting Cg shaders to HLSL very easy. Sometimes Cg shaders can be compiled on DirectX without any modification.
  • Many games support multiple platforms and writing shaders in "native" shading languages can get extremely complicated, especially with engines providing many thousand built-in shaders. This is where Cg can come handy, providing the user with the "Write Once Run Everywhere" convenience. Information on whether Cg supports XBox-360 is not available.

Details

Data types

Cg has six basic data types, some of them are the same as in C, others are especially added for GPU programming, these types are:

  • float - a 32-bit floating point number
  • half - a 16-bit floating point number
  • int - a 32-bit integer
  • fixed - a 12-bit 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, 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 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.

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, geometry, and pixel shaders, and they need supporting programs that handle the rest of the rendering process, Cg can be used with two 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.

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

Further reading

See also

External links