2

GeForce GT 555m グラフィックス カードを搭載した Alienware ラップトップで実行する DirectX11 アプリケーションを作成したので、コンピュータがそれをサポートしていることはわかっています。

ラップトップが電源に接続されていない場合、警告なしに電源が切れるという奇妙なことに遭遇しましたが、電源に接続されている場合、アプリケーションは正常に動作します。

DirectX に付属のサンプルを含む他の DirectX11 アプリケーションでこれを複製しようとしましたが、私のアプリケーションはそれを行う唯一のものですが、サンプルと非常によく似たコードを使用しています。何かが欠けているに違いないのですが、何がわかりません。

これは、SwapChain と RenderTargetView をセットアップするための私のコードです

ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

if(vsync) {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = numerator;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = denominator;
}
else {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
}

swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hwnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;

if(fullscreen) {
    swapChainDesc.Windowed = false;
}
else {
    swapChainDesc.Windowed = true;
}

swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swapChainDesc.Flags = 0;

D3D_FEATURE_LEVEL featureLevels[4] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, };
if (FAILED(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, featureLevels, 4, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &featureLevel, &deviceContext))) {
    if (!device) {
        printf("Insanity Error: Failed To Create Direct3D Device\n");
    }
    if (!swapChain) {
        printf("Insanity Error: Failed To Create Swap Chain\n");
    }
    return false;
}
else {
    switch (featureLevel) {
    case D3D_FEATURE_LEVEL_11_0:
        printf("Insanity Info: Currently Using DirectX 11.0\n");
        break;
    case D3D_FEATURE_LEVEL_10_1:
        printf("Insanity Info: Currently Using DirectX 10.1\n");
        break;
    case D3D_FEATURE_LEVEL_10_0:
        printf("Insanity Info: Currently Using DirectX 10.0\n");
        break;
    case D3D_FEATURE_LEVEL_9_3:
        printf("Insanity Info: Currently Using DirectX 9.3\n");
        break;
    default:
        printf("Insanity Info: Graphics System Unknown\n");
        break;
    }
}
if (FAILED(swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr))) {
    printf("Insanity Error: Faield To Find Back Buffer\n");
    return false;
}
if (FAILED(device->CreateRenderTargetView(backBufferPtr, 0, &renderTargetView))) {
    printf("Insanity Error: Failed To Create Render View Target\n");
    return false;
}
backBufferPtr->Release();
backBufferPtr = 0;

そして、これは DepthStencilState と RasterState を設定するための私のコードです

    ZeroMemory(&depthStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
depthStencilDesc.DepthEnable = false;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilDesc.StencilEnable = true;
depthStencilDesc.StencilReadMask = 0xFF;
depthStencilDesc.StencilWriteMask = 0xFF;
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
if (FAILED(device->CreateDepthStencilState(&depthStencilDesc, &depthDisableStencilState))) {
    printf("Insanity Error: Failed To Create Depth State\n");
    return false;
}

deviceContext->OMSetDepthStencilState(depthEnableStencilState, 1);
this->enableDepthTesting = true;

ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
depthStencilViewDesc.Format = depthBufferDesc.Format;
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = 0;
if (FAILED(device->CreateDepthStencilView(depthStencilBuffer, &depthStencilViewDesc, &depthStencilView))) {
    printf("Insanity Error: Failed To Create Depth View\n");
    return false;
}

rasterDesc.AntialiasedLineEnable = false;
rasterDesc.CullMode = D3D11_CULL_NONE;
rasterDesc.DepthBias = 0;
rasterDesc.DepthBiasClamp = 0.0f;
rasterDesc.DepthClipEnable = true;
rasterDesc.FillMode = D3D11_FILL_SOLID;
rasterDesc.FrontCounterClockwise = false;
rasterDesc.MultisampleEnable = false;
rasterDesc.ScissorEnable = true;
rasterDesc.SlopeScaledDepthBias = 0.0f;

if (FAILED(device->CreateRasterizerState(&rasterDesc, &rasterState))) {
    printf("Insanity Error: Failed To Create Rasterizer State\n");
    return false;
}

deviceContext->RSSetState(rasterState);

何が起こっているのかについて何か考えがある場合は、助けてください!

4

1 に答える 1

0

ハードウェア デバイスの代わりに参照デバイスを使用してみて、問題が再発するかどうかを確認してください。これは、ドライバーをコードから分離するのに役立ちます。デバイスを作成するときは、代わりに を使用してくださいD3D_DRIVER_TYPE_REFERENCE

于 2013-07-01T22:11:55.007 に答える