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

1

问题是没有启用混合。

于 2013-08-05T11:47:30.737 回答
0

我之前在渲染到纹理时遇到过问题,因为我将着色器资源视图绑定到与渲染目标相同的纹理,这是被禁止的。如果您使用 Visual Studio 2012,您应该尝试在调试模式下检查您的代码。你不会和我犯同样的错误吗?

于 2013-08-04T22:43:18.780 回答