跳转到内容

Cg 编程/简介

来自维基教科书,开放的书籍,开放的世界

关于 Cg

[编辑 | 编辑源代码]

Nvidia 的编程语言 Cg (C for graphics) 是实时渲染中常用的几种着色语言之一(其他例子包括 Direct3D 的 HLSL 和 OpenGL 的 GLSL)。这些着色语言用于编程着色器(即或多或少的小程序),这些着色器在 GPU(图形处理单元)上执行,即计算机图形系统的处理器 - 与计算机的 CPU(中央处理单元)相对。

GPU 是大规模并行处理器,非常强大。当今大多数游戏和其他交互式图形应用程序中的实时图形都离不开 GPU。但是,要充分利用 GPU 的性能,有必要直接对它们进行编程。这意味着必须编写可以由 GPU 执行的小程序(即着色器)。编写这些着色器的编程语言是着色语言。Cg 就是其中之一。实际上,它是首批针对 GPU 的高级着色语言之一,已在多个 3D 图形 API(应用程序编程接口)中实现,最重要的是 OpenGL 和 Direct3D。如今,它受欢迎的主要原因是它与 HLSL 的相似性,HLSL 是 Microsoft 的 Direct3D 的着色语言。

关于学习 Cg

[编辑 | 编辑源代码]

学习 Cg 有很多好处

  • 它可以深入了解现代实时图形,即 GPU 的工作方式。大多数高性能实时图形应用程序(例如游戏)都以某种方式依赖于 GPU 上的计算,即着色器程序。
  • 它使你能够编写 Cg 和 HLSL 着色器(从而实现高效的图形应用程序)并理解其他着色语言(如 GLSL),因为它们的差异并不太大。
  • 它还能使你更好地理解和使用高级图形开发工具,因为它们通常也基于着色器。
  • 它可能会帮助你找到工作,因为着色器编程技能对于游戏程序员、图形开发人员、技术美术师等来说是一个优势。

Cg 不是一种特别复杂的编程语言,用 Cg 编写的典型程序(即着色器)相当小。然而,学习 Cg 由于以下几个原因可能具有挑战性

  • Cg 只是其他图形 API(例如 Nvidia 的 Cg Toolkit)的一部分;因此,Cg 通常与相当大的图形 API 一起学习,而图形 API 通常是为图形应用程序设置 Cg 代码和所需图形数据(例如网格和图像)所必需的。
  • Cg 编程需要一些关于 GPU 实现的可编程图形管道的知识。
  • 大多数 Cg 着色器需要矩阵和向量运算,这需要对向量和矩阵运算有一些了解。

因此,如果你喜欢图形,但讨厌编程和数学,那么 Cg 可能非常具有挑战性。

关于此维基教科书

[编辑 | 编辑源代码]

这本维基教科书的初衷是为了那些不喜欢编程或数学的学生。编写此书的基本动机是,学生在进行特定项目时,学习编程环境、编程语言和 API 的积极性要高得多。此类项目通常在特定平台上开发,因此本书的方法是在特定平台或框架中展示 Cg,例如游戏引擎 Unity、Nvidia 的 Cg Toolkit 等。(截至目前,只写了关于 Unity 中顶点着色器和片段着色器的一部分。)

这本维基教科书试图展示在特定平台上使用的 Cg 的特定版本。当然,这些 Cg 版本之间存在很大重叠,但差异往往很细微,可能会导致很多问题。实际上,要求学生弄清楚如何将 Cg 着色器的教科书示例调整到特定平台的要求,并不是一个好主意。相反,针对每个平台提供特定示例。

这本维基教科书中关于 Unity 中的 Cg、Unity 的表面着色器、Nvidia 的 Cg Toolkit 等部分是相互独立的。但是,有一定的进展

  • Unity 几乎不需要任何设置代码;导入网格和纹理通常只需拖放和一些鼠标点击。
  • Nvidia 的 Cg Toolkit 需要几个库、一个编译器和一个链接器。它还需要相当多的设置代码。

因此,即使你没有计划在 Unity 中使用 Cg,从 Unity 中开始编写 Cg 也是一个好主意,这样可以让你快速学习基础知识,而无需担心设置代码和导入网格和图像的烦人细节。

这本维基教科书的每个部分都组织成一系列教程,其中包含产生特定效果的有效示例。这些示例决定了 Cg 语法的哪些部分将被讨论。对 Cg 语法的全面描述在 Nvidia 的 Cg 语言规范 中提供。更易于理解的文档在 Nvidia 的 Cg 教程 中提供。

Cg 专为 GPU 图形管道而设计,如 OpenGL API 和 Direct3D API 中所实现的那样。以逐阶段的方式展示此图形管道非常诱人;但是,这种逐阶段的方法往往使得更难理解管道的所有部分如何以各种组合协同工作以产生特定效果。因此,对每个示例的讨论也决定了图形管道的哪些部分将被讨论。尽管如此,仍然存在与平台无关的部分,以概述图形管道、概述传统的矩阵变换、概述 Cg 特定的向量和矩阵运算、讨论如何将矩阵变换应用于点、向量和法线,以及其他一些一般性主题。

这本维基教科书不包含的内容

[编辑 | 编辑源代码]

显然,这本维基教科书不涉及 GLSL 或任何其他着色语言,只涉及 Cg 和 HLSL。(有关 GLSL 简介,请参阅维基教科书 GLSL 编程。)此外,这本维基教科书不涉及针对 GLSL 程序员的 Cg。它面向所有人(包括 GLSL 程序员)。此外,这本维基教科书不涉及编写高效的 Cg 着色器。它旨在使读者能够编写有效的着色器。优化会增加一层额外的任务(引入适当的近似值、选择适当的精度、决定是否使用查找表、通过巧妙的算术表达式避免分支等),这些都超出了 Cg 简介的范围。当然,现实情况是不同的;但是,你并不会通过参加一级方程式比赛来学习开车。

关于对本书的贡献

[编辑 | 编辑源代码]

当然欢迎所有人的贡献。在添加新的示例时,应确保没有侵犯版权,并且所有概念都已在示例本身或同一部分的先前示例中进行了解释。

除非另有说明,否则这本维基教科书中的所有示例源代码均归属公共领域。因此,你可以随意修改它并在你喜欢的任何许可下重新授权它。源代码应嵌入在 <syntaxhighlight lang="..."> ... </syntaxhighlight> 中,以便使用语法突出显示。

同一部分的其他维基页面应通过模板进行引用,例如 {{{{BOOKTEMPLATE}}/Unity SectionRef|X}},该模板应以维基页面的名称(例如 X)作为第一个参数。输出应类似于 “X”部分

在引用图形时,请尝试使用对任何图形放置都有效的引用(例如,“相应的图形”),或者使用模板为在线版本和印刷版生成不同的引用(例如,{{Hide in print|左侧的}图形{{Only in print|下方}})。忽略 PDF 版本的问题,因为在线版本是迄今为止最重要的版本,并且许多读者对书籍版本抱有很高的期望。

为了便于编辑图表,鼓励使用表格。例如,使用以下内容

{|cellpadding="5px" cellspacing="0" style="text-align:center; vertical-align:center;"
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''first stage or input data'''
|style="width:1%; font-size:200%;" |←
|style="width:69%; background:#e0e0d0;"|additional input (optional, 1st style)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left;"|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''second stage or processed data'''
|style="width:1%;font-size:200%;" |←
|style="width:69%; text-align:left;"|additional input (optional, 2nd style)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left; "|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''third stage or processed data'''
|style="width:1%;font-size:200%;" |
|style="width:69%; text-align:left;"|description of stage or data (optional)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left; "|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''fourth stage or processed data'''
|style="width:1%;font-size:200%; " |→
|style="width:69%; background:#e0e0d0; "|additional output (optional, 1st style)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left; "|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''final stage or output data'''
|style="width:1%; font-size:200%;" |→
|style="width:69%; text-align:left; "|additional output (optional, 2nd style)
|}

得到以下内容

第一阶段或输入数据 附加输入(可选,第一种风格)
通信数据或操作
第二阶段或处理后的数据 附加输入(可选,第二种风格)
通信数据或操作
第三阶段或处理后的数据 阶段或数据的描述(可选)
通信数据或操作
第四阶段或处理后的数据 附加输出(可选,第一种风格)
通信数据或操作
最终阶段或输出数据 附加输出(可选,第二种风格)

< Cg 编程

除非另有说明,否则本页面上的所有示例源代码均归属公共领域。
华夏公益教科书