1

以下のコードでは、球体をテクスチャ (renderTargetView) にレンダリングしようとしています。そのテクスチャは、クワッドのバック バッファにレンダリングされるはずです。後でグローで使用するために実験しています。現在の問題は、球体がバック バッファーにレンダリングされて表示されることです。コードの下半分をコメント アウトしても問題ありません。結果は同じです。ここではこの背景色 D3DXCOLOR(0.4f, 0.2f, 0.0f) を使用していますが、それは画面上にあるものではなく、バック バッファー devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f) で設定された色です。 、0.4f、1.0f)); それが示しています。

        // Set and clear render target
        devcon->OMSetRenderTargets(1, &renderTargetView, zbuffer);
        devcon->ClearRenderTargetView(renderTargetView, D3DXCOLOR(0.4f, 0.2f, 0.0f, 1.0f));

        devcon->PSSetShaderResources(0, 1, &pTextureSun);
        devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
        devcon->Draw(sizeOfVertexVector, 0);

        // set the shader objects
        /*
        devcon->VSSetShader(pVS_glow, 0, 0);
        devcon->PSSetShader(pPS_glow, 0, 0);

        // set the render target as the back buffer
        devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);

        devcon->IASetVertexBuffers(0, 1, &pVBufferQuad, &stride, &offset);
        devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
        devcon->PSSetShaderResources(0, 1, &shaderResourceView);
        devcon->Draw(6, 0);*/

バック バッファとデプス バッファを設定する場所は次のとおりです (デプス バッファ用に DXGI_FORMAT_D24_UNORM_S8_UINT などのさまざまな形式を試してみましたが、うまくいきませんでした)。

// create a struct to hold information about the swap chain
DXGI_SWAP_CHAIN_DESC scd;

// clear out the struct for use
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

// fill the swap chain description struct
scd.BufferCount = 1;                                   // one back buffer
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;    // use 32-bit color
scd.BufferDesc.Width = SCREEN_WIDTH;                   // set the back buffer width
scd.BufferDesc.Height = SCREEN_HEIGHT;                 // set the back buffer height
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;     // how swap chain is to be used
scd.OutputWindow = hWnd;                               // the window to be used
scd.SampleDesc.Count = 4;                              // how many multisamples
scd.Windowed = TRUE;                                   // windowed/full-screen mode
scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;    // allow full-screen switching

// create a device, device context and swap chain using the information in the scd struct
D3D11CreateDeviceAndSwapChain(NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    NULL,
    NULL,
    NULL,
    D3D11_SDK_VERSION,
    &scd,
    &swapchain,
    &dev,
    NULL,
    &devcon);


// create the depth buffer texture
D3D11_TEXTURE2D_DESC texd;
ZeroMemory(&texd, sizeof(texd));

texd.Width = SCREEN_WIDTH;
texd.Height = SCREEN_HEIGHT;
texd.ArraySize = 1;
texd.MipLevels = 1;
texd.SampleDesc.Count = 4;
texd.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
texd.BindFlags = D3D11_BIND_DEPTH_STENCIL;

ID3D11Texture2D *pDepthBuffer;
dev->CreateTexture2D(&texd, NULL, &pDepthBuffer);

// create the depth buffer
D3D11_DEPTH_STENCIL_VIEW_DESC dsvd;
ZeroMemory(&dsvd, sizeof(dsvd));

dsvd.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
dsvd.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;

dev->CreateDepthStencilView(pDepthBuffer, &dsvd, &zbuffer);
pDepthBuffer->Release();

// get the address of the back buffer
ID3D11Texture2D *pBackBuffer;
swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);

// use the back buffer address to create the render target
dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
pBackBuffer->Release();

// set the render target as the back buffer
devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);


// Set the viewport
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

viewport.TopLeftX = 0;    // set the left to 0
viewport.TopLeftY = 0;    // set the top to 0
viewport.Width = SCREEN_WIDTH;    // set the width to the window's width
viewport.Height = SCREEN_HEIGHT;    // set the height to the window's height
viewport.MinDepth = 0;    // the closest an object can be on the depth buffer is 0.0
viewport.MaxDepth = 1;    // the farthest an object can be on the depth buffer is 1.0

devcon->RSSetViewports(1, &viewport);

そして、テクスチャへのレンダリング:

D3D11_TEXTURE2D_DESC textureDesc;
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;

// Initialize the render target texture description.
ZeroMemory(&textureDesc, sizeof(textureDesc));

// Setup the render target texture description.
textureDesc.Width = SCREEN_WIDTH;
textureDesc.Height = SCREEN_HEIGHT;
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;

dev->CreateTexture2D(&textureDesc, NULL, &renderTargetTexture);

// Setup the description of the render target view.
renderTargetViewDesc.Format = textureDesc.Format;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;

dev->CreateRenderTargetView(renderTargetTexture, &renderTargetViewDesc, &renderTargetView);

// Setup the description of the shader resource view.
shaderResourceViewDesc.Format = textureDesc.Format;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;

// Create the shader resource view.
dev->CreateShaderResourceView(renderTargetTexture, &shaderResourceViewDesc, &shaderResourceView);

何か案は?

アップデート

このコードは、コメントアウトすると、テクスチャにレンダリングする前に実行されます..

        // set the render target as the back buffer
        devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);
        cBuffer.doBlur = 0;
        devcon->PSSetShaderResources(0, 1, &pTextureEarth);
        devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
        devcon->Draw(sizeOfVertexVector, 0);

...これはテクスチャにレンダリングされるようになりました。現在、球体ではなく、テクスチャの背景色のみが表示されます。

        // Set and clear render target
        devcon->OMSetRenderTargets(1, &renderTargetView, zbuffer);
        devcon->ClearRenderTargetView(renderTargetView, D3DXCOLOR(0.4f, 0.2f, 0.0f, 0.3f));

        devcon->PSSetShaderResources(0, 1, &pTextureSun);
        devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
        devcon->Draw(sizeOfVertexVector, 0);

        // set the shader objects
        devcon->IASetInputLayout(pLayoutGlow);
        devcon->VSSetShader(pVS_glow, 0, 0);
        devcon->PSSetShader(pPS_glow, 0, 0);

        // set the render target as the back buffer
        devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);

        devcon->IASetVertexBuffers(0, 1, &pVBufferQuad, &stride, &offset);
        devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
        devcon->PSSetShaderResources(0, 1, &shaderResourceView);
        devcon->Draw(6, 0);
4

2 に答える 2

0

以前、シェーダー リソース ビューをレンダー ターゲットと同じテクスチャにバインドしたため、テクスチャへのレンデットで問題が発生しましたが、これは禁止されています。Visual Studio 2012 を使用している場合は、デバッグ モードでコードをチェックしてみてください。私と同じ間違いをしていませんか?

于 2013-08-04T22:43:18.780 に答える