Effects

1.1 Effect Files

Effect file 就是一个.fx文件。constant buffers可以用来保存”全局的”变量然后把这些变量交由着色器。而这个效果就是写在.fx文件中的。当然如果一个Effect file要能够被着色器和constant buffer使用,其至少要包含一个technique。而一个technique至少包含一个通道(pass)。

. technique 10: 一个technique 包含了一个或多个通道来穿件特殊的渲染效果。在每一个通道里面,一个几何体被不同的渲染方式渲染。而各个通道不同的效果能够组合最终被显示出来。例如,一个地形technique也许使用了多个通道纹理techique。需要注意的一点是多通道technique代价比较昂贵,因为一个几何体在每一个通道中都被渲染了。

. pass: 一个通道由顶点着色器,几何着色器,像素着色器以及渲染的状态(render states)组成。

下面的代码及时一个effect files 的例子。

1 cbuffer cbPerObject  2 {  3     float4x4 gWVP;  4 }; 5  void VS(float3 iPosL  : POSITION,  6         float4 iColor : COLOR,  7         out float4 oPosH  : SV_POSITION,  8         out float4 oColor : COLOR)  9 { 10     // Transform to homogeneous clip space. 11      oPosH = mul(float4(iPosL, 1.0f), gWVP); 12     // Just pass vertex color into the pixel shader. 13      oColor = iColor; 14 }15 float4 PS(float4 posH  : SV_POSITION, 16           float4 color : COLOR) : SV_Target 17 { 18     return color; 19 }20 technique10 ColorTech 21 { 22     pass P0 23     { 24         SetVertexShader( CompileShader( vs_4_0, VS() ) ); 25         SetGeometryShader( NULL ); 26         SetPixelShader( CompileShader( ps_4_0, PS() ) ); 27     } 28 }

2. 创建一个effect

在D3D中,一个effect被ID3D10Effect接口描述被D3DX10CreateEffectFromFile创建。

1     HRESULT D3DX10CreateEffectFromFile(  2     LPCTSTR pFileName,    //.fx文件的名字  3      CONST D3D10_SHADER_MACRO *pDefines,//未使用,至0  4      ID3D10Include *pInclude, // 未使用, 至0  5      LPCSTR pProfile,//fx的版本,10.0 是"fx_4_0",  6      UINT HLSLFlags,//标志.fx文件是怎么被编译的  7     UINT FXFlags, //未使用,至0  8     ID3D10Device *pDevice,//Device  9     ID3D10EffectPool *pEffectPool,//内存池 10     ID3DX10ThreadPump *pPump,// 11     ID3D10Effect **ppEffect,//这个就是我们创建的effct 12     ID3D10Blob **ppErrors); 13     HRESULT *pttResult

3. 把Effect 和C++程序联系起来。

通常情况下,一个C++程序需要更新constant buffers。例如在effct 文件中我们有如下的constant buffer。

1 cbuffer cbPerObject 2 { 3     float4x4 gWVP; 4     float4 gColor; 5     float gSize; 6     int gIndex; 7     bool gOptionOn; 8 };

通过ID3D10Effect 接口,我们能够获取指向constant buffer的指针。

1 ID3D10EffectMatrixVariable* fxWVPVar;  2 ID3D10EffectVectorVariable* fxColorVar;  3 ID3D10EffectScalarVariable* fxSizeVar;  4 ID3D10EffectScalarVariable* fxIndexVar;  5 ID3D10EffectScalarVariable* fxOptionOnVar;  6 fxWVPVar      = mFX->GetVariableByName("gWVP")->AsMatrix();  7 fxColorVar    = mFX->GetVariableByName("gColor")->AsVector();  8 fxSizeVar     = mFX->GetVariableByName("gSize")->AsScalar();  9 fxIndexVar    = mFX->GetVariableByName("gIndex")->AsScalar(); 10 fxOptionOnVar = mFX->GetVariableByName("gOptionOn")->AsScalar();

ID3D10Effect::GetVariableByName接口返回一个指向ID3D10EffectVariable形式的指针。但是ID3D10EffectVariable是一个通用的effct 形式。所以我们用As*方法转化为具体的形式。

一旦我们得到了这些地址,我们就可以给他们赋值了。

1 fxWVPVar->SetMatrix( (float*)&M ); // assume M is of type D3DXMATRIX 2 fxColorVar->SetFloatVector( (float*)&v ); // assume v is of type 3 // D3DXVECTOR4 4 fxSizeVar->>SetFloat( 5.0f ); 5 fxIndexVar->SetInt( 77 ); 6 fxOptionOnVar->SetBool( true );

technique是effect渲染几何图形的载体。我们可以按以下方式创建一个technique

1 ID3D10EffectTechnique* mTech;2 mTech = mFX->GetTechniqueByName("ColorTech");

4. 利用effect 渲染

在利用technique渲染之前,我们必须constant buffers中的数据都被更新了。然后我们要做的就是循环所有的technique pass,apply这个通道,然后花几何图形。

1 D3D10_TECHNIQUE_DESC techDesc; 2 mTech->GetDesc( &techDesc ); 3 for(UINT p = 0; p < techDesc.Passes; ++p) 4 { 5     mTech->GetPassByIndex( p )->Apply(0);6     mBox.draw(); 7 }

原文链接: https://www.cnblogs.com/sld666666/archive/2010/09/21/1832833.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/15268

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午3:12
下一篇 2023年2月7日 下午3:12

相关推荐