мой простой вид цели рендеринга не работает - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь создать еще один объект rendertargetview и сделать его

Раньше я просто возвращал буфер из swapchain и затем создавал из него rtv, все работает отлично. но только при создании RTV из пользовательского ресурса у меня есть проблема.

    D3D11_TEXTURE2D_DESC bb_desc;
    bb_desc.Width = width;
    bb_desc.Height = height;
    bb_desc.MipLevels = 1;
    bb_desc.ArraySize = 1;
    bb_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    bb_desc.Usage = D3D11_USAGE_DEFAULT;
    bb_desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
    bb_desc.CPUAccessFlags = 0;
    bb_desc.MiscFlags = 0;
    bb_desc.SampleDesc.Count = msCount;
    bb_desc.SampleDesc.Quality = msQuality;

    R_CHECK(device->CreateTexture2D(
        &bb_desc,
        nullptr,
        backBuffer.GetAddressOf()));

    D3D11_RENDER_TARGET_VIEW_DESC rtv_desc;
    rtv_desc.Format = bb_desc.Format;
    rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
    rtv_desc.Texture2D.MipSlice = 0;
    R_CHECK(device->CreateRenderTargetView(
        backBuffer.Get(),
        &rtv_desc,
        bbRTV.GetAddressOf()));

    D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
    srv_desc.Format = bb_desc.Format;
    srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    srv_desc.Texture2D.MostDetailedMip = 0;
    srv_desc.Texture2D.MipLevels = 1;
    R_CHECK(device->CreateShaderResourceView(
        backBuffer.Get(),
        &srv_desc,
        bbSRV.GetAddressOf()));

    dContext->OMSetRenderTargets(1, bbRTV.GetAddressOf(), nullptr);

и я отрисовываю это

    float bgColor[3] = { 1,0,0 };
    dContext->ClearRenderTargetView(bbRTV.Get(), bgColor);

    swapchain->Present(1, NULL);

ожидал красный экран, но он показывает только черный. а также нет журналов ошибок. Любой совет будет оценен ~

1 Ответ

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

Второй аргумент ClearRenderTargetView недействителен. Это должен быть указатель на первый элемент массива значений 4 float. Поскольку вы передаете указатель на первый элемент массива 3 float, происходит переполнение буфера значения, что приводит к неопределенному поведению.

Но самое главное, что при рендеринге в текстуру он не будет отображаться на экране при вызове Present, поскольку он не является буфером с обратной связью. Вы можете проверять текстуру с помощью отладчика DirectX.

...