D3D9 effect 연구 및 학습
1. 여러 글로벌 변수의 정의:
ID3DXEffect* g_pEffect = NULL;
D3DXMATRIXA16 g_mCenterWorld;
D3DXHANDLE g_hWorld = NULL;
D3DXHANDLE g_hWorldViewProjection = NULL;
D3DXHANDLE g_hTechniqueRenderScene = NULL;
2. 설비 검사
bool IsDeviceAcceptable(D3DCAPS9* pCaps,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,bool bWindowed,void* pUserContext)
{
if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) ) //
return false;
// , ,
IDirect3D9* pD3D = DXUTGetD3D9Object(); if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType, AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, BackBufferFormat ) ) ) return false; return true;
}
3、效果文件创建载入HRESULT D3DXCreateEffectFromFile( _In_ LPDIRECT3DDEVICE9 pDevice, //D3D _In_ LPCTSTR pSrcFile, // _In_ const D3DXMACRO *pDefines, _In_ LPD3DXINCLUDE pInclude, _In_ DWORD Flags, _In_ LPD3DXEFFECTPOOL pPool, _Out_ LPD3DXEFFECT *ppEffect, _Out_ LPD3DXBUFFER *ppCompilationErrors );
typedef struct D3DXMACRO { LPCSTR Name; LPCSTR Definition; } D3DXMACRO, *LPD3DXMACRO;
HRESULT OnCreateLoadFile(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,void* pUserContext ) { DXUTFindDXSDKMediaFileCch( str, MAX_PATH, TEXT( "CompiledEffect.fxo" ) ); // V_RETURN( D3DXCreateEffectFromFile( pd3dDevice, str, NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &g_pEffect, NULL ) ); return S_OK; }
4. 효과 파일의 변수 핸들 얻기HRESULT GetEffectParameterHandle( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) { D3DXCOLOR colorMtrlDiffuse( 1.0f, 1.0f, 1.0f, 1.0f ); D3DXCOLOR colorMtrlAmbient( 0.35f, 0.35f, 0.35f, 0 );
g_pEffect->SetVector( "g_MaterialAmbientColor", ( D3DXVECTOR4* )&colorMtrlAmbient ); // g_pEffect->SetVector( "g_MaterialDiffuseColor", ( D3DXVECTOR4* )&colorMtrlDiffuse ); g_hTechniqueRenderScene = g_pEffect->GetTechniqueByName( "RenderScene" ); // g_hTime = g_pEffect->GetParameterByName( NULL, "g_fTime" ); g_hWorld = g_pEffect->GetParameterByName( NULL, "g_mWorld" ); g_hWorldViewProjection = g_pEffect->GetParameterByName( NULL, "g_mWorldViewProjection" ); g_hMeshTexture = g_pEffect->GetParameterByName( NULL, "g_MeshTexture" ); return S_OK; }
5. 설정 데이터void SetEffectParater(double fTime, float fElapsedTime, void* pUserContext) { D3DXMATRIXA16 mWorld; D3DXMATRIXA16 mView; D3DXMATRIXA16 mProj; D3DXMATRIXA16 mWorldViewProjection; mWorld = g_mCenterWorld * *g_Camera.GetWorldMatrix(); mProj = *g_Camera.GetProjMatrix(); mView = *g_Camera.GetViewMatrix(); mWorldViewProjection = mWorld * mView * mProj; g_pEffect->SetMatrix( g_hWorldViewProjection, &mWorldViewProjection ); g_pEffect->SetMatrix( g_hWorld, &mWorld ); g_pEffect->SetFloat( g_hTime, ( float )fTime ); }
6, 렌더링void RenderEffect(IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext) { pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 70 ), 1.0f, 0 ); pd3dDevice->BeginScene()
UINT iPass, cPasses; // g_pEffect->Begin( &cPasses, 0); for( iPass = 0; iPass < cPasses; iPass++ ) { g_pEffect->BeginPass( iPass );
//
g_pEffect->EndPass();
} g_pEffect->End();
pd3dDevice->EndScene(); }
7. 관련 자원 방출void OnLostDevice() { if( g_pEffect ) g_pEffect->OnLostDevice(); } void OnDestroyDevice() { SAFE_RELEASE( g_pEffect ); }
fx 파일 섹션//
float4 g_MaterialAmbientColor; float4 g_MaterialDiffuseColor; float3 g_LightDir = normalize(float3(1.0f, 1.0f, -1.0f)); float4 g_LightAmbient = { 0.2f, 0.2f, 0.2f, 0.2f }; float4 g_LightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f }; texture g_RenderTargetTexture; // float g_fTime; float4x4 g_mWorld; float4x4 g_mWorldViewProjection; sampler RenderTargetSampler = sampler_state { Texture = <g_RenderTargetTexture>; MinFilter = POINT; MagFilter = POINT; MipFilter = NONE; AddressU = Clamp; AddressV = Clamp; }; struct VS_OUTPUT { float4 Position : POSITION; float4 Diffuse : COLOR0; float2 TextureUV : TEXCOORD0; }; VS_OUTPUT RenderSceneVS( float4 vPos : POSITION, float3 vNormal : NORMAL, float2 vTexCoord0 : TEXCOORD0 ) { VS_OUTPUT Output; float3 vNormalWorldSpace; float4 vAnimatedPos = vPos; vAnimatedPos.x *= (1.0 + cos(g_fTime)/10); vAnimatedPos.y *= (1.0 + sin(g_fTime)/10); vAnimatedPos.z *= (1.0 + cos(g_fTime)/10); Output.Position = mul(vAnimatedPos, g_mWorldViewProjection); vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); Output.Diffuse.rgb = g_MaterialDiffuseColor * g_LightDiffuse * max(0,dot(vNormalWorldSpace, g_LightDir)) + g_MaterialAmbientColor * g_LightAmbient; Output.Diffuse.a = 1.0f; Output.TextureUV = vTexCoord0; return Output; } struct PS_OUTPUT { float4 RGBColor : COLOR0; }; PS_OUTPUT RenderScenePS( VS_OUTPUT In ) { PS_OUTPUT Output; Output.RGBColor = tex2D(MeshTextureSampler, In.TextureUV) * In.Diffuse; return Output; } technique RenderScene { pass P0 { ZENABLE = true; //Z-buffer VertexShader = compile vs_2_0 RenderSceneVS(); PixelShader = compile ps_2_0 RenderScenePS(); } }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javascript의 매트릭스(및 펄리시) 배경 효과 :)오늘은 쓸데없지만 멋진 것을 보여드리려고 합니다. 내 매트릭스 펄리쉬 배경! 😎 😎 😎 내 github 페이지를 확인하여 😀 그것은 또는 에서 찾을 수 있는 작업에서 파생된 자바스크립트의 두 줄에 불과하므로 크레딧이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.