对于游戏玩家和图形开发者,Nvidia已经成为一个家喻户晓的名字。Nvidia因为创造了GPU而闻名于世,而且在图形硬件和软件领域都是世界领导者。NVIDIA在图形社区的众多贡献之一是FX Composer,一款用于缩写shaders的集成开发环境。本节介绍了这个工具,在本书上将会广泛使用。
首先需要注意的是用HLSL编写shaders与编写其他软件是相似的。Shader代码存储在一个文本文件中,任何文本编辑器都可以修改。事实你可能更使用FX Composer之外的软件编写shaders,比如Visual Studio。但是使用一个内置的shader编写工具有很多好处,比如FX Composer,尤其是期望在修改shaders后得到即时的视觉反馈。此外,使用FX Composer这种工具可以让你在深入学习图形API之前,集中学习基本的shader编写。但是你不需要关心可移值性,针对特定工具的shader代码,使用FX Composer编写的shaders可以直接用于第三部分编写的渲染引擎。
FX Composer是一个免费的工具,可以从NVIDIA的开发者社区下载(下载链接可以本书的配套网站上找到)。编写本书的时候,FX Composer最新的版本是2.5(更详细的版本号是2.53.0524.1905)。图3.3是FX Composer创建一个新工程的默认布局视图。
图 3.3 NVIDIA FX Composer’s default window layout。
NVIDIA FX Composer已经有较长一段时间没有继续更新了。它支持DirectX 9,10,但不支持DirextX 11。类似的shader编写工具,RenderMonkey,也不支持DirectX 11, 并且停止了开发。此外,就我所知目前还没有其他可替代的商业工具可以满足shaders的快速发展和可视化。这既是一个缺陷也是一个机遇。
尤其是对于图形领域的初学者,这些工具不能支持最新的图形API是一个问题。没有shader开发工具,即使是要显示最简单的渲染技术,也要先详细了解图形API。第三部分首要学习的就是图形API,这部分前几章主要使用C++创建一个渲染框架,而不进行任何实际的渲染。这种先决条件让人非常沮丧,而一个shader开发工具使得你可以立即显示你的劳动成果。
最新的shader开发工具的缺乏也给有志向的软件开发者带来了一个机会,因为这个领域还处于一片空白。
最终我还是选择使用NVIDIA FX Composer作为本书第二部分的开发工具,因为他提供了即时的可视化反馈,而且虽然不支持DirectX 11,但是并不妨碍介绍渲染技术。早期的开发不需要DirectX 11的特性,而且目前使用的材质在最新的DirectX API中依然有效。
在FX Composer的Assets panel中(如图3.4),你会看到Effects和Materials结点。Effect表示一个包含shader code的文件。材质本质上是一种effect的实例,这种effect的值由shaders对外提供的任何变量指定的。多种材质可以使用相同的effect。
图3.4 NVIDIA FX Composer’s Assets panel。
如图3.5,一个完全正确的材质(也就是说基本的effect编译正确)以一个sphere显示在Materials panel中,展示了shader的渲染结果。如果同样的effect编译失败,sphere就会以wireframe方式显示。Materials panel下方显示了材质使用到的任何textures。
图3.5 NVIDIA FX Composer’s Materials panel with two materials (broken material on
right).
在默认布局下,Render panel在FX Composer的右下角。这个panel显示shaders应用到场景中几何体上的输出结果(如图3.6)。你可以使用工具栏上的预设模型按钮添加objects,或者导入自定义的模型。要导入一个模型,点击File菜单,或者工具栏的导入按钮。在一个场景中可以包含多个模型,并为每一个模型指定一个不同的材质。只需要把材质从Materials panel中拖放到Render panel中的object上就可以把材质应用到这个object上。
图3.6 NVIDIA FX Composer’s Render panel. (3D Model by Nick Zuccarello, Florida
Interactive Entertainment Academy.)
你可以使用鼠标和键盘控制Render panel中3D场景的camera显示。如果你熟悉Autodesk Maya(非常流行的3D建模工具),这种控制方式很相似。你可以点击鼠标左键选择objects。在默认的Orbit camear下,按下F键选择一个模型作为camear的焦点为。按住Alt键,点击鼠标左键并拖动可以使用camera绕着object转动。按住Shift键,点击鼠标左键并垂直拖动鼠标可以放大或缩小camera的距离。或者也可以使用鼠标滚轮缩放camera的距离。按住Ctrl键,点击鼠标左键并拖动可以平移camera。
就像调整camera一下,可以操作场景中的objects。通过对应的操作模式按键Q,W,E,R,或者Render panel中对应的工具栏按钮可以改变objects的操作模式。选择模式下,通过点击鼠标左键选择object但不做任何改动。平移模式允许改变object在场景中位置。在平移模式中选中一个object,在object的中心位置就会出现与坐标轴对齐的控制箭头。可以通过拖动对应的箭头使用object朝着对应的坐标方向移动,或者拖动三个箭头交点处的加号图标(+),可以使用object自由移动。旋转模式和缩放模式与平移模式具有类似的操作方式。
Render panel还具有很多其他的功能,包括定制背景色,一个参考网格,trackball和flythrough方式的camera,屏幕截图。建议多尝试Render panel的使用以熟悉这些功能。
Textures Panel支持从工程中增加和删除textures,把textures应用于材质,以及检查单个textures的细节。要添加纹理,可以点击Textures panel左上角的加号图标,或者直接从Windows Explorer中拖放文件到panel中。把纹理从Textures panel中拖放到Render panel的object上就可以把纹理应用到object的材质上,或者在Properties panel上指定纹理值应用纹理。双击Textures panel中的一个纹理,就可以查看纹理的细节和指定的颜色通道。
图3.7 NVIDIA FX Composer’s Textures panel. (Original Earth textures from Reto St?ckli,
NASA Earth Observatory. Additional texturing by Nick Zuccarello, Florida Interactive
Entertainment Academy.)
注意:
把纹理应用于材质上,需要相关的effect支持一种或多种纹理值。如果effect支持多重纹理,拖动一个纹理到object上会弹出提示框用于选择需要应用的纹理值。
第5章,“Texture Mapping”将会讲述这个课题。