Cg (programming language)

Last updated
Cg/HLSL
HLSL-Examples-1.PNG
A scene containing several different 2D HLSL shaders. Distortion of the statue is achieved purely physically, while the texture of the rectangular frame beside it is based on color intensity. The square in the background has been transformed and rotated. The partial transparency and reflection of the water in the foreground are added by a shader applied finally to the entire scene.
Family shading language
Developer nVIDIA, Microsoft
Website developer.nvidia.com/cg-toolkit
Dialects
Cg, HLSL, Playstation Shading Language
Influenced by
C, RenderMan Shading Language
Influenced
GLSL

Cg (short for C for Graphics) and High-Level Shader Language (HLSL) are two names given to a high-level shading language developed by Nvidia and Microsoft for programming shaders. Cg/HLSL is based on the C programming language 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 units. [1] [2]

Contents

Two main branches of the Cg/HLSL language exist: the Nvidia Cg compiler (cgc) which outputs DirectX or OpenGL and the Microsoft HLSL which outputs DirectX shaders in bytecode format. [3] [4] Nvidia's cgc was deprecated in 2012, with no additional development or support available. [5]

HLSL shaders can enable many special effects in both 2D and 3D computer graphics. The Cg/HLSL language originally only included support for vertex shaders and pixel shaders, but other types of shaders were introduced gradually as well:

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:

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:

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.

Semantics

Preprocessor

Cg implements many C preprocessor directives and its macro expansion system. It implements #include. [7]

HLSL features

Environment

Compilation targets

Cg programs are built for different shader profiles that stand for GPUs with different capabilities. [8] 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. [7]

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. [9] Cg supports some of the newer profiles up to Shader Model 5.0 as well as translation to glsl or hlsl. [8]

Comparison of HLSL pixel shaders
Pixel shader version1.0 to 1.3 [10] 1.4 [10] 2.0 [10] [11] 2.0a [10] [11] [12] 2.0b [10] [11] [13] 3.0 [10] [14] 4.0 [15]
4.1 [16]
5.0 [17]
Dependent texture limit468Unlimited8UnlimitedUnlimited
Texture instruction limit46*232UnlimitedUnlimitedUnlimitedUnlimited
Position registerNoNoNoNoNoYesYes
Instruction slots8+48+432 + 64512512≥ 512≥ 65536
Executed instructions8+46*2+8*232 + 6451251265536Unlimited
Texture indirections444Unlimited4UnlimitedUnlimited
Interpolated registers2 + 42 + 62 + 82 + 82 + 81032
Instruction predicationNoNoNoYesNoYesNo
Index input registersNoNoNoNoNoYesYes
Temp registers2612 to 322232324096
Constant registers8832323222416×4096
Arbitrary swizzling NoNoNoYesNoYesYes
Gradient instructionsNoNoNoYesNoYesYes
Loop count registerNoNoNoNoNoYesYes
Face register (2-sided lighting)NoNoNoNoYesYesYes
Dynamic flow controlNoNoNoNoNoYes (24)Yes (64)
Bitwise OperatorsNoNoNoNoNoNoYes
Native IntegersNoNoNoNoNoNoYes

"32 + 64" for Executed Instructions means "32 texture instructions and 64 arithmetic instructions."

Comparison of HLSL Vertex shaders
Vertex shader versionVS 1.1 [18] VS 2.0 [11] [18] [19] VS 2.0a [11] [18] [19] VS 3.0 [14] [18] VS 4.0 [15]
VS 4.1 [20]
VS 5.0 [17]
# of instruction slots128256256≥ 512≥ 65536
Max # of instructions executed12810246553665536Unlimited
Instruction predication NoNoYesYesYes
Temp registers121216324096
# constant registers≥ 96≥ 256256≥ 25616×4096
Static flow controlNoYesYesYesYes
Dynamic flow controlNoNoYesYesYes
Dynamic flow control depth242464
Vertex texture fetchNoNoNoYesYes
# of texture samplers4128
Geometry instancing supportNoNoNoYesYes
Bitwise operatorsNoNoNoNoYes
Native integersNoNoNoNoYes

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 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.'

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-based DXC (DirectXShaderCompiler) with support for newer HLSL features. [21] Both compilers generate bytecode: while the older FXC used DXBC, DXC now uses DXIL. DXC can also emit SPIR-V bytecode. [22]

The Khronos Group 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. [23] This task was previously performed by source-level converters like HLSL2GLSL, but the resulting code is often bloated. [24]

Derived languages

The PlayStation Shading Language is based on Cg/HLSL. [25]

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. [26]

Applications and games that use Cg or HLSL

See also

Related Research Articles

<span class="mw-page-title-main">DirectX</span> Collection of multimedia related APIs on Microsoft platforms

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 "Direct", such as Direct3D, DirectDraw, DirectMusic, DirectPlay, DirectSound, and so forth. The name DirectX was coined as a shorthand term for all of these APIs and soon became the name of the collection. When Microsoft later set out to develop a gaming console, the X was used as the basis of the name Xbox to indicate that the console was based on DirectX technology. The X initial has been carried forward in the naming of APIs designed for the Xbox such as XInput and the Cross-platform Audio Creation Tool (XACT), while the DirectX pattern has been continued for Windows APIs such as Direct2D and DirectWrite.

Direct3D is a graphics application programming interface (API) for Microsoft Windows. Part of DirectX, Direct3D is used to render three-dimensional graphics in applications where performance is important, such as games. Direct3D uses hardware acceleration if it is available on the graphics card, allowing for hardware acceleration of the entire 3D rendering pipeline or even only partial acceleration. Direct3D exposes the advanced graphics capabilities of 3D graphics hardware, including Z-buffering, W-buffering, stencil buffering, spatial anti-aliasing, alpha blending, color blending, mipmapping, texture blending, clipping, culling, atmospheric effects, perspective-correct texture mapping, programmable HLSL shaders and effects. Integration with other DirectX technologies enables Direct3D to deliver such features as video mapping, hardware 3D rendering in 2D overlay planes, and even sprites, providing the use of 2D and 3D graphics in interactive media ties.

<span class="mw-page-title-main">High-Level Shader Language</span> Shading language

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 for the unified shader model of Direct3D 10 and higher.

<span class="mw-page-title-main">Graphics processing unit</span> Specialized electronic circuit; graphics accelerator

A graphics processing unit (GPU) is a specialized electronic circuit initially designed to accelerate computer graphics and image processing. After their initial design, GPUs were found to be useful for non-graphic calculations involving embarrassingly parallel problems due to their parallel structure. Other non-graphical uses include the training of neural networks and cryptocurrency mining.

<span class="mw-page-title-main">GeForce 3 series</span> Series of GPUs by Nvidia

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-aliasing and improved the overall efficiency of the rendering process.

<span class="mw-page-title-main">Shader</span> Type of program in a graphical processing unit (GPU)

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 specialized functions in computer graphics special effects and video post-processing, as well as general-purpose computing on graphics processing units.

A shading language is a graphics programming language adapted to programming shader effects. Shading languages usually consist of special data types like "vector", "matrix", "color" and "normal".

<span class="mw-page-title-main">Radeon R200 series</span> Series of video cards

The R200 is the second generation of GPUs used in Radeon graphics cards and developed by ATI Technologies. This GPU features 3D acceleration based upon Microsoft Direct3D 8.1 and OpenGL 1.3, a major improvement in features and performance compared to the preceding Radeon R100 design. The GPU also includes 2D GUI acceleration, video acceleration, and multiple display outputs. "R200" refers to the development codename of the initially released GPU of the generation. It is the basis for a variety of other succeeding products.

The Intel Graphics Media Accelerator (GMA) is a series of integrated graphics processors introduced in 2004 by Intel, replacing the earlier Intel Extreme Graphics series and being succeeded by the Intel HD and Iris Graphics series.

The R520 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.

<span class="mw-page-title-main">Radeon R100 series</span> Series of video cards

The Radeon R100 is the first generation of Radeon graphics chips from ATI Technologies. The line features 3D acceleration based upon Direct3D 7.0 and OpenGL 1.3, and all but the entry-level versions offloading host geometry calculations to a hardware transform and lighting (T&L) engine, a major improvement in features and performance compared to the preceding Rage design. The processors also include 2D GUI acceleration, video acceleration, and multiple display outputs. "R100" refers to the development codename of the initially released GPU of the generation. It is the basis for a variety of other succeeding products.

Windows Display Driver Model (WDDM) is the graphic driver architecture for video card drivers running Microsoft Windows versions beginning with Windows Vista.

Transform, clipping, and lighting is a term used in computer graphics.

<span class="mw-page-title-main">Unified shader model</span> GPU whose shading hardware has equal capabilities for all stages of rendering

In the field of 3D computer graphics, the unified shader model refers to a form of shader hardware in a graphical processing unit (GPU) where all of the shader stages in the rendering pipeline have the same capabilities. They can all read textures and buffers, and they use instruction sets that are almost identical.

ARB assembly language is a low-level shading language, which can be characterized as an assembly language. It was created by the OpenGL Architecture Review Board (ARB) to standardize GPU instructions controlling the hardware graphics pipeline.

Direct2D is a 2D vector graphics application programming interface (API) designed by Microsoft and implemented in Windows 10, Windows 8, Windows 7 and Windows Server 2008 R2, and also Windows Vista and Windows Server 2008.

<span class="mw-page-title-main">Radeon 9000 series</span> Series of video cards

The R300 GPU, introduced in August 2002 and developed by ATI Technologies, is its third generation of GPU used in Radeon graphics cards. This GPU features 3D acceleration based upon Direct3D 9.0 and OpenGL 2.0, a major improvement in features and performance compared to the preceding R200 design. R300 was the first fully Direct3D 9-capable consumer graphics chip. The processors also include 2D GUI acceleration, video acceleration, and multiple display outputs.

Stage3D is an Adobe Flash Player API for rendering interactive 3D graphics with GPU-acceleration, within Flash games and applications. Flash Player or AIR applications written in ActionScript 3 may use Stage3D to render 3D graphics, and such applications run natively on Windows, Mac OS X, Linux, Apple iOS and Google Android. Stage3D is similar in purpose and design to WebGL.

Vulkan is a low-level low-overhead, cross-platform API and open standard for 3D graphics and computing. It was intended to address the shortcomings of OpenGL, and allow developers more control over the GPU. It is designed to support a wide variety of GPUs, CPUs and operating systems, it is also designed to work with modern multi-core CPUs.

Feature levels in Direct3D define strict sets of features required by certain versions of the Direct3D API and runtime, as well as additional optional feature levels available within the same API version.

References

  1. "Fusion Industries :: Cg and HLSL FAQ ::". 24 August 2012. Archived from the original on 24 August 2012.
  2. "The Cg Tutorial - Chapter 1. Introduction". developer.download.nvidia.cn.
  3. "Writing HLSL Shaders in Direct3D 9 (Windows)". msdn.microsoft.com. 24 May 2021.
  4. "Cg FAQ". NVIDIA DesignWorks. 8 March 2011. Retrieved 25 May 2017.
  5. "Cg Toolkit | NVIDIA Developer". 8 March 2011.
  6. https://developer.download.nvidia.com/cg/Cg_2.0/2.0.0012/Cg-2.0_Jan2008_ReleaseNotes.pdf [ bare URL PDF ]
  7. 1 2 Mark J. Kilgard, Cg in Two Pages, 2003.
  8. 1 2 "Cg Profile Documentation". Nvidia developer.
  9. "Shader Models vs Shader Profiles - Win32 apps". docs.microsoft.com. 30 June 2021.
  10. 1 2 3 4 5 6 "Pixel Shader Differences". msdn.microsoft.com. 2011-02-08.
  11. 1 2 3 4 5 Peeper, Craig (2004-03-15). "Microsoft DirectX High Level Shader Language (HLSL)" (PPT). microsoft.com. pp. 5–8, 24–25.
  12. Shimpi, Anand Lal. "NVIDIA Introduces GeForce FX (NV30)".
  13. Wilson, Derek. "ATI Radeon X800 Pro and XT Platinum Edition: R420 Arrives".
  14. 1 2 Shader Model 3.0, Ashu Rege, NVIDIA Developer Technology Group, 2004.
  15. 1 2 The Direct3D 10 System, David Blythe, Microsoft Corporation, 2006.
  16. "Registers - ps_4_1 (Windows)". msdn.microsoft.com. 23 August 2019.
  17. 1 2 "Registers - ps_5_0 (Windows)". msdn.microsoft.com. 23 August 2019.
  18. 1 2 3 4 "Vertex Shader Differences". msdn.microsoft.com. 2011-02-08.
  19. 1 2 Shimpi, Anand Lal. "NVIDIA Introduces GeForce FX (NV30)".
  20. "Registers - vs_4_1 (Windows)". msdn.microsoft.com. 23 August 2019.
  21. "Porting from FXC to DXC". GitHub.
  22. "microsoft/DirectXShaderCompiler: This repo hosts the source for the DirectX Shader Compiler which is based on LLVM/Clang". Microsoft. 21 October 2020.
  23. "glslang: Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator". The Khronos Group. 21 October 2020.
  24. Matt Turner. Video on YouTube.
  25. Stenson, Richard; Ho, Chris. "PlayStation Shading Language for PS4". GDC Europe 2013.
  26. "ReShade FX shading language". GitHub. 15 February 2022.
  27. "Maya Cg Plug-in | NVIDIA".
  28. "LightWave - 11.6 Features Overview".
  29. "Unity - Manual: Writing Shaders".

Further reading