Direct3D渲染到错误的纹理

时间:2013-08-04 22:22:49

标签: visual-c++ directx textures render direct3d

在下面的代码中,我尝试将球体渲染到纹理(renderTargetView),该纹理应该渲染到四边形上的后缓冲区。我正在试验它以后用于发光。现在的问题是球体被渲染到后面的缓冲区并且是可见的,如果我注释掉代码的下半部分,结果相同也没关系。我在这里使用这种背景颜色D3DXCOLOR(0.4f,0.2f,0.0f),但这不是屏幕上的内容,它是使用后置缓冲区设置的颜色 - > ClearRenderTargetView(后备缓冲区,D3DXCOLOR(0.0f,0.2) f,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);

2 个答案:

答案 0 :(得分:1)

问题在于未启用混合。

答案 1 :(得分:0)

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