bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

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 );