2013-08-04 203 views
1

在下面的代码中,我尝试渲染一个球体到纹理(renderTargetView),该纹理应该渲染到四边形上的后端缓冲区。我正在试验它以后再用它来发光。现在的问题是球体渲染到后台缓冲区并且是可见的,即使我注释掉代码的下半部分,结果也不重要。我在这里使用了这种背景颜色D3DXCOLOR(0.4f,0.2f,0.0f),但这不是屏幕上的内容,它是使用back buffer devcon-> ClearRenderTargetView(backbuffer,D3DXCOLOR(0.0f,0.2f)设置的颜色,0.4f,1.0f));这是显示。Direct3D渲染错误纹理

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

而且渲染到-texture:

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

任何想法?

UPDATE

这个代码渲染到纹理,如果我注释掉之前执行..

 // 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); 
+0

这家伙有完全相同的问题,但他的解决方案似乎并没有解决我的问题。 [链接](http://www.gamedev.net/topic/627499-directx-11-render-to-texture-not-working/) –

回答

0

我之前曾与rendet问题质感,因为我必然着色器资源视图的质地究竟是什么渲染目标,这是被禁止的相同。如果您使用Visual Studio 2012,则应尝试在调试模式下检查您的代码。你不是和我犯同样的错误吗?

+0

您在考虑哪些代码行? –

+0

我更新了我的问题。 –

1

问题是混合没有启用。