着色器开发入门
这篇文档会带你入门 起源的着色器开发,更多有关着色器的信息以及它们有什么用、应该怎么用,可参考 Shader。
开始吧
每个 起源的材质都有它们特定的着色器,着色器用于渲染材质的视觉效果。一般来说,着色器会定义材质表面的基本光传输逻辑,以便最终呈现高质量的渲染效果。
起源 SDK 拥有完整的 DirectX 着色语言 HLSL (High-Level Shading Language)以及着色器汇编的支持。我们建议一开始就用 HLSL 写着色器,最后涉及到精细的系统性能优化再使用汇编。
我们需要一些额外的工具来为 起源 SDK 编译着色器,接下来的部分会详细介绍这些工具,并提供它们的链接和简要的安装说明。
用到的工具有:Perl,DirectX SDK 和 make。一般而言以下过程只需进行一次,因为只是环境配置。
创建着色器的选择



选择一:Perl + DirectX SDK
Perl
Perl 可在 download page 安装,推荐安装的一个版本是 Strawberry Perl。
橙盒 引擎分支 SDK 也可依赖于非标准的 Perl, String::CRC32。如果你用的是 Strawberry Perl, 你可以通过 CPAN Client 安装它并通过
<StrawberryPerlInstallDir>\perl\bin\cpan.bat
启动。
输入以下命令来安装包文件: install String::CRC32

<StrawberryPerlInstallDir>\perl\bin\
然后再运行 cpan String::CRC32
DirectX SDK
为安装 November 2008 DirectX SDK, 请访问 https://archive.org/details/dxsdk_nov08。(因为微软早就不给这么老的 API 提供支持了,所以只能去 Internet Archive 下载)

DirectX SDK
!这就好像只安装 VC 运行库并不满足 C++ 开发一样。
设置环境变量
当 Perl 和 DirectX SDK 安装好之后, 确保你的 "Path" 环境变量已被正确配置。在 Microsoft Windows里, 你可以通过设置 -> 系统 -> 系统信息 -> 高级系统设置 来找到环境变量的配置窗口,如下图:
假设 Perl 安装在 C:\Perl 中
,DirectX 安装在 C:\DXSDK 中
,则 "Path "变量应包含 C:\Perl\bin
和 C:\DXSDK\Utilities\bin\x86
。
通过这种方式设置环境变量,你可以随心所欲地更新 Perl 和 DirectX SDK 而无需再手动复制文件。

选择二:SCell555 的着色器编译工具
为安装 SCell555 的着色器编译工具, 访问 release 来下载。
当你下载好压缩文件后,打开压缩包应该会发现以下三个文件夹:
- bin
- headers
- stdshaders
把 bin
文件夹放入 devtools
文件夹。
把 stdshaders
文件夹放入 materialsytem
文件夹。如果系统询问是否替换文件,选择是。
导航至压缩包中的 headers
文件夹,你应该会看到一个 cshader.h
文件和 VS2013
文件夹(其中还包含另一个 cshader.h
文件)。如果用的是 Visual Studio 2013 或更高版本,请将 VS2013
文件夹中的 cshader.h
文件放到 public\shaderlib
中并替换它。如果用的是 Visual Studio 2013 之前的版本,请使用 VS2013
文件夹之外的 cshader.h
文件。
完成配置
修改 stdshader_dx9_20b.txt
打开 materialsystem/stdshaders/stdshader_dx9_20b ,并像这样注释掉所有编译着色器的行:
//
// Standard shaders collection
//
// These shaders are compiled as the following shader models:
// _ps20.vcs
// _ps20b.vcs
// _vs20.vcs
//
//example_model_ps20b.fxc
//example_model_vs20.fxc
//SDK_Bloom_ps2x.fxc
//SDK_screenspaceeffect_vs20.fxc
//SDK_bloomadd_ps2x.fxc
修改 buildepisodicshaders.bat
打开 src\materialsystem\stdshaders\buildepisodicshaders.bat
并按照提示设置 GAMEDIR 和 SDKBINDIR。
在 buildsdkshaders.bat
中,可能还需要修改第 7 行对 vsvars32.bat 的调用,如果使用的是 Visual Studio 2013,则应指向 %VS120COMNTOOLS%。
注意:GAMEDIR 和 SDKBINDIR 必须符合 8.3 目录名称标准。
rem == Set the absolute path to your mod's game directory here ==
rem == Note that this path needs does not support long file/directory names ==
rem == So instead of a path such as "C:\Program Files\Steam\steamapps\mymod" ==
rem == you need to find the 8.3 abbreviation for the directory name using 'dir /x' ==
rem == and set the directory to something like C:\PROGRA~2\Steam\steamapps\sourcemods\mymod ==
set GAMEDIR= YOUR PATH HERE
rem == Set the relative path to SourceSDK\bin\orangebox\bin ==
rem == As above, this path does not support long directory names or spaces ==
rem == e.g. ..\..\..\..\..\PROGRA~2\Steam\steamapps\<USER NAME>\sourcesdk\bin\orangebox\bin ==
set SDKBINDIR= YOUR PATH HERE
着色器编译
进入 materialsystem\stdshaders
文件夹,然后输入用于编译着色器的 bat 文件名。可能是 buildepisodicshaders.bat
。如果你的操作正确,编译应该就没有问题了。

D3DVERTEXTEXTURESAMPLER0
未定义的错误。解决方法是删除顶点着色器文件中 register
函数对该定义的任何引用。 register( D3DVERTEXTEXTURESAMPLER0, s0 )
的文件,以便于查找引用。
另见
- 有关 HLSL 和着色器汇编的更多信息,请参阅 the online MSDN docs.
- Category:Material System -- 获取更多关于在材质中使用着色器的一般信息。