1

私はXNA出身で、rendertargetを簡単に作成して、単純な「Texture2D」として使用できました。ID3D11RenderTargetViewオブジェクトとID3D11ShaderResourceViewオブジェクトを作成しました。スプライトをレンダーターゲットに描画し、それをShaderResourceViewとして使用してシェーダーに送信します。

次のようにrendertargetのインターフェイスをクエリしてみました。

ID3D11ShaderResourceView *resource= NULL;
renderTargetobject->QueryInterface<ID3D11ShaderResourceView >(&resource);

上記のコードは、フレームごとにシェーダーに送信したい「リソース」オブジェクトに使用可能な値を生成しません(単純なリフレクションを実行しようとしています)。

4

1 に答える 1

7

OK、ついにそれを理解しました。XNAからコードを移植しようとするよりも、チュートリアルに従うほうがよいことがわかりました。フレームごとにrendertargetリソースをshaderresourceviewに「コピー」してこれを実行したかったのですが、レンダリング前に両方を設定した場合は、同じtexture2Dリソースにリンクするだけで、rendertargetはそのリンクされたテクスチャに自動的に書き込み、shaderresourceviewは呼び出されたときに自動的にそれを検索します。

したがって、誰かが気にかけている場合、コードは次のようになります。

//global declarations:
ID3D11Device*           g_pd3dDevice;
ID3D11DeviceContext*    g_pImmediateContext;

ID3D11Texture2D* refTex;
ID3D11RenderTargetView* refRen;
ID3D11ShaderResourceView* refRes;


void SetUp()
{
D3D11_TEXTURE2D_DESC textureDesc;
ZeroMemory(&textureDesc, sizeof(textureDesc));

textureDesc.Width = SCREENWIDTH;
textureDesc.Height = SCREENHEIGHT;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;

g_pd3dDevice->CreateTexture2D(&textureDesc, NULL, &refTex);



D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
renderTargetViewDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;

g_pd3dDevice->CreateRenderTargetView(refTex, &renderTargetViewDesc, &refRen);



D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
shaderResourceViewDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;


g_pd3dDevice->CreateShaderResourceView(refTex, &shaderResourceViewDesc, &refRes);
}

void DrawToTexture()
{
g_pImmediateContext->OMSetRenderTargets(1, &refRen,NULL);
float ClearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
g_pImmediateContext->ClearRenderTargetView(refRen, ClearColor);

//then draw what you want to the target


}
于 2012-11-11T08:55:14.157 に答える