图15 shader 编辑器窗口(HLSL shader)
在上面的图形用户界面中,shader编辑器有两个标签叶;一个用于顶点shader另一个用于像素shader。这个用户界面根据你选择的shader类型的变化而变化。图16 是一个汇编语言shader编辑器用户界面的快照。
图16 汇编语言shader编辑器窗口
要编辑不同过程的shaders,你只需要简单得选中你想要编辑的过程。顶点和像素shader标签将被更新为新过程的顶点和像素shader标签叶。你能用Ctrl和Tab键的组合来快速的在顶点和像素shader标签叶之间切换。
顶点shader设置和编辑
让我们在我们地一个过程的顶点shader中增加一些代码。下表显示了我们将要增加的代码。(表1):
float4x4 view_matrix;
float4x4 view_proj_matrix;
float4 lightDir;
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 Norm : TEXCOORD0;
float3 View : TEXCOORD1;
float3 Light : TEXCOORD2;
};
VS_OUTPUT main(
float4 inPos : POSITION,
float3 inNorm : NORMAL )
{
VS_OUTPUT Out = (VS_OUTPUT) 0;
// Output transformed position:
Out.Pos = mul( view_proj_matrix, inPos );
// Output light vector:
Out.Light = -lightDir;
// Compute position in view space:
float3 Pview = mul( view_matrix, inPos );
// Transform the input normal to view space:
Out.Norm = normalize( mul( view_matrix, inNorm ) );
// Compute the view direction in view space:
Out.View = - normalize( Pview );
return Out;
}
表1于计算Phong光照的顶点shader
顶点shader变换顶点位置,然后将其输出。然后她用一个名字为lightDir的shader变量计算了光向量(我们将在我们的创建完成我们的shaders后增加shader昌亮)。他还用RenderMonkey的一个预定义变量——view_matrix计算了顶点,视向量和法向量在视空间的位置,然后将视向量和法向量输出到像素shader中。
在我们实际增加这些代码之前,让我们仔细看看RenderMonkey用于编辑HLSL shaders的用户界面。
高级着色语言(HLSL)编辑器包括三部分。在编辑器顶部有一个用于管理shader参数的小装置。中间的文本编辑器用于显示HLSL shader的参数声明。该部分是不可编辑的,他仅被上部管理shader参数的小装置控制。这样能有效的保证RenderMonkey的变量节点和纹理对象正确的映射到HLSL参数。底部的窗口用于编辑实际的shader文本(见图15)。注意,一旦完成了常量和采样器的映射,你就能将常量编辑器块最小化
取消其前面的钩选。
要映射一个变量节点(向量,颜色,矩阵,或标量)单击变量名标签后的箭头按钮:
再弹出的一个包含了在被编辑的shader范围内的所有变量节点的菜单中选择一个你想映射的节点。(图17)
图17增加变量到HLSLshaders
这是,“name”标签栏将会变成你选择的节点的名字。接下来你要点击“Add ”按钮将新增加的变量节点加入到声明块,且将其映射为一个shader常量。然后,你将在实际的文本声明中看到该声明的变量。
现在让我们增加一个光向量,将其映射为我们写的顶点shader中的一个常量。在特效工作区节点上单击右键然后选择Add Variable。然后选择vector变量类型,将其命名为lightDir。若果你愿意也可以不选Artist Editable。单击OK按钮将在你的工作区中增加一个新的光向量,你将看到一个像这样的节点
。转到我们已经打开的顶点shader编辑器,一步一步地将这个光向量映射为一个顶点shader的常量。当你点击Add按钮后,声明块中将增加一个像这样的文本——float4 lightDir;我们已将在我们的shader中增加了对一个常量!
接下来该shader需要的一个变量是视矩阵。应为它是RenderMonkey的一个预定义变量,所以,你不能直接改变它的值。好了,让我们在工作区中增加该变量。右击特效工作区节点选择Add Variable。选择Matrix变量类型。你将看到名称编辑框变成组合框。展开这个组合框,在出现的变量列表中选择view_matrix。然后单击OK搞定。
你将在工作区中看到这样一个节点
。左下角绿色的小”p”表示它是一个RenderMonkey的预定义变量。根据上述步骤增加这个变量到顶点shader的声明区。下表列出了声明块中的全部变量(顺序并不重要):
Float4×4 view_proj_matrix: register(c0);
Float4 lightDir;
Float4×4 view_matrix;
现在你能简单的书写余下的shader代码(顶点shader输出结构声明和主函数)到shader的文本编辑器窗口。
用户应该已经注意到了,RenderMonkey中将要被映射到高级着色语言中的参数的节点必须有一个合法的名称。请参考HLSL语言的用户手册来了解更多的关于命名规则的信息。
默认情况下,一个HLSL shader 的入口函数名为main,(顶点和像素shader中都适用)。如果你想改变入口函数名,在入口点编辑区改变一个你想要的名字即可:
.
因为每个shader都需要一个编译目标。所以,我们也需要为它指定一个。默认的,RenderMonkey的 HLSL shaders 提供了vs_1_1和ps_1_4。要改变目标的版本,从目标组合框中的列表中选择一个你想要的目标
。你要为顶点和像素shader分别指定目标。请参考HLSL文档来了解每个目标。
底部的区域用于编辑shader的文本。该文本中至少要包含一个用于指明shader编译的入口点的函数。这个文本编辑器有HLSL风格的语法颜色。