MRTs
マルチレンダーターゲットを使ってみた。
1パス目は、レンダーターゲットは2つ。
2パス目は、1パス目のレンダーターゲットをテクスチャとして利用。
左と右は別々のテクスチャ。
MRTsで別々のレンダーターゲットに描画したものをテクスチャにしたもの。
Texture2D Texture0 : register(t0); SamplerState SamplerLinear0 : register(s0); cbuffer cbChangesEveryFrame : register(b0) { matrix World; matrix View; matrix Projection; float4 ObjectID; }; struct VS_INPUT { float4 Pos : POSITION; float2 Tex : TEXCOORD0; }; struct PS_INPUT { float4 Pos : SV_POSITION; float2 Tex : TEXCOORD0; float ObjectID : TEXCOORD1; }; struct PS_OUTPUT { float4 oTarget0 : SV_Target0; float4 oTarget1 : SV_Target1; }; //-------------------------------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------------------------------- PS_INPUT VS(VS_INPUT input) { PS_INPUT output = (PS_INPUT)0; output.Pos = mul(input.Pos, World); output.Pos = mul(output.Pos, View); output.Pos = mul(output.Pos, Projection); output.Tex = input.Tex; output.ObjectID = ObjectID.x; return output; } //-------------------------------------------------------------------------------------- // Pixel Shader //-------------------------------------------------------------------------------------- PS_OUTPUT PS(PS_INPUT input) : SV_Target { PS_OUTPUT output = (PS_OUTPUT)0; output.oTarget0 = Texture0.Sample(SamplerLinear0, input.Tex); output.oTarget1 = input.ObjectID.x;//Texture0.Sample(SamplerLinear0, input.Tex); return output; }
各パスの描画後に後片付けをする必要がある。
後片付けしないとワーニングログが出る。
前にも同じようなことがあった気がするが・・・
D3D11: WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD ] D3D11: WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 0 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD ] D3D11: WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 1 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD ] D3D11: WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 1 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD ]
1パス目
ID3D11RenderTargetView* pView[2]; ... // 描画 ... pView[0] = NULL; pView[1] = NULL; g_dx_mgr.getDeviceContext()->OMSetRenderTargets( 2, pView, NULL ); ID3D11ShaderResourceView *const pSRV[1] = {NULL}; g_dx_mgr.getDeviceContext()->PSSetShaderResources(0, 1, pSRV);
2パス目
... // 描画 ... ID3D11ShaderResourceView *const pSRV[2] = {NULL, NULL}; g_dx_mgr.getDeviceContext()->PSSetShaderResources(0, 2, pSRV); ID3D11RenderTargetView* pView[1] = { NULL }; g_dx_mgr.getDeviceContext()->OMSetRenderTargets( 1, pView, NULL );