Cg (short for C for Graphics) and
High-Level Shader Language (HLSL) are two names given to a high-level
shading language
A shading language is a graphics programming language adapted to programming shader effects (characterizing surfaces, volumes, and objects). Such language forms usually consist of special data types, like "vector", "matrix", "color" and " normal". ...
developed by
Nvidia
Nvidia CorporationOfficially written as NVIDIA and stylized in its logo as VIDIA with the lowercase "n" the same height as the uppercase "VIDIA"; formerly stylized as VIDIA with a large italicized lowercase "n" on products from the mid 1990s to ...
and
Microsoft
Microsoft Corporation is an American multinational corporation, multinational technology company, technology corporation producing Software, computer software, consumer electronics, personal computers, and related services headquartered at th ...
for
programming shader
In computer graphics, a shader is a computer program that calculates the appropriate levels of light, darkness, and color during the rendering of a 3D scene - a process known as '' shading''. Shaders have evolved to perform a variety of spec ...
s. Cg/HLSL is based on the
C programming language
''The C Programming Language'' (sometimes termed ''K&R'', after its authors' initials) is a computer programming book written by Brian Kernighan and Dennis Ritchie, the latter of whom originally designed and implemented the language, as well as ...
and although they share the same core syntax, some features of C were modified and new data types were added to make Cg/HLSL more suitable for programming
graphics processing unit
A graphics processing unit (GPU) is a specialized electronic circuit designed to manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mo ...
s.
Two main branches of the Cg/HLSL language exist: the Nvidia Cg compiler (cgc) which outputs
DirectX
Microsoft DirectX is a collection of application programming interfaces (APIs) for handling tasks related to multimedia, especially game programming and video, on Microsoft platforms. Originally, the names of these APIs all began with "Direc ...
or
OpenGL
OpenGL (Open Graphics Library) is a cross-language, cross-platform application programming interface (API) for rendering 2D and 3D vector graphics. The API is typically used to interact with a graphics processing unit (GPU), to achieve ha ...
and the Microsoft HLSL which outputs DirectX shaders in bytecode format. Nvidia's cgc was
deprecated
In several fields, especially computing, deprecation is the discouragement of use of some terminology, feature, design, or practice, typically because it has been superseded or is no longer considered efficient or safe, without completely removing ...
in 2012, with no additional development or support available.
HLSL shaders can enable many
special effects
Special effects (often abbreviated as SFX, F/X or simply FX) are illusions or visual tricks used in the theatre, film, television, video game, amusement park and simulator industries to simulate the imagined events in a story or virtual w ...
in both 2D and 3D
computer graphics
Computer graphics deals with generating images with the aid of computers. Today, computer graphics is a core technology in digital photography, film, video games, cell phone and computer displays, and many specialized applications. A great deal ...
. The Cg/HLSL language originally only included support for
vertex shader
In computer graphics, a shader is a computer program that calculates the appropriate levels of light, darkness, and color during the rendering of a 3D scene - a process known as ''shading''. Shaders have evolved to perform a variety of speci ...
s and
pixel shader
In computer graphics, a shader is a computer program that calculates the appropriate levels of light, darkness, and color during the rendering of a 3D scene - a process known as ''shading''. Shaders have evolved to perform a variety of speci ...
s, but other types of shaders were introduced gradually as well:
* DirectX 10 (Shader Model 4) and Cg 2.0 introduced
geometry shader
In computer graphics, a shader is a computer program that calculates the appropriate levels of light, darkness, and color during the rendering of a 3D scene - a process known as ''shading''. Shaders have evolved to perform a variety of spec ...
s.
* DirectX 11 (Shader Model 5) introduced
compute shaders (
GPGPU
General-purpose computing on graphics processing units (GPGPU, or less often GPGP) is the use of a graphics processing unit (GPU), which typically handles computation only for computer graphics, to perform computation in applications traditiona ...
) and
tessellation shaders (hull and domain). The latter is present in Cg 3.1.
* DirectX 12 (Shader Model 6.3) introduced
ray tracing shaders (ray generation, intersection, bit /closest hit / miss).
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
Float may refer to:
Arts and entertainment Music Albums
* ''Float'' (Aesop Rock album), 2000
* ''Float'' (Flogging Molly album), 2008
* ''Float'' (Styles P album), 2013
Songs
* "Float" (Tim and the Glory Boys song), 2022
* "Float", by Bush ...
- a 32bit floating point number
*
half
One half ( : halves) is the irreducible fraction resulting from dividing one by two or the fraction resulting from dividing any number by its double. Multiplication by one half is equivalent to division by two, or "halving"; conversely, d ...
- 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 type
In computer science, array is a data type that represents a collection of ''elements'' ( values or variables), each selected by one or more indices (identifying keys) that can be computed at run time during program execution. Such a collection ...
s, 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 operator
In logic, a logical connective (also called a logical operator, sentential connective, or sentential operator) is a logical constant. They can be used to connect logical formulas. For instance in the syntax of propositional logic, the binary ...
s.
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.
Semantics
Preprocessor
Cg implements many
C preprocessor
The C preprocessor is the macro preprocessor for the C, Objective-C and C++ computer programming languages. The preprocessor provides the ability for the inclusion of header files, macro expansions, conditional compilation, and line contro ...
directives and its macro expansion system. It implements .
[ Mark J. Kilgard]
''Cg in Two Pages''
2003.
HLSL features
* Namespace
* Annotation
Environment
Compilation targets
Cg programs are built for different ''shader profiles'' that stand for GPUs with different 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.
[
As the number of profile and shader types cropped up, Microsoft has switched to use the term "Shader Model" to group a set of profiles found in a generation of GPUs. Cg supports some of the newer profiles up to Shader Model 5.0 as well as translation to glsl or hlsl.][
*PS 1.0 — Unreleased ]3dfx
3dfx Interactive was an American technology company headquartered in San Jose, California, founded in 1994, that specialized in the manufacturing of 3D graphics processing units, and later, video cards. It was a pioneer in the field from the ...
Rampage, DirectX 8.
*PS 1.1 — GeForce 3
The GeForce 3 series (NV20) is the third generation of Nvidia's GeForce graphics processing units (GPUs). Introduced in February 2001, it advanced the GeForce architecture by adding programmable pixel and vertex shaders, multisample anti-alia ...
, DirectX 8.
*PS 1.2 — 3Dlabs
3Dlabs was a fabless semiconductor company. It was founded in 1994 with headquarters in San Jose, California. It originally developed the GLINT and PERMEDIA high-end graphics chip technology, that was used on many of the world's leading computer ...
Wildcat VP, DirectX 8.0a.
*PS 1.3 — GeForce 4 Ti, DirectX 8.0a.
*PS 1.4 — Radeon 8500-9250, Matrox Parhelia
Matrox Parhelia-512 is a graphics processing unit (GPU) with full support for DirectX 8.1 and incorporating several DirectX 9.0 features. Released in 2002, it was best known for its ability to drive three monitors ("Surround Gaming") and its ''Co ...
, DirectX 8.1.
*Shader Model 2.0 — Radeon 9500-9800/X300-X600, DirectX 9.
*Shader Model 2.0a — GeForce FX/PCX-optimized model, DirectX 9.0a.
*Shader Model 2.0b — Radeon X700-X850 shader model, DirectX 9.0b.
*Shader Model 3.0 — Radeon X1000
The R520 (codenamed Fudo) is a graphics processing unit (GPU) developed by ATI Technologies and produced by TSMC. It was the first GPU produced using a 90 nm photolithography process.
The R520 is the foundation for a line of DirectX 9.0c ...
and GeForce 6, DirectX 9.0c.
*Shader Model 4.0 — Radeon HD 2000 and GeForce 8, DirectX 10.
*Shader Model 4.1 — Radeon HD 3000
The graphics processing unit (GPU) codenamed the Radeon R600 is the foundation of the Radeon HD 2000/3000 series and the FireGL 2007 series video cards developed by ATI Technologies.
Architecture
This article is about all products under the br ...
and GeForce 200
The GeForce 200 series is a series of Tesla-based GeForce graphics processing units developed by Nvidia.
Architecture
The GeForce 200 Series introduced Nvidia's second generation of Tesla (microarchitecture), Nvidia's unified shader architec ...
, DirectX 10.1.
*Shader Model 5.0 — Radeon HD 5000
The Evergreen series is a family of GPUs developed by Advanced Micro Devices for its Radeon line under the ATI brand name. It was employed in Radeon HD 5000 graphics card series and competed directly with Nvidia's GeForce 400 Series.
Release
T ...
and GeForce 400, DirectX 11.
*Shader Model 5.1 — GCN 1+, Fermi+, DirectX 12 (11_0+) with WDDM 2.0.
*Shader Model 6.0 — GCN 1+, Kepler+, DirectX 12 (11_0+) with WDDM 2.1.
*Shader Model 6.1 — GCN 1+, Kepler+, DirectX 12 (11_0+) with WDDM 2.3.
*Shader Model 6.2 — GCN 1+, Kepler+, DirectX 12 (11_0+) with WDDM 2.4.
*Shader Model 6.3 — GCN 1+, Kepler+, DirectX 12 (11_0+) with WDDM 2.5.
*Shader Model 6.4 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11_0+) with WDDM 2.6.
*Shader Model 6.5 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11_0+) with WDDM 2.7.
"32 + 64" for ''Executed Instructions'' means "32 texture instructions and 64 arithmetic instructions."
The standard library
As in C, Cg/HLSL 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
Texture mapping is a method for mapping a texture on a computer-generated graphic. Texture here can be high frequency detail, surface texture, or color.
History
The original technique was pioneered by Edwin Catmull in 1974.
Texture mappi ...
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
OpenGL (Open Graphics Library) is a cross-language, cross-platform application programming interface (API) for rendering 2D and 3D vector graphics. The API is typically used to interact with a graphics processing unit (GPU), to achieve ha ...
or DirectX
Microsoft DirectX is a collection of application programming interfaces (APIs) for handling tasks related to multimedia, especially game programming and video, on Microsoft platforms. Originally, the names of these APIs all began with "Direc ...
. 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.'
Compilers and dialects
The Cg dialect has only ever had one compiler, in the form of Nvidia's Cg toolkit.
Microsoft has released two compilers for HLSL. The original compiler was the closed-source FXC (Effect Compiler), supported until 2015. It was deprecated in favor of the open-source LLVM
LLVM is a set of compiler and toolchain technologies that can be used to develop a front end for any programming language and a back end for any instruction set architecture. LLVM is designed around a language-independent intermediate repre ...
-based DXC (DirectXShaderCompiler) with support for newer HLSL features. Both compilers generate bytecode: while the older FXC used DXBC, DXC now uses DXIL. DXC can also emit SPIR-V bytecode.
The Khronos Group
The Khronos Group, Inc. is an open, non-profit, member-driven consortium of 170 organizations developing, publishing and maintaining royalty-free interoperability standards for 3D graphics, virtual reality, augmented reality, parallel computat ...
has also written a LLVM-based HLSL compiler, in the form of a frontend for ''glslang'', their GLSL-to-SPIR_V compiler. Support for SPIR-V means that the shaders can be cross-platform, no longer limiting them to a DirectX stack. This task was previously performed by source-level converters like HLSL2GLSL
HLSL2GLSL is a command line tool and a library that translates shaders written in High Level Shader Language (HLSL) for Direct3D 9 into the OpenGL Shading Language (GLSL).
HLSL2GLSL was originally released by ATI Technologies under a BSD License ...
, but the resulting code is often bloated.
Derived languages
The PlayStation Shading Language
is a video gaming brand that consists of five home video game consoles, two handhelds, a media center, and a smartphone, as well as an online service and multiple magazines. The brand is produced by Sony Interactive Entertainment, a di ...
is based on Cg/HLSL.
The ReshadeFX shading language is also based on Cg/HLSL. Shaders written in ReshadeFX are compiled to OpenGL, DX, or Vulkan and injected into games to act as post-processing filters.
Applications and games that use Cg or HLSL
* '' 3DVIA Virtools''
* Adobe Photoshop
Adobe Photoshop is a raster graphics editor developed and published by Adobe Inc. for Windows and macOS. It was originally created in 1988 by Thomas and John Knoll. Since then, the software has become the industry standard not only in ras ...
* Maya
Maya may refer to:
Civilizations
* Maya peoples, of southern Mexico and northern Central America
** Maya civilization, the historical civilization of the Maya peoples
** Maya language, the languages of the Maya peoples
* Maya (Ethiopia), a popu ...
* ''Battlefield 2
''Battlefield 2'' is a first-person shooter video game, developed by DICE and published by Electronic Arts for Microsoft Windows in June 2005 as the third game in the ''Battlefield'' franchise.
Players fight in a modern battlefield, using mode ...
''
* ''Cafu Engine
The Cafu Engine is a game engine developed by Carsten Fuchs. It is portable across platforms and runs on Windows and Linux, with plans to be adapted to OS X. The engine's source code is freely available under the MIT Licence.
Features
In gener ...
''
* ''Crystal Space
Crystal Space is a framework for developing 3D computer graphics, 3D software, applications written in C++ by Jorrit Tyberghein and others. The first public release was on August 26, 1997. It is typically used as a game engine but the framework i ...
''
* '' Dolphinity Racer''
* ''Earth's Special Forces
This is a list of GoldSrc mods ( modifications) for the video game ''Half-Life''.
The list is divided into two categories: clientside and serverside mods. These terms do not necessarily indicate whether each mod can be run on multiplayer serve ...
'' - A Half-Life Mod
* '' Enemy Territory: Quake Wars''
* ''Doom 3 BFG Edition
''Doom 3: BFG Edition'' is a remastered version of ''Doom 3'', released worldwide in October 2012 for Microsoft Windows, PlayStation 3, and Xbox 360. The '' BFG Edition'' features enhanced graphics, better audio (with more horror effects), a che ...
''
* ''EON Professional™/Ultra™'' of EON Reality
* '' eyeon Fusion''
* ''Far Cry
''Far Cry'' is an anthology franchise of first-person shooter games, all of which have been published by Ubisoft. The first game, '' Far Cry'', was developed by Crytek to premiere their CryEngine software, and released in March 2004. Subseq ...
''
* '' Garshasp: The Monster Slayer''
* ''GLScene
GLScene is a free OpenGL-based library for Delphi, C++ and Free Pascal. It provides visual components and objects allowing description and rendering of 3D scenes.
Development of the original library was started in 1999 by Mike Lischke and at ...
''
* '' Gun Metal''
* '' Hitman: Blood Money''
* '' Irrlicht Engine''
* ''League of Legends
''League of Legends'' (''LoL''), commonly referred to as ''League'', is a 2009 multiplayer online battle arena video game developed and published by Riot Games. Inspired by ''Defense of the Ancients'', a custom map for ''Warcraft III'', Ri ...
''
* '' Lightfeather 3D Engine''
* LightWave 11.6
* '' muvee Reveal''
* ''OGRE
An ogre ( feminine: ogress) is a legendary monster depicted as a large, hideous, man-like being that eats ordinary human beings, especially infants and children. Ogres frequently feature in mythology, folklore, and fiction throughout the wor ...
''
* '' OpenEmu''
* ''Panda3D
Panda3D is a game engine that includes graphics, audio, I/O, collision detection, and other abilities relevant to the creation of 3D games. Panda3D is free, open-source software under the revised BSD license.
Panda3D's intended game-development ...
''
* PCSX2
PCSX2 is a free and open-source PlayStation 2 emulator for Windows, Linux, and macOS that supports a wide range of PlayStation 2 video games with a high level of compatibility and functionality. Although PCSX2 can closely mirror the original ga ...
* PlayStation 3
The PlayStation 3 (PS3) is a home video game console developed by Sony Interactive Entertainment, Sony Computer Entertainment. The successor to the PlayStation 2, it is part of the PlayStation brand of consoles. It was first released on Novemb ...
* '' RetroArch''
* ''R.U.S.E.
''R.U.S.E.'' is a real-time strategy video game developed by Eugen Systems and published by Ubisoft which was released for Microsoft Windows, PlayStation 3, and Xbox 360, in September 2010. The game was subsequently released for macOS throu ...
''
* '' Snes9x''
* ''Unity game engine
Unity is a cross-platform game engine developed by Unity Technologies, first announced and released in June 2005 at Apple Worldwide Developers Conference as a Mac OS X game engine. The engine has since been gradually extended to support a va ...
''
* ''Unreal Engine
Unreal Engine (UE) is a 3D computer graphics game engine developed by Epic Games, first showcased in the 1998 first-person shooter game '' Unreal''. Initially developed for PC first-person shooters, it has since been used in a variety of genr ...
''
See also
* Computer programming
Computer programming is the process of performing a particular computation (or more generally, accomplishing a specific computing result), usually by designing and building an executable computer program. Programming involves tasks such as anal ...
* Computer graphics
Computer graphics deals with generating images with the aid of computers. Today, computer graphics is a core technology in digital photography, film, video games, cell phone and computer displays, and many specialized applications. A great deal ...
* Vertex and pixel shaders
In computer graphics, a shader is a computer program that calculates the appropriate levels of light, darkness, and color during the rendering of a 3D scene - a process known as ''shading''. Shaders have evolved to perform a variety of speci ...
* High level shader language
* OpenGL shading language
OpenGL Shading Language (GLSL) is a high-level shading language with a syntax based on the C programming language. It was created by the OpenGL ARB (OpenGL Architecture Review Board) to give developers more direct control of the graphics pipe ...
* Shader Model
The High-Level Shader Language or High-Level Shading Language (HLSL) is a proprietary shading language developed by Microsoft for the Direct3D 9 API to augment the shader assembly language, and went on to become the required shading language ...
* OpenGL
OpenGL (Open Graphics Library) is a cross-language, cross-platform application programming interface (API) for rendering 2D and 3D vector graphics. The API is typically used to interact with a graphics processing unit (GPU), to achieve ha ...
* DirectX
Microsoft DirectX is a collection of application programming interfaces (APIs) for handling tasks related to multimedia, especially game programming and video, on Microsoft platforms. Originally, the names of these APIs all began with "Direc ...
References
Further reading
Randima Fernando
Mark J. Kilgard,
The Cg Tutorial
The Definitive Guide to Programmable Real-Time Graphics'', Addison-Wesley Professional,
Randima Fernando
''GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics'', Addison-Wesley Professional,
* 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
SIGGRAPH (Special Interest Group on Computer Graphics and Interactive Techniques) is an annual conference on computer graphics (CG) organized by the ACM SIGGRAPH, starting in 1974. The main conference is held in North America; SIGGRAPH Asia ...
2003,
External links
cgc-opensrc
- Mirror for nvidia's open source compiler, 2002
* Some essential materials (e.g. the design paper) are gathered i
these course notes from Siggraph 2005
* Nvidia-hosted materials:
*
Cg FAQ
*
Cg Toolkit
** C
Language Reference and Documentation
NeHe Cg vertex shader tutorial
Documentation for the Cg Shader standard used by emulators
* Aras Pranckevičius,