Выпуск рендеринга в текстуру D3D11 - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь визуализировать текстуру в D3D11, но всякий раз, когда я это делаю, данные текстуры пусты и ничего не рисует. Я создаю и рендеринг в текстуру в следующей функции:

_TextureBufferDescription.Width = int( vecMax.x - vecMin.x );
_TextureBufferDescription.Height = int( vecMax.y - vecMin.y );
_TextureBufferDescription.MipLevels = 1;
_TextureBufferDescription.ArraySize = 1;
_TextureBufferDescription.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
_TextureBufferDescription.SampleDesc.Count = 1;
_TextureBufferDescription.SampleDesc.Quality = 0;
_TextureBufferDescription.Usage = D3D11_USAGE_DEFAULT;
_TextureBufferDescription.BindFlags = D3D11_BIND_RENDER_TARGET;
_TextureBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
_TextureBufferDescription.MiscFlags = 0;

_TextureDescription.Width = int( vecMax.x - vecMin.x );
_TextureDescription.Height = int( vecMax.y - vecMin.y );
_TextureDescription.MipLevels = 1;
_TextureDescription.ArraySize = 1;
_TextureDescription.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
_TextureDescription.SampleDesc.Count = 1;
_TextureDescription.SampleDesc.Quality = 0;
_TextureDescription.Usage = D3D11_USAGE_STAGING;
_TextureDescription.BindFlags = 0;
_TextureDescription.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
_TextureDescription.MiscFlags = 0;

_RenderTargetViewDescription.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
_RenderTargetViewDescription.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
_RenderTargetViewDescription.Texture2D.MipSlice = 0;

_Drawing.pDevice->CreateTexture2D( &_TextureBufferDescription, nullptr, &pRenderedTextureBuffer );
_Drawing.pDevice->CreateTexture2D( &_TextureDescription, nullptr, &pRenderedTexture );
_Drawing.pDevice->CreateRenderTargetView( pRenderedTextureBuffer, &_RenderTargetViewDescription, &pNewRenderTarget );
_Drawing.pContext->OMSetRenderTargets( 1, &pNewRenderTarget, _Drawing.pDepthStencilView );
_Drawing.pContext->ClearRenderTargetView( pNewRenderTarget, D3DXCOLOR( 0.f, 0.f, 0.f, 0.f ) );
Draw( );
_Drawing.pContext->OMSetRenderTargets( 1, &_Drawing.pRenderTargetView, _Drawing.pDepthStencilView );
_Drawing.pContext->CopyResource( pRenderedTexture, pRenderedTextureBuffer );
pNewRenderTarget->Release( );

return pRenderedTexture;

Функция рисования определяется следующим образом:

auto uStride = sizeof( vertex_t ), uOffset = 0u;

_Drawing.pContext->PSSetShader( pTexture == nullptr ? _Drawing.pStandardPixelShader : _Drawing.pTexturedPixelShader, nullptr, 0 );
_Drawing.pContext->PSSetShaderResources( 0, 1, &pTexture );
_Drawing.pContext->IASetIndexBuffer( pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
_Drawing.pContext->IASetVertexBuffers( 0, 1, &pVertexBuffer, &uStride, &uOffset );
_Drawing.pContext->IASetPrimitiveTopology( _Topology );
_Drawing.pContext->DrawIndexed( vecIndices.size( ), 0, 0 );

Все функции возвращают S_OK, поэтому ни одна из них, похоже, не работает. Все, что создано, не является nullptr. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 мая 2019

Я не совсем уверен, но мне просто интересно, вам не нужны никакие промежуточные ресурсы или установленный здесь CPUaccessFlag, поскольку вы не читаете из CPU.

и я думаю, что pTexture, которую вы передали шейдеру, должна быть srv, а не ресурсом.

и было бы полезно, если бы я мог видеть код шейдера. я предполагаю, что вы определили переменную текстуры с типом Texture2D , который должен быть.

...