这个例子没有用效果框架的接口,只用了顶点着色器。
1
OnCreateDevice函数中,载入顶点着色器。
WCHAR strPath[512];
LPD3DXBUFFER pCode;
D3DVERTEXELEMENT9 decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
D3DDECL_END()
};
V_RETURN( pd3dDevice->CreateVertexDeclaration( decl, &g_pVertexDeclaration ) );
// Find the vertex shader file
V_RETURN( DXUTFindDXSDKMediaFileCch( strPath, 512, L"HLSLwithoutEffects.vsh" ) );
这一次终于用到了顶点描述表。
V_RETURN( D3DXCompileShaderFromFile( strPath, NULL, NULL, "Ripple",
"vs_2_0", dwShaderFlags, &pCode,
NULL, &g_pConstantTable ) );
// Create the vertex shader
hr = pd3dDevice->CreateVertexShader( ( DWORD* )pCode->GetBufferPointer(),
&g_pVertexShader );
载入并且创建顶点着色器。
2
OnResetDevice函数,创建顶点缓冲和索引缓冲。具体代码就不贴了。
3
OnFrameMove函数,设置着色器参数
// Set up the vertex shader constants
D3DXMATRIXA16 mWorldViewProj;
D3DXMATRIXA16 mWorld;
D3DXMATRIXA16 mView;
D3DXMATRIXA16 mProj;
mWorld = *g_Camera.GetWorldMatrix();
mView = *g_Camera.GetViewMatrix();
mProj = *g_Camera.GetProjMatrix();
mWorldViewProj = mWorld * mView * mProj;
g_pConstantTable->SetMatrix( DXUTGetD3D9Device(), "mWorldViewProj", &mWorldViewProj );
g_pConstantTable->SetFloat( DXUTGetD3D9Device(), "fTime", ( float )fTime );
OnFrameRender函数~注意这里直接使用了SetVertexDeclaration和SetVertexShader函数。
if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{
pd3dDevice->SetVertexDeclaration( g_pVertexDeclaration );
pd3dDevice->SetVertexShader( g_pVertexShader );
pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( D3DXVECTOR2 ) );
pd3dDevice->SetIndices( g_pIB );
V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, g_dwNumVertices,
0, g_dwNumIndices / 3 ) );
RenderText();
V( g_HUD.OnRender( fElapsedTime ) );
V( pd3dDevice->EndScene() );
}
5RenderText(),这个函数在这个例子中并不占主要地位,但这里用到了txtHelper,DXUT中用这个来输出文字,因此提及一下,具体代码看例子。
至于HLSL文件就只列出代码不解释了,比较简单。
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
float4x4 mWorldViewProj; // World * View * Projection transformation
float fTime; // Time parameter. This keeps increasing
//-----------------------------------------------------------------------------
// Vertex shader output structure
//-----------------------------------------------------------------------------
struct VS_OUTPUT
{
float4 Position : POSITION; // vertex position
float4 Diffuse : COLOR0; // vertex diffuse color
};
//-----------------------------------------------------------------------------
// Name: Ripple
// Type: Vertex shader
// Desc: This shader ripples the vertices
//-----------------------------------------------------------------------------
VS_OUTPUT Ripple( in float2 vPosition : POSITION )
{
VS_OUTPUT Output;
float fSin, fCos;
float x = length( vPosition ) * sin( fTime ) * 15.0f;
// This HLSL intrinsic computes returns both the sine and cosine of x
sincos( x, fSin, fCos );
// Change the y of the vertex position based on a function of time
// and transform the vertex into projection space.
Output.Position = mul( float4( vPosition.x, fSin * 0.1f, vPosition.y, 1.0f ), mWorldViewProj );
// Output the diffuse color as function of time and
// the vertex's object space position
Output.Diffuse = 0.5f - 0.5f * fCos;
return Output;
}