90 likes | 256 Views
Shader System. Mgun. Contents. Effect Pool Effect State Manager Shader System. Effect pool. . Effect pool -> What : 다른 effect 들 간의 변수와 텍스쳐 , 그리고 쉐이더를 공유 할 수 있게 해준다 . -> Advantage : 다른 이펙트 파일들 사이에서 데이터를 공유함으로서 공통된 변수나 데이터를 매 프레임당 한번씩만 설정해 줄 수 있도록 한다 . -> How :.
E N D
Shader System Mgun.
Contents • Effect Pool • Effect State Manager • Shader System
Effect pool • . Effect pool • -> What : 다른 effect들 간의 변수와 텍스쳐, 그리고 쉐이더를 공유 할 수 있게 해준다. • -> Advantage : 다른 이펙트 파일들 사이에서 데이터를 공유함으로서 공통된 변수나 데이터를 • 매 프레임당 한번씩만 설정해 줄 수 있도록 한다. • -> How : • dx10에서는 상수버퍼 그룹이용, Sampler 지원. • shader4.0모델에서는 sampler은 별개의 오브젝트라서 공유가능. • sharedcbuffercbShared { • float3 g_LightDir; • float g_TexMove; }; • shared texture2D g_txDiffuse; • shared sampler2D MeshTextureSampler = sampler_state { Texture = (g_txDiffuse);MinFilter = Linear;MagFilter = Linear;AddressU = WRAP;AddressV = WRAP; }; - dx9에서는 Sampler을 지원하지 않는다. shared float3 g_LightDir; shared texture2D g_txDiffuse; sampler2D MeshTextureSampler = sampler_state { Texture = (g_txDiffuse);MinFilter = Linear;MagFilter = Linear;AddressU = WRAP;AddressV = WRAP; };
Effect pool • . Use Sample • -> in Dx10: if(FAILED(DXUTFindDXSDKMediaFileCch( szEffectPool, MAX_PATH, L"EffectPools.fxh" ))) RT_ASSERT(false, "MRmanagerShaderEffect - DXUTFindDXSDKMediaFileCch") // 2. shader macro - ifdef D3D10을사용하기위해등록해둔다. D3D10_SHADER_MACRO Shader_Macros[] = { "D3D10", "1", NULL, NULL }; // 3. use effect pool MRgraphic10* pGraphic = (MRgraphic10*)pkMRgraphic; ID3D10Device* pDevice = pGraphic->GetDevice10(); if(FAILED(D3DX10CreateEffectPoolFromFile( szEffectPool, &Shader_Macros[0], NULL, "fx_4_0", D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, pDevice, NULL, &m_pkPool, NULL, NULL ))) { RT_ASSERT(false, "MRmanagerShaderEffect -X10CreateEffectPoolFromFile") }
Effect pool • . In Dx Sample
State Manager • . State Manager • -> What : Render loop에서 일어나는 state change를 직접 컨트롤 할 수 있게 하기 위한 인터페이스 • -> Advantage : 복잡한 Render loop에서 일어나는 state change의 횟수를 줄임으로써 Cpu작업 속도를 • 크게 향상시켜준다. 디바이스의 불필요한 state change의 필터링을 통해 많은 이점을 준다. • -> How : • ID3DXEffectStateManager을 오버라이드(상속)하여 사용. • class CStateManagerInterface : public ID3DXEffectStateManager • { • Public: • virtual ~CStateManagerInterface() • { • }; // virtual destructor, for cleanup purposes • virtual void DirtyCachedValues() = 0; // Cause any cached state change values to be invalid • virtual LPCWSTR EndFrameStats() = 0; // Called once per frame retrieve statistics • // Create a state manager interface for the device • static CStateManagerInterface* • CStateManagerInterface::Create( LPDIRECT3DDEVICE9 pDevice ); • };
State Manager -> How : Case 1. pure device – 단순장치, 하드웨에서만 꼭지점을 처리하기에 매우 빠름. Case 2. non pure device – 불필요한 중복의 각 state change마다 체크하고 제거.. 성능을 위해 이러한 작업의 횟수를 줄여야 한다. ID3DXEffectStateManager는 사용하면 유저핸들러를 사용할 수 있게 해주고 그럼으로 인해서, state change를 필터링 하여 state change를 조절할 수 있게 할 수 있다. 서로 다른 이펙트에 의해 구현되어지는 재질을 여러 개 사용하는 오브젝트의 고려 - 다양한 재질들과 오브젝트가 있는 화면의 복잡성 때문에 그리는 과정에서 많은 state change 필요 2. 장면을 그리기 위해 필요한 모든 state change를 render queue에 넣고, device 종류에 따라 render queue를 재정렬 한다. 3. rendering의 각 이펙트를 위해 state manager을 설정.
State Manager -> Performance Tip : state change의 필터링에다가 추가적인 옵션으로 render sequence를 재배열 하면 큰 포퍼먼스를 얻을 수 있다. // Render each mesh object For each instance of mesh x Setup transforms (ID3DXEffect SetMatrix) For each material of mesh x Set up material (ID3DXEffect Begin/BeginPass) Draw This is the same sequence re-ordered by material: // Render each effect to minimize state changes For each material y Set up material (ID3DXEffect Begin/Begin Pass) For each instance of material y Set up transforms (ID3DXEffect SetMatrix) Draw