Du bist nicht angemeldet.

Werbeanzeige

1

07.05.2014, 12:34

DirectX 11 Grauer Bildschirm

Hey Leute!

Ich bin mal wieder am Direct3D üben, und ich wollte jetzt meine einzige Klasse auf ein paar mehr aufteilen, auch aufgrund der neuen Möglichkeiten. Nun ja, es funktioniert nicht. :dash:

Der ganze Code debuggt ohne Probleme, aber wenn ich dann eigentlich einen Boden und einen Lichtfleck sehen müsste, sehe ich auf einmal die Maus und einen grau-Schwarzen Bildschirm. Ich werde unten die InitDirect3D und die InitDirect2D Funktion anhängen... Und das ganze Projekt hochladen.

Wenn jemand so nett wäre, sich meiner anzunehmen und sich den Code anzusehen wäre ich ihm sehr verbunden. :thumbsup:

MFG
FERNman

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
bool CGame::InitDirect3D()
{
    //Buffer der Swapchain
    DXGI_MODE_DESC BufferDesc;
    ZeroMemory(&BufferDesc, sizeof(BufferDesc));

    BufferDesc.Width = ResX;
    BufferDesc.Height = ResY;
    BufferDesc.RefreshRate.Numerator = 60;
    BufferDesc.RefreshRate.Denominator = 1;
    BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    //

    //Swapchain
    DXGI_SWAP_CHAIN_DESC SwapChainDesc;
    ZeroMemory(&SwapChainDesc, sizeof(SwapChainDesc));

    SwapChainDesc.BufferDesc = BufferDesc;
    SwapChainDesc.SampleDesc.Count = 1;
    SwapChainDesc.SampleDesc.Quality = 0;
    SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    SwapChainDesc.BufferCount = 1;
    SwapChainDesc.OutputWindow = hWnd;
    SwapChainDesc.Windowed = true;
    SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    //

    //DXGI Factory
    IDXGIFactory1* DXGIFactory;

    hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&DXGIFactory);

    IDXGIAdapter1* Adapter;

    hr = DXGIFactory->EnumAdapters1(0, &Adapter);

    DXGIFactory->Release();

    //Swap Chain Erstellen
    hr = D3D11CreateDeviceAndSwapChain(Adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, D3D11_CREATE_DEVICE_BGRA_SUPPORT, NULL, NULL, D3D11_SDK_VERSION, &SwapChainDesc, &SwapChain, &D3D11Device, NULL, &D3D11DevCon);
    //

    //2D
    InitDirect2D(Adapter);
    //

    Adapter->Release();

    hr = SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer11);
    hr = D3D11Device->CreateRenderTargetView(BackBuffer11, NULL, &RenderTargetView);
    //

    //Depth/Stencil Buffer
    D3D11_TEXTURE2D_DESC DepthStencilDesc;
    ZeroMemory(&DepthStencilDesc, sizeof(DepthStencilDesc));

    DepthStencilDesc.Width = ResX;
    DepthStencilDesc.Height = ResY;
    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;

    D3D11Device->CreateTexture2D(&DepthStencilDesc, NULL, &DepthStencilBuffer);
    D3D11Device->CreateDepthStencilView(DepthStencilBuffer, NULL, &DepthStencilView);
    //

    return true;

}

bool CGame::InitDirect2D(IDXGIAdapter1* Adapter)
{
    //Create our Direc3D 10.1 Device///////////////////////////////////////////////////////////////////////////////////////
    hr = D3D10CreateDevice1(Adapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, D3D10_CREATE_DEVICE_BGRA_SUPPORT,
        D3D10_FEATURE_LEVEL_9_3, D3D10_1_SDK_VERSION, &D3D101Device);

    //Create Shared Texture that Direct3D 10.1 will render on//////////////////////////////////////////////////////////////
    D3D11_TEXTURE2D_DESC sharedTexDesc;

    ZeroMemory(&sharedTexDesc, sizeof(sharedTexDesc));

    sharedTexDesc.Width = ResX;
    sharedTexDesc.Height = ResY;
    sharedTexDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    sharedTexDesc.MipLevels = 1;
    sharedTexDesc.ArraySize = 1;
    sharedTexDesc.SampleDesc.Count = 1;
    sharedTexDesc.Usage = D3D11_USAGE_DEFAULT;
    sharedTexDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
    sharedTexDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;

    hr = D3D11Device->CreateTexture2D(&sharedTexDesc, NULL, &SharedTex11);

    // Get the keyed mutex for the shared texture (for D3D11)///////////////////////////////////////////////////////////////
    hr = SharedTex11->QueryInterface(__uuidof(IDXGIKeyedMutex), (void**)&KeyedMutex11);

    // Get the shared handle needed to open the shared texture in D3D10.1///////////////////////////////////////////////////
    IDXGIResource *sharedResource10;
    HANDLE sharedHandle10;

    hr = SharedTex11->QueryInterface(__uuidof(IDXGIResource), (void**)&sharedResource10);

    hr = sharedResource10->GetSharedHandle(&sharedHandle10);

    sharedResource10->Release();

    // Open the surface for the shared texture in D3D10.1///////////////////////////////////////////////////////////////////
    IDXGISurface1 *sharedSurface10;

    hr = D3D101Device->OpenSharedResource(sharedHandle10, __uuidof(IDXGISurface1), (void**)(&sharedSurface10));

    hr = sharedSurface10->QueryInterface(__uuidof(IDXGIKeyedMutex), (void**)&KeyedMutex10);

    // Create D2D factory///////////////////////////////////////////////////////////////////////////////////////////////////
    ID2D1Factory *D2DFactory;
    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory), (void**)&D2DFactory);

    D2D1_RENDER_TARGET_PROPERTIES renderTargetProperties;

    ZeroMemory(&renderTargetProperties, sizeof(renderTargetProperties));

    renderTargetProperties.type = D2D1_RENDER_TARGET_TYPE_HARDWARE;
    renderTargetProperties.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED);

    hr = D2DFactory->CreateDxgiSurfaceRenderTarget(sharedSurface10, &renderTargetProperties, &D2DRenderTarget);

    sharedSurface10->Release();
    D2DFactory->Release();

    // Create a solid color brush to draw something wit
    hr = D2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(1.0f, 1.0f, 1.0f, 1.0f), &Brush);

    //DirectWrite///////////////////////////////////////////////////////////////////////////////////////////////////////////
    hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory),
        reinterpret_cast<IUnknown**>(&DWriteFactory));

    hr = DWriteFactory->CreateTextFormat(
        L"Script",
        NULL,
        DWRITE_FONT_WEIGHT_REGULAR,
        DWRITE_FONT_STYLE_NORMAL,
        DWRITE_FONT_STRETCH_NORMAL,
        24.0f,
        L"en-us",
        &TextFormat
        );

    hr = TextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING);
    hr = TextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR);

    D3D101Device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_POINTLIST);
    return true;
}



Und der Konstruktor:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CGame::CGame(HINSTANCE hInstance, int ShowWnd)
:ResX(1920),
ResY(1080)
{
    //Initialize Variables
    hInst = hInstance;
    WndClassName = L"Boxhead 3D";
    
    NumElements = ARRAYSIZE(Layout);
    //

    //Initialize Funktions
    if (!InitWindow(ShowWnd))
    {
        MessageBox(NULL, L"Fehler beim erstellen des Fensters", L"Fehler", MB_OK);
        exit(0);
    }

    if (!InitDirect3D())
    {
        MessageBox(NULL, L"Fehler beim Initialisieren von Direct3D", L"Fehler", MB_OK);
        exit(0);
    }

    if (!InitScene())
    {
        MessageBox(NULL, L"Fehler beim Initialisieren der Gegenstände", L"Fehler", MB_OK);
        exit(0);
    }

    if (!InitInput())
    {
        MessageBox(NULL, L"Fehler beim Initalisieren der Eingabegeräte", L"Fehler", MB_OK);
        exit(0);
    }
    //

    Run();

}


Und zu guter Letzt, das ganze Projekt als Download: Neuer Download

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FERNman« (07.05.2014, 14:44)


2

07.05.2014, 14:05

Ich glaube, dass kaum jemand das Projekt herunterladen wird, wenn man dazu bei 4shared einen Account benötigt, oder sich mit einem seiner sozialen Netzwerke registrieren muss.. :/

Anhand der Init Methoden allein kann man wenig aufschluss über das Problem bekommen. Spuckt d3d im debug irgendwas aus? Hast du mal die return values der einzelnen Aufrufe der Methoden geprüft? Wann tritt der Fehler auf: Wenn du auf dein 2D target oder dein 3d Target zeichnest? Wie sieht dein shader aus?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

3

07.05.2014, 14:43

Danke für den Hinweis! Ich wusste nicht, dass man einen Account braucht.

Neuer Download

Und zu deiner Eigentlichen Antwort: Debug hat nicht sehr viel gebracht, bin jetzt alles schon mehrmals durch. Und auch die Returns sind meiner Meinung nach ok (Bin aber noch 3D Anfänger).
Aber ich bekomme ja auch keinen Fehler, sondern es geht einfach nicht. Ich nehme an, dass irgendetwas bei der Initialisierung falsch läuft, deswegen habe ich diese Funktionen auch gepostet. Shader dürfte ok sein, den habe ich ja komplett aus dem anderen Projekt übernommen (Verbesserungsvorschläge erwünscht!)

MFG
FERNman

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FERNman« (07.05.2014, 15:24)


4

07.05.2014, 15:17

Die Fehler werden nicht automatisch von DX ausgegeben, solange du es dem DX nicht sagst. Fang am besten die Fehler mit FAILED() ab und evaluiere dann den Error code (http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx)

Wenn du den shader komplett aus einem anderen Programm übernommen hast, heißt das noch nicht, dass du ihn richtig fütterst.

Wenn ich zeit hab, schau ich mir deinen code mal genauer an.

Edit: Deine download Link hat einen <br /> zu viel drin ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

5

07.05.2014, 15:22

In meiner Frage stimmt er aber ;-) (Der Link)

Und wo muss ich das Failed dann hinpacken, hört sich toll an, hab aber noch nie was davon gehört und auch auf Google nichts gefunden :huh:

Fireball

Alter Hase

Beiträge: 421

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

6

07.05.2014, 15:38

Hallo,

übergib mal ein null für den Adapter, da du diesen nicht vom User auswählen lässt kannst du den auch null lassen.

C-/C++-Quelltext

1
2
    //Swap Chain Erstellen
    hr = D3D11CreateDeviceAndSwapChain(null, D3D_DRIVER_TYPE_UNKNOWN, NULL, D3D11_CREATE_DEVICE_BGRA_SUPPORT, NULL, NULL, D3D11_SDK_VERSION, &SwapChainDesc, &SwapChain, &D3D11Device, NULL, &D3D11DevCon);


Mir ist auch auf gefallen, dass du HRESULT immer schön in einer Variable hr sicherst. Aber nirgends prüfst du auch, ob diese S_OK ist. Ich rate hier das folgende Macro zu verwenden:

C-/C++-Quelltext

1
#define FAILED(hr) (((HRESULT)(hr)) < 0) //Winerror.h


Also immer dann wenn du mit deiner ID3D11Device Instanz ein COM Objekt erzeugst solltest du prüfen ob das auch geklappt hat.

Hier würde ich also mit der Suche beginnen. Danach würde ich mir die ID3D11DeviceContext Instanz vornehmen.

EDIT: Shader usw. würde ich erstmal alles beiseite schieben, dass muss erstmal funktionieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
...

float color[4];

    color[0] = 0.9f;
    color[1] = 0.2f;
    color[2] = 0.3f;
    color[3] = 1.0f;

    m_deviceContext->ClearRenderTargetView(m_renderTargetView, color);
    
    m_deviceContext->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);





Schöne Grüße

Fb

7

07.05.2014, 15:49

Falls das Ergebnis dieses Codes ein Rosa Fenster sein soll, dann geht es ! :thumbsup: :thumbup:

Aber was ist dann falsch an meiner Draw Funktion :(

Edit: Und wieso sieht man meine Maus?!

Edit 2: Ich habe das Macro jetzt in meinem Code drinnen, aber wie merke ich wenn etwas falsch läuft? Muss ich mir das selber schreiben (Überprüfen ob das falsch ist) oder kommt dann von selbst eine Meldung?

MFG
FERNman

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FERNman« (07.05.2014, 16:00)


8

07.05.2014, 16:01

Wenn ich mir deine Render Funktion ansehe frage ich mich, wo denn nun gedrawt werden soll?

Edit:

Zitat

Edit 2: Ich habe das Macro jetzt in meinem Code drinnen, aber wie merke ich wenn etwas falsch läuft? Muss ich mir das selber schreiben (Überprüfen ob das falsch ist) oder kommt dann von selbst eine Meldung?


Das Makro FAILED überprüft nur und gibt true oder false "zurück". (In Anführungszeichen, weil es nicht wirklich zurückgibt...)
Du kannst das ganze nutzen, indem du irgend ein Makro schreibst, z.B. (ich habs mal aus meinen codes kopiert und etwas abgewandelt):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Error Output handler:
void MyErrorHandler(const char* expr, unsigned int line = 0; const char* func = "?")
{
    char* pOut = new char[500];
    sprintf_s(pOut, 500, "Error in expression %s\nLine: %d\nFunction: %s", expr, line, func);
    MessageBoxA(0, pOut, "Error", MB_ICONERROR | MB_OK);
    delete[] pOut;
}
// Macro:
#define MY_CHECK(code) \
    do { \
        if ((FAILED(code))) { \
            MyErrorHandler(#code, __LINE__, __FUNCTION__); \
        } \
    } while (0)

// Code:
MY_CHECK(hRes = DoSomethingHere());
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »iSmokiieZz« (07.05.2014, 16:13)


9

07.05.2014, 16:15

Ich bin mir nicht mehr sicher, auf welchem Stand mein Hochgeladener Code ist, aber ich habe meine Run und Render Funktion mit den Objects so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int CGame::Run()
{
    MSG msg;
    ZeroMemory(&msg, sizeof(msg));

    CObject Grass(L"ground.obj", SwapChain, D3D11Device, TextureNameArray, meshSRV);

    while (true)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                break;
            }

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
else
{
        Render(Grass);
}
    }

    return msg.wParam;
}

void CGame::Render(CObject &Grass)
{
    float BgColor[4] = { 0.1f, 0.1f, 0.1f, 1.0f };
    D3D11DevCon->ClearRenderTargetView(RenderTargetView, BgColor);
    D3D11DevCon->ClearDepthStencilView(DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

    ConstBuffPerFrame.light = Licht;
    D3D11DevCon->UpdateSubresource(cbPerFrameBuffer, 0, NULL, &ConstBuffPerFrame, 0, 0);
    D3D11DevCon->PSSetConstantBuffers(0, 1, &cbPerFrameBuffer);

    D3D11DevCon->OMSetRenderTargets(1, &RenderTargetView, DepthStencilView);

    D3D11DevCon->OMSetBlendState(0, 0, 0xffffffff);

    D3D11DevCon->VSSetShader(VS, 0, 0);
    D3D11DevCon->PSSetShader(PS, 0, 0);

    Grass.DrawVisible(CamView, CamProjection, cbPerObj, D3D11DevCon, cbPerObjectBuffer, CubesTexSamplerState, RSCullNone);
    Grass.DrawTransparent(CamView, CamProjection, cbPerObj, D3D11DevCon, cbPerObjectBuffer, CubesTexSamplerState, RSCullNone);

    SwapChain->Present(0, 0);
}


Das ist für mich komplett neu, normalerweise hatte ich meine Objects immer in der Game Klasse, aber ich möchte jetzt eben aufteilen und dabei die Objects anderswo laden.

10

07.05.2014, 16:18

In deinem hochgeladenen Code sind die Grass.Draw .. zeilen auskommentiert.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »iSmokiieZz« (07.05.2014, 16:37)


Werbeanzeige