Effect特效文件
1. 什么是Effect特效文件?
Direct3D 中,有个 Effect 文件的概念。将所创建的着色器与这些文件捆绑在一起就是所谓的一个效果(特效)。 大多数时候,你只是结合顶点和像素着色器来创建某一行为,这叫做技术(technique)。一种技术定义了一个渲染效果,而 Effect文件就是包含很多渲染技术的文件。
例如:
technique11 ColorInversion { pass P0 { SetVertexShader( CompileShader( vs_5_0, VS_Main() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_5_0, PS_Main() ) ); } }
每个效果文件都包含一个特定的渲染功能集。 每个效果,都可以在你绘制场景中的物体时应用,来指示物体绘制的外观和怎样绘制。 例如,你可以创建一个效果专用于贴图对象,或者创建一个效果用于产生明亮的光照或模糊的光照。 对于同一个效果也可以有不同的版本, 根据机器性能不同,将某些效果用于低端机器,而另一些用于高端机器。 在使用效果时,它们有着十分广泛的用途。
当然可以在 Direct3D 11 中一直单独的使用着色器,但是你会发现当将这些单独的着色器放在一起作为一个Effect使用时,会变得十分有用。 一个效果是以一种特别的方式将所需的着色器简单的放在一起打包来渲染对象。 效果作为一个单独的对象载入,并且只包含那些必须用到的着色器。通过在你的场景中改变效果文件,你就能够很容易改变 Direct3D 的渲染方式。 效果定义在效果文件之中,以文本格式从磁盘中载入,编译和执行。
效果文件和我们之前使用的着色器文件不同之处在于,Effect文件不仅仅包含着色器,还有诸如渲染状态,混合状态等内容。
2. Effect特效文件的组成(布局)
Effect效果文件由几个不同的部分组成:
外部变量(External Variables)——这些变量的数据来自于程序的调用。例如:
Texture2D colorMap : register( t0 ); SamplerState colorSampler : register( s0 ); cbuffer cbChangesEveryFrame : register( b0 ) { matrix worldMatrix; }; cbuffer cbNeverChanges : register( b1 ) { matrix viewMatrix; }; cbuffer cbChangeOnResize : register( b2 ) { matrix projMatrix; };
输入结构(Input structures)——定义着色器之间传递信息的结构。例如:
struct VS_Input { float4 pos : POSITION; float2 tex0 : TEXCOORD0; }; struct PS_Input { float4 pos : SV_POSITION; float2 tex0 : TEXCOORD0; };
着色器(Shaders)——着色器代码(一个效果文件可以包含多个着色器)。例如:
PS_Input VS_Main( VS_Input vertex ) { PS_Input vsOut = ( PS_Input )0; vsOut.pos = mul( vertex.pos, worldMatrix ); vsOut.pos = mul( vsOut.pos, viewMatrix ); vsOut.pos = mul( vsOut.pos, projMatrix ); vsOut.tex<