我正在尝试学习Directx 11.0。 我遇到了一个错误。 这是代码。

// include the basic windows header files and the Direct3D header files
#include <windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>

// include the Direct3D Library file
#pragma comment (lib, "d3d11.lib")
#pragma comment (lib, "d3dx11.lib")
#pragma comment (lib, "d3dx10.lib")

// define the screen resolution
#define SCREEN_WIDTH  800
#define SCREEN_HEIGHT 600

// global declarations
IDXGISwapChain *swapchain = NULL;             // the pointer to the swap chain interface
ID3D11Device *dev = NULL;                     // the pointer to our Direct3D device interface
ID3D11DeviceContext *devcon = NULL;           // the pointer to our Direct3D device context
ID3D11RenderTargetView *backbuffer = NULL;    // the pointer to our back buffer
ID3D11InputLayout *pLayout = NULL;            // the pointer to the input layout
ID3D11VertexShader *pVS = NULL;               // the pointer to the vertex shader
ID3D11PixelShader *pPS = NULL;                // the pointer to the pixel shader
ID3D11Buffer *pVBuffer = NULL;                // the pointer to the vertex buffer
ID3D11Buffer *pIBuffer = NULL;                // the pointer to the index buffer
ID3D11DepthStencilView *pDView = NULL;        // the pointer to depth stencil view
ID3D11Texture2D *pDStencil = NULL;            // the pointer to depth stencil

// a struct to define a single vertex
struct VERTEX{FLOAT X, Y, Z; D3DXCOLOR Color;};

// function prototypes
void InitD3D(HWND hWnd);    // sets up and initializes Direct3D
void RenderFrame(void);     // renders a single frame
void CleanD3D(void);        // closes Direct3D and releases memory
void InitGraphics(void);    // creates the shape to render
void InitPipeline(void);    // loads and prepares the shaders

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "WindowClass";

    RegisterClassEx(&wc);

    RECT wr = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};
    AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);

    hWnd = CreateWindowEx(NULL,
                          "WindowClass",
                          "Our First Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          wr.right - wr.left,
                          wr.bottom - wr.top,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D
    InitD3D(hWnd);

    // enter the main loop:

    MSG msg;

    while(TRUE)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);

            if(msg.message == WM_QUIT)
                break;
        }

        RenderFrame();
    }

    // clean up DirectX and COM
    CleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use
void InitD3D(HWND hWnd)
{
    // 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,
                                  D3D11_CREATE_DEVICE_DEBUG,
                                  NULL,
                                  NULL,
                                  D3D11_SDK_VERSION,
                                  &scd,
                                  &swapchain,
                                  &dev,
                                  NULL,
                                  &devcon);


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

    //Create depth stencil buffer
    D3D11_TEXTURE2D_DESC descDepth;
    descDepth.Width = SCREEN_WIDTH;
    descDepth.Height = SCREEN_HEIGHT;
    descDepth.MipLevels = 1;
    descDepth.ArraySize = 1;
    descDepth.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    descDepth.SampleDesc.Count = 4;
    descDepth.SampleDesc.Quality = 0;
    descDepth.Usage = D3D11_USAGE_DYNAMIC;
    descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
    descDepth.CPUAccessFlags = 0;
    descDepth.MiscFlags = 0;

    dev->CreateTexture2D( &descDepth, NULL, &pDStencil );

    // Create the depth stencil view
    D3D11_DEPTH_STENCIL_VIEW_DESC descDSV;
    descDSV.Format = descDepth.Format;
    descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
    descDSV.Texture2DMS.UnusedField_NothingToDefine = 0;

    dev->CreateDepthStencilView( pDStencil, &descDSV, &pDView );

    // set the render target as the back buffer
    devcon->OMSetRenderTargets(1, &backbuffer, pDView);

    // Set the viewport
    D3D11_VIEWPORT viewport;
    ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

    viewport.TopLeftX = 0;
    viewport.TopLeftY = 0;
    viewport.Width = SCREEN_WIDTH;
    viewport.Height = SCREEN_HEIGHT;
    viewport.MinDepth = 0.0f;
    viewport.MaxDepth = 1.0f;

    devcon->RSSetViewports(1, &viewport);

    InitPipeline();
    InitGraphics();
}


// this is the function used to render a single frame
void RenderFrame(void)
{
    // clear the back buffer to a deep blue
    devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));

    //clear the depth stencil view
    devcon->ClearDepthStencilView(pDView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);

        // select which vertex buffer to display
        UINT stride = sizeof(VERTEX);
        UINT offset = 0;
        devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);

        //set index buffer
        devcon->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R32_UINT, 0);

        // select which primtive type we are using
        devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

        // draw the vertex buffer to the back buffer
        devcon->DrawIndexed(9, 0, 0);

    // switch the back buffer and the front buffer
    swapchain->Present(0, 0);
}


// this is the function that cleans up Direct3D and COM
void CleanD3D(void)
{
    swapchain->SetFullscreenState(FALSE, NULL);    // switch to windowed mode

    // close and release all existing COM objects
    if(pLayout)pLayout->Release();
    if(pVS)pVS->Release();
    if(pPS)pPS->Release();
    if(pVBuffer)pVBuffer->Release();
    if(pIBuffer)pIBuffer->Release();
    if(swapchain)swapchain->Release();
    if(backbuffer)backbuffer->Release();
    if(dev)dev->Release();
    if(devcon)devcon->Release();
    if(pDStencil)pDStencil->Release();
    if(pDView)pDView->Release();
}


// this is the function that creates the shape to render
void InitGraphics()
{
    // create a triangle using the VERTEX struct
    VERTEX Vertices[] =
    {
        {-0.5f, 0.5f, 1.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
        {0.5f, 0.5f, 1.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
        {0.5f, -0.5f, 1.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
        {-0.5f, -0.5f, 1.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
        {0.75f, 0.75f, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
        {0.75f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
        {0.0f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
    };

    DWORD Indices[]=
    {
        0,2,3,
        4,5,6,
    };

    // create the vertex buffer
    D3D11_BUFFER_DESC bd,id;
    ZeroMemory(&bd, sizeof(bd));
    ZeroMemory(&id, sizeof(id));

    bd.Usage = D3D11_USAGE_DYNAMIC;                // write access access by CPU and GPU
    bd.ByteWidth = sizeof(VERTEX) * 7;             // size is the VERTEX struct * 4
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;       // use as a vertex buffer
    bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;    // allow CPU to write in buffer

    id.Usage = D3D11_USAGE_DYNAMIC;                // write access access by CPU and GPU
    id.ByteWidth = sizeof(DWORD) * 3*3;             // size is the DWORD struct * 2 * 3
    id.BindFlags = D3D11_BIND_INDEX_BUFFER;       // use as a index buffer
    id.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;    // allow CPU to write in buffer

    dev->CreateBuffer(&bd, NULL, &pVBuffer);       // create the buffer
    dev->CreateBuffer(&id, NULL, &pIBuffer);

    // copy the vertices into the buffer
    D3D11_MAPPED_SUBRESOURCE ms;
    devcon->Map(pVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);    // map the buffer
    memcpy(ms.pData, Vertices, sizeof(Vertices));                       // copy the data
    devcon->Unmap(pVBuffer, NULL);                                      // unmap the buffer

     // copy the indices into the buffer
    D3D11_MAPPED_SUBRESOURCE ims;
    devcon->Map(pIBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ims);    // map the buffer
    memcpy(ims.pData, Indices, sizeof(Indices));                       // copy the data
    devcon->Unmap(pIBuffer, NULL);                                      // unmap the buffer
}


// this function loads and prepares the shaders
void InitPipeline()
{
    // load and compile the two shaders
    ID3D10Blob *VS, *PS;
    D3DX11CompileFromFile("shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0);
    D3DX11CompileFromFile("shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);

    // encapsulate both shaders into shader objects
    dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
    dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);

    // set the shader objects
    devcon->VSSetShader(pVS, 0, 0);
    devcon->PSSetShader(pPS, 0, 0);

    // create the input layout object
    D3D11_INPUT_ELEMENT_DESC ied[] =
    {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
    };

    dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout);
    devcon->IASetInputLayout(pLayout);
}

Debug告诉我程序在CreateDepthStencilView函数上失败,原因是“第一个参数已损坏或为空”。

实际上,CreateTexture2D使我的Texture2D COM对象为NULL,这是造成所有麻烦的原因。

有人可以帮我解释为什么会这样吗?

请参阅InitD3D()。 存在上述两个功能。

===============>>#1 票数:2

如果针对调试DirectX库编译应用程序,当Texture2D无法创建时,您将收到更详细的错误消息。 可能其中一个参数无效。

将DirectX 10/11调试输出捕获到Visual Studio

===============>>#2 票数:1

我知道了! 在Depth Stencil View的描述下,必须设置Flags字段。

descDSV.Flags = 0;            //0 for it 'not' being read only

谢谢你的时间,伙计们!

  ask by Cheeku translate from so

未解决问题?本站智能推荐:

1回复

漫反射纹理CreateTexture2D失败?

我将2d漫反射纹理加载到内存中,并希望从中创建dx11纹理。 它不需要更改,因此我将其设置为不变的。 我不明白为什么它会从CreateTexture2D调用中导致错误的结果。 例如,我有一个128x128 R8B8G8A8纹理,它抛出了不好的结果。 有什么想法吗?
1回复

为什么ID3D11Device :: CreateInputLayout失败并显示E_INVALIDARG?

我正在使用DirectX11用C ++编写程序。 现在,我想从着色器开始,为此,我还需要ID3D11InputLayout。 因为我想给以后使用的选择。 我有两个传递给VertexShader的顶点结构: 而且不,我正在创建ID3D11InputLayouts,如下所示:
1回复

如何获取d3d_aware的IMFTransform(将Windows Duplicating API的输入编码为H264)?

下一个代码应提供inputInfo和outputInfo配置以获取IMFTransform,并且此IMFTransform用于将ID3D11Texture2D(格式为DXGI_FORMAT_B8G8R8A8_UNORM)编码为H264 我了解DXGI_FORMAT_B8G8R8A8_UNO
1回复

D3DApp类问题

因此,我正在D3DApp类中包含的方法中创建WNDCLASSEX,我将通过另一个类(例如,Engine,Game等)来调用该类,该类称为InitMainWindow(在基类中也受保护): 我的WNDPROC回调声明和定义在InitMainWindow()所在的同一D3DApp基类内,定义
2回复

具有初始数据的DirectX 11 ID3DDevice :: CreateTexture2D失败

只要我遵循了一个教程,即CreateTexture2D()初始数据为NULL,然后使用UpdateSubresource()加载数据,一切正常。 但是UpdateSubResource()是设备上下文函数,因此我尝试一次将CreateTexture2D()与初始数据一起使用,但是失败。
2回复

D3D11 CreateTexture2D为32位格式

令人惊讶的是,即使我可以肯定这是一个基本问题,我也无法在该主题上找到任何帮助。 因此,也许有人可以帮助我取得进展。 我正在尝试创建d3d11纹理,单通道,每个像素32位。 官方文档很有趣( http://msdn.microsoft.com/zh-cn/library/windows/
1回复

DirectX11如何从未签名的char *数据创建Texture2D

我有一个功能GetCamImage,它从相机返回图像为: 我需要从此数据创建ID3D11Texture2D。 如何在DirectX 11中做到这一点? 谢谢
1回复

ID3D11VideoDevice :: CreateVideoDecoderOutputView失败

我正在开发一个能够通过DrectX11的ID3D11VideoDecoder接口解码H264流的应用程序( https://msdn.microsoft.com/zh-cn/library/windows/desktop/hh447766(v=vs.85).aspx ),我得到了卡在ID3D11
1回复

D3D11CreateDevice()返回垃圾值并失败

我刚开始用DirectX11的3D游戏编程学习直接3D。 我按照第一个教程得到了一个MessageBox,说“D3D11CreateDevice失败”。 我检查了此函数的返回值,并得到了-2005270483的垃圾值。 十六进制值为0x887a002d ,人们说这是DXGI_ERR
1回复

在rastertek教程中初始化Direct3D失败

因此,我已经开始熟悉C ++语言和DirectX11。主要是因为有大量可供学习的资源。 可以在这里找到该教程http://www.rastertek.com/dx11tut03.html 问题是DirectX 11 Visual Studio 2010程序不能真正起作用,初始化过程返