2016-02-24 7 views
0

Я новичок в API рендеринга, и до сих пор все в порядке. Я отлаживал некоторое время, чтобы понять это, и я просто не могу понять, почему это не работает. Поэтому мне нужна помощь.Почему я получаю информацию недоступную, никакие символы не загружены d3d11.dll Ошибка

Я считаю, что источник проблемы находится здесь.

m_VertexShader->Release(); 

Поскольку он не возвращает HRESULT, я не могу этого сделать.

Вот код.

#include "shader.h" 

    ShaderProgram::ShaderProgram(Renderer& renderer, const char* vertShader, const char* pixShader) 
    : m_Renderer(renderer), m_VertexShaderSource(vertShader), m_PixelShaderSource(pixShader) 
    { 
    Load(); 
    } 

    ShaderProgram::~ShaderProgram() 
    { 
    m_VertexShader->Release(); 
    m_PixelShader->Release(); 
    m_InputLayout->Release(); 
    } 

    void ShaderProgram::Load() 
    { 
    vector<char> vertSource = FileReader::read_file(m_VertexShaderSource); 
    vector<char> fragSource = FileReader::read_file(m_PixelShaderSource); 

    auto resultVert = m_Renderer.getDevice()->CreateVertexShader(vertSource.data(), vertSource.size(), nullptr, &m_VertexShader); 
    auto resultFrag = m_Renderer.getDevice()->CreatePixelShader(fragSource.data(), fragSource.size(), nullptr, &m_PixelShader); 

    if (resultVert != S_OK || resultFrag != S_OK) 
    { 
     MessageBox(nullptr, "Failed to create shader!", "Error", MB_OK); 
     exit(0); 
    } 

    D3D11_INPUT_ELEMENT_DESC layout[]{ 
     { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
     { "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } 
    }; 

    auto result = m_Renderer.getDevice()->CreateInputLayout(layout, 2, vertSource.data(), vertSource.size(), &m_InputLayout); 
    if (result != S_OK) 
    { 
     MessageBox(nullptr, "Could not create the input layout!", "Error", MB_OK); 
     exit(0); 
    } 

Это мой класс рендеринга. BTW Я только что добавил тестирование трафарета и глубины только сейчас, и это могло бы сделать что-то с этой проблемой.

#include "renderer.h" 

    Renderer::Renderer(Window& window) 
    { 
    createDevice(window); 
    createRenderTarget(); 
    createDepthStencil(); 
    } 

    Renderer::~Renderer() 
    { 
    m_SwapChain->Release(); 
    m_Device->Release(); 
    m_DeviceContex->Release(); 
    m_RenderTargetView->Release(); 
    m_DepthStencilView->Release(); 
    } 

    void Renderer::createDevice(Window& window) 
    { 
    DXGI_SWAP_CHAIN_DESC swapChain = { 0 }; 
    swapChain.BufferCount = 1; 
    swapChain.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
    swapChain.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
    swapChain.OutputWindow = window.getHandle(); 
    swapChain.SampleDesc.Count = 1; 
    swapChain.Windowed = true; 

    auto result = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 
     0, D3D11_SDK_VERSION, &swapChain, &m_SwapChain, &m_Device, nullptr, &m_DeviceContex); 

    if (result != S_OK) 
    { 
     MessageBox(nullptr, "Problem with creating DX11!", "Error", MB_OK); 
     exit(0); 
    } 
} 

    void Renderer::createDepthStencil() 
    { 
    D3D11_TEXTURE2D_DESC depthStencilDesc; 

    depthStencilDesc.Width = m_BackBuffer.Width; 
    depthStencilDesc.Height = m_BackBuffer.Height; 
    depthStencilDesc.MipLevels = 1; 
    depthStencilDesc.ArraySize = 1; 
    depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 
    depthStencilDesc.SampleDesc.Count = 1; 
    depthStencilDesc.SampleDesc.Quality = 0; 
    depthStencilDesc.Usage = D3D11_USAGE_DEFAULT; 
    depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; 
    depthStencilDesc.CPUAccessFlags = 0; 
    depthStencilDesc.MiscFlags = 0; 

    m_Device->CreateTexture2D(&depthStencilDesc, nullptr, &m_DepthStencilBuffer); 
    m_Device->CreateDepthStencilView(m_DepthStencilBuffer, nullptr, &m_DepthStencilView); 
    m_DepthStencilBuffer->Release(); 
} 

    void Renderer::createRenderTarget() 
    { 
    ID3D11Texture2D* backBuffer; 
    auto result = m_SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer); 
    if (result != S_OK) 
    { 
     MessageBox(nullptr, "Failed to get the swap chain buffer!", "Error", MB_OK); 
     exit(0); 
    } 
    m_Device->CreateRenderTargetView(backBuffer, nullptr, &m_RenderTargetView); 

    backBuffer->GetDesc(&m_BackBuffer); 
    backBuffer->Release(); 
    } 

    void Renderer::beginFrame() 
    { 
    m_DeviceContex->OMSetRenderTargets(1, &m_RenderTargetView, m_DepthStencilView); 

    auto viewport = CD3D11_VIEWPORT(0.0f, 0.0f, (float) m_BackBuffer.Width, (float) m_BackBuffer.Height); 
    viewport.MinDepth = 0.0f; 
    viewport.MaxDepth = 1.0f; 
    m_DeviceContex->RSSetViewports(1, &viewport); 

    float clearColor[] = { 0.25f, 0.75f, 0.8f, 1.0f }; 
    m_DeviceContex->ClearRenderTargetView(m_RenderTargetView, clearColor); 
    m_DeviceContex->ClearDepthStencilView(m_DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); 
    } 

//Swaps the buffer! 

    void Renderer::endFrame() 
    { 
     m_SwapChain->Present(1, 0); 
    } 

}

+0

Вы случайно пытаетесь отладить в режиме выпуска? – Brandon

+0

'' resultVert! = S_OK'' не является надежным. Вместо этого используйте '' FAILED (resultVert) ''. Здесь у вас есть несколько функций, которые возвращают значения HRESULT, которые вы игнорируете ('' CreateTexture2D'', '' CreateDepthStencilView'', '' CreateRenderTargetView'' и т. Д.). Вы должны проверить их всех на предмет сбоя. –

ответ

0

вы получите ту же ошибку, когда вы запустите его в режиме неотладочной ли? С ограниченной информацией, которую вы указали, похоже, что ваша таблица символов отладки не найдена. Если все это прекрасно и денди в режиме без отладки, то его просеять через документы, чтобы узнать, как загрузить таблицу символов. Не так много ответа, но надеюсь, что это может помочь немного.

0

Вы действительно должны перейти к использованию Microsoft::WRL::ComPtr. С исходными указателями вы, вероятно, будете звонить Release слишком мало или слишком много раз, что и произошло здесь. См. this page.

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

#include <wrl/client.h> 

using Microsoft::WRL::ComPtr; 

...

ComPtr<ID3D11Texture2D> depthStencil; 
m_Device->CreateTexture2D(&depthStencilDesc, nullptr, &depthStencil); 
m_Device->CreateDepthStencilView(depthStencil.Get(), nullptr, &m_DepthStencilView); 

Взгляните на Direct3D 11 игровых шаблонов Visual Studio, в частности, осуществление DeviceResources.h/DeviceResources.cpp.