【着色器编译演示】
#下面我们来着手编译下这个文件。
首先,
我们将上面代码复制进一个文本文件并重命名为NPRMetallic.vhl。
然后在命令行输入如下命令:
"fxc -nologo -T vs_1_1 -Fc -Vd NPRMetallic.vhl".
因为这个顶点着色器不要求流控制,
我们选用vs_1_1编译目标.
#输出如下:
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc -nologo -T vs_1_1 -Fc -Vd j:\NPRMetallic.vhl
//
//
// Parameters:
//
// float4 light0;
// float4 light1;
// float4 light2;
// float4 view_position;
// float4x4 view_proj_matrix;
//
//
// Registers:
//
// Name Reg Size
// ---------------- ----- ----
// view_proj_matrix c0 4
// view_position c4 1
// light0 c5 1
// light1 c6 1
// light2 c7 1
//
vs_1_1
dcl_position v0
dcl_normal v1
mul r0, v0.y, c1
mad r0, c0, v0.x, r0
mad r0, c2, v0.z, r0
mad oPos, c3, v0.w, r0
add r0, -v0, c4
dp4 r0.w, r0, r0
rsq r0.w, r0.w
mul oT0.xyz, r0.w, r0
add r0, -v0, c5
dp4 r0.w, r0, r0
rsq r0.w, r0.w
mul oT2.xyz, r0.w, r0
add r0, -v0, c6
dp4 r0.w, r0, r0
rsq r0.w, r0.w
mul oT3.xyz, r0.w, r0
add r0, -v0, c7
dp4 r0.w, r0, r0
rsq r0.w, r0.w
mul oT4.xyz, r0.w, r0
mov oT1.xyz, v1
// approximately 21 instruction slots used
代码上方是顶点着色器的输入参数,
这些参数需要通过API来设定以使着色器正常工作。
下面一个部分是硬件寄存器的分配。
租后是汇编指令,
一共21条。
现在不必要从头读到尾,
但应该注意dcl_position,dcl_normal两个语句,
他们代表这main函数的两个参数。
另外注意输出结果放在oPos,oT0~4这些输出寄存器中。
现在我们需要使用顶点着色器把几何体变换到剪裁空间并定义那些将会在多边形插值用用到的值。
#下面我们来进行像素着色:
float4 Material;
sampler Outline;
float4 main(float3 View:TEXCOORD0,
float3 Normal:TEXCOORD1,
float3 Light1:TEXCOORD2,
float3 Light2:TEXCOORD3,
float3 Light3:TEXCOORD4):COLOR
{
//标准化输入向量
float3 norm = normalize(Normal);
float4 outline = tex1D(Outline, 1 - dot(norm, normalize(View)));
float lighting = (dot (normalize(Light1), norm)*0.5 + 0.5) +
(dot (normalize(Light2), norm)*0.5 + 0.5) +
(dot (normalize(Light3), norm)*0.5 + 0.5) ;
return outline*Material*lighting;
}
使用“fxc -nologo -T ps_2_0 -Fc -Vd NPRMetallic.phl”
#编译产生的代码如下:
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc -nologo -T ps_2_0 -Fc -Vd J:\shader\NPRMetallic.phl
//
//
// Parameters:
//
// float4 Material;
// sampler2D Outline;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// Material c0 1
// Outline s0 1
//
ps_2_0
def c1, 1, 0.5, 0, 0
dcl t0.xyz
dcl t1.xyz
dcl t2.xyz
dcl t3.xyz
dcl t4.xyz
dcl_2d s0
nrm r0.xyz, t2
nrm r1.xyz, t1
dp3 r1.w, r0, r1
mad r1.w, r1.w, c1.y, c1.y
nrm r0.xyz, t3
dp3 r0.x, r0, r1
mad r1.w, r0.x, c1.y, r1.w
add r1.w, r1.w, c1.y
nrm r0.xyz, t4
dp3 r0.x, r0, r1
mad r1.w, r0.x, c1.y, r1.w
add r1.w, r1.w, c1.y
nrm r0.xyz, t0
dp3 r0.x, r1, r0
add r0.xy, -r0.x, c1.x
texld r0, r0, s0
mul r0, r0, c0
mul r0, r1.w, r0
mov oC0, r0
// approximately 29 instruction slots used (1 texture, 28 arithmetic)
跟顶点着色器相同,开头全局域的变量需要使用API来置.
在ps_2_0指令后,
有一个def指令。
这个指令是汇编指令流中
的自由指令,
他定义了ALU运算使用到的常数。
这种常数一般
是HLSL着色器中出现的字面值,