编写和调试Shader程序
(1)DirectX EffectEdit
JohnsonFeng
常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手,本文先介绍DirectX的EffectEdit。
EffectEdit是DirectX9.0在August2005之前提供的一个编辑器
Binary:$installdir/bin/dxutils/effectedit.bin
Soucecode: $installdir/samples/c++/direct3d/effectedit
以下是EffectEdit的界面,虽然看上去很简陋,但是挺好用,笔者在这个工具上写过法线贴图程序,动态水波程序:
EffectEdit在August2005版本之后就去掉了,取而代之的是DirectX Viewer(DxViewer.exe),被这个工具替换掉的还有mview.exe,也是一个很好用的工具。在该版本中也可以找到EffectEdit的源代码。
此工具支持一些基本用于编辑的语义(semantic)和释义(anotation)工具,这里列出它支持的释义。对应版本的帮助中提供了释义介绍,但是不完整,根据源码,笔者将列出:
(一)工具内置语义(Semantic)
语义还包括输入输出语义,这里仅仅列出编辑器实用的,用于自动初始化的语义,不区分大小写,其中斜体是文档中没有列出但有效的语义。
Semantic | Meaning |
world transform matrix | |
VIEW | view transform matrix |
PROJECTION | projection transform matrix |
WORLDVIEW | world*view |
VIEWPROJECTION | view*projection |
WORLDVIEWPROJECTION | world*view*projection |
MATERIALAMBIENT | material.ambient |
MATERIALDIFFUSE | material.diffuse |
MATERIALSPECULAR | material.specular |
MATERIALPOWER | material.power |
TIME | current time |
MESHRADIUS | mesh bounding sphere radius |
举例:
sample.fx中的以下代码中,k_a将会自动用材质的颜色初始化,此编辑器中,材质是编辑器自动从.x中读取的。
float4 k_a :MATERIALAMBIENT={1.0f,1.0f,1.0f,1.0f};
另外一个很有用的语义是TIME,将被自动初始化成当前时间,类型为float,在调试动画时比较有用。
(二)释义(Anotation)
释义和注释是不同的概念,释义即写在变量后边的括号中的变量,特定类型和名字的释义变量取可以被正确地初始化为被解释对象的属性,
EffectEdit中纹理对象支持的释义包括:
Texture Anotation | Meaning |
NAME | texture filename |
FUNCTION | texture blendfunction? |
TARGET | Compile Target(tx_0,tx_1),refer D3DXCompileShader |
WIDTH | specify texture width |
HEIGHT | specify texture height |
DEPTH | volumn depth |
TYPE | texture type |
其中纹理类型:
Texture Type | Meaning |
volumn | 该纹理是一个体积纹理 |
cube | 该纹理是一个cubetexture |
<default> | 一般的2D纹理 |
(三)内置变量
Texture Type | Meaning |
BIMG | 调试视窗的背景 |
XFILE | 调试程序使用的.x文件 |
BCLR | 调试程序背景色 |
另外,下边给出一些学习Shader程序的路径供参考:
step | content | description |
1 | technique | 一个物体可以有多种渲染方法,每个technique代表一种 |
2 | pass | 某些特效在实现时需要渲染多次物体,渲染一次就对应一个pass,每个pass可以选用各自的顶点和像素Shader。 |
3 | renderstate | 渲染状态可以在pass内指定,语法参考dx帮助文档 |
4 | input/output Semantic | 输入和输出语义告诉设备,Shader程序的入口参数用顶点的什么信息初始化,以函数返回值代表什么含义。 |
5 | datatype | 常见的如float,float3,float4代表1,3,4个32位浮点数字 float4x4可以定义矩阵,float2可以定义uv坐标,float3可以用来定义法线。Shader程序可以认为是一种浮点数计算的程序。 |
6 | function | HLSL提供了很多内置的数学函数,参考dx相关文档 |
7 | algorithm | 这是学习Shader最难的部分了,对于VS,最好是学习好了固定管线的原理之后再写Shader程序。对于PS,这部分需要使用较多的纹理特效,2D图形学和3D数学知识,典型的如photoshop中用到的滤镜算法,卷积预算等。 |
补充一些PS调试的技巧:
1.在进行PS程序调试时,有时候光照结果不正确,可以试着直接返回法线,光源向量,反射向量等参数,这样很容易判别是哪里出了问题。
2.在光源向量后增加以下释义,可以在视窗中增加一个用于调接光源方向的箭头,通过交互式的方式调整一些方向向量。可在多个需要调整的向量上增加此释义,箭头的名称是释义字符串的值得,名称和向量的值得将会显示在箭头旁边。
float3 lightDir<string UIDirectional="Light Direction">={0,1,0};
EffectEdit源码:
https://files.cnblogs.com/Tue/EffectEdit.rar
中秋假期快完了,乘着整理以前写的Shader程序的时机,总结一下,希望能给大家作个参考。
2008年9月15日