跳转至内容

Cg 编程/Unity

来自 Wikibooks,开放世界中的开放书籍

在游戏引擎 Unity 中进行 Cg 编程比为 OpenGL 或 Direct3D 应用程序进行 Cg 编程要容易得多。网格和图像(即纹理)的导入由图形用户界面支持;可以自动计算 mipmap 和法线贴图;大多数常见的顶点属性和统一变量都是预定义的;OpenGL 和 Direct3D 状态可以通过非常简单的命令来设置;等等。

准备工作

[编辑 | 编辑源代码]

可以在 Unity 的下载页面 下载适用于 Windows 和 MacOS 的 Unity 免费版本。所有包含的教程都适用于免费版本。需要注意几点

  • 首先,这部分内容介绍了 Unity 标准 3D 内置管线中的顶点和片段着色器。这种着色器编程特别灵活,允许您编写非常高效的着色器,这在渲染性能有限的情况下(例如,在移动设备上)通常很重要。它对于图像特效和了解 GPU 的总体工作原理也非常有用。如果需要考虑 Unity 的标准光照,则顶点和片段着色器的编程用处不大。(在这种情况下,在 Unity 中首选使用表面着色器和着色器图。)
  • 其次,这部分内容假设读者对 Unity 有一定的了解。如果不是这样,读者应该查阅 Unity 手册的前几节内容(Unity 基础资源工作流程主要窗口)。
  • 第三,Unity 不区分 Cg(Nvidia 的着色语言)和 DirectX 9 样式的 HLSL(Direct3D 9 中的着色语言),因为这两种语言非常相似;因此,这些教程中的大多数也适用于 DirectX 9 样式的 HLSL。
  • 此外,Cg 由 Nvidia 的 Cg 教程Nvidia 的 Cg 语言规范 进行记录。但是,这些描述缺少 Unity 特定的细节。另一方面,Unity 的着色器文档 侧重于 Unity 的 ShaderLab 语法,并假设读者熟悉 Cg。因此,在没有 Cg 先验知识的情况下学习 Unity 中的 Cg 编程可能相当困难。本维基教科书试图通过提供 Unity 中 Cg 编程的入门教程来弥合这一差距,而无需 Cg 的先验知识。

请注意,教程假设您按照此处显示的顺序阅读它们,即每个教程都假设您熟悉前面教程中介绍的概念和技术。如果您是 Cg 或 Unity 的新手,您至少应该通读“基础”部分中的教程。(现在您已经得到警告了!)

透明表面

[编辑 | 编辑源代码]

基础光照

[编辑 | 编辑源代码]

基础纹理

[编辑 | 编辑源代码]

3D 纹理

[编辑 | 编辑源代码]

环境映射

[编辑 | 编辑源代码]

光照的变体

[编辑 | 编辑源代码]

非标准顶点变换

[编辑 | 编辑源代码]

图像特效和计算着色器

[编辑 | 编辑源代码]
  • 贝塞尔曲线(关于二次贝塞尔曲线和样条曲线)
  • 埃尔米特曲线(关于三次埃尔米特曲线和样条曲线)
  • 旋转(关于欧拉角和四元数)
  • 虚拟现实投影(关于离轴透视投影)
  • 镜子(关于使用渲染纹理渲染平面镜)
  • 传送门(关于使用模板缓冲区渲染到另一个场景的传送门或魔法镜头)

缺失教程

[编辑 | 编辑源代码]

Unity 的基本功能

[编辑 | 编辑源代码]
  • 光照贴图
  • 粒子
  • 光晕
  • 球谐光照
  • 使用 ReadPixels 生成立方体纹理
  • Unity 图形管线

优化着色器

[编辑 | 编辑源代码]
  • 每顶点计算与每片段计算
  • 混合和丢弃(以及 Alpha 测试)
  • 变量精度
  • 纹理采样
  • 其他建议

其他主题

[编辑 | 编辑源代码]
  • [stub:] 水反射和折射(关于水)
  • 阴影贴图
  • Z 优先级
  • 色键
  • 发光线条
  • 球体环境光遮蔽(来自天空光的球体软阴影)
  • 水波(过程法线贴图)
  • 曲面镜(光线追踪反射)
  • 无模板缓冲区的阴影体积
  • 动画精灵
  • 过程纹理(噪声)
  • 闪光效果

< Cg 编程

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