R
Robert Alpha
Gast
Hallo zusammen,
ich habe in letzter Zeit angefangen, in C++ und DirectX zu programmieren, ich halte mich dabei an ein Online- Tutorial.
In DirectX 9 hat alles funktioniert, dann habe ich versucht, mit DirectX 11 weiterzumachen.
Das meiste ist ja ganz ähnlich, wobei gleich am Anfang seltsam war, dass Visual Studio die Include- und Lib- Dateien im DirectX SDK Ordner nicht gefunden hat, die DX9 Dateien liegen am selben Ort, aber er findets erst, wenn ich den DX SDK Ordner in den Projekt Einstellungen hinzufüge.
Jetzt tritt bei der DX11 Version des Programms ein Problem auf, das bei der DX9 Version nicht aufgetreten ist: Nach dem Kompilieren öffnet sich das Fenster, bleibt aber grau, und das Bild wird erst nach ca. 20 Sekunden blau, so lange ist das Programm nicht ansprechbar. Beim Debuggen hängt das Programm diese ganze Zeit an der DX11- Methode D3D11CreateDeviceAndSwapChain() (Zeile 114), und Visual Studio zeigt an, mit dieser Zeile sei kein Code verknüpft, obwohl die Methode in der D3D11.h sehr wohl vorhanden ist
Beim Debuggen bleibt VS auch an der Stelle hängen, und springt nicht, wie bei ZeroMemory() in die Unterdatei...
Und nach ca. 20 Sekunden schließlich läuft doch alles...
Jetzt die Frage, warum das Programm die 20 Sekunden bei der Funktion hängen bleibt, ist das bei DirectX 11 normal, weil es solange dauert, bis DX11 gestartet ist?
Hier der Programmcode:
ich habe in letzter Zeit angefangen, in C++ und DirectX zu programmieren, ich halte mich dabei an ein Online- Tutorial.
In DirectX 9 hat alles funktioniert, dann habe ich versucht, mit DirectX 11 weiterzumachen.
Das meiste ist ja ganz ähnlich, wobei gleich am Anfang seltsam war, dass Visual Studio die Include- und Lib- Dateien im DirectX SDK Ordner nicht gefunden hat, die DX9 Dateien liegen am selben Ort, aber er findets erst, wenn ich den DX SDK Ordner in den Projekt Einstellungen hinzufüge.
Jetzt tritt bei der DX11 Version des Programms ein Problem auf, das bei der DX9 Version nicht aufgetreten ist: Nach dem Kompilieren öffnet sich das Fenster, bleibt aber grau, und das Bild wird erst nach ca. 20 Sekunden blau, so lange ist das Programm nicht ansprechbar. Beim Debuggen hängt das Programm diese ganze Zeit an der DX11- Methode D3D11CreateDeviceAndSwapChain() (Zeile 114), und Visual Studio zeigt an, mit dieser Zeile sei kein Code verknüpft, obwohl die Methode in der D3D11.h sehr wohl vorhanden ist
Beim Debuggen bleibt VS auch an der Stelle hängen, und springt nicht, wie bei ZeroMemory() in die Unterdatei...
Und nach ca. 20 Sekunden schließlich läuft doch alles...
Jetzt die Frage, warum das Programm die 20 Sekunden bei der Funktion hängen bleibt, ist das bei DirectX 11 normal, weil es solange dauert, bis DX11 gestartet ist?
Hier der Programmcode:
Code:
// DirectX 11 Test
#include <windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>
#pragma comment (lib, "d3d11.lib")
#pragma comment (lib, "d3dx11.lib")
#pragma comment (lib, "d3dx10.lib")
IDXGISwapChain *swapchain;
ID3D11Device *dev;
ID3D11DeviceContext *devcon;
ID3D11RenderTargetView *backbuffer;
void InitD3D(HWND hWnd);
void RenderFrame(void);
void CleanD3D(void);
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
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.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass";
RegisterClassEx(&wc);
RECT wr = {0, 0, 800, 600};
AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
hWnd = CreateWindowEx(NULL,
L"WindowClass",
L"Our First Direct3D Program",
WS_OVERLAPPEDWINDOW,
300,
300,
wr.right - wr.left,
wr.bottom - wr.top,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, nCmdShow);
InitD3D(hWnd);
MSG msg;
while(TRUE)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message == WM_QUIT)
break;
}
RenderFrame();
}
CleanD3D();
return msg.wParam;
}
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);
}
void InitD3D(HWND hWnd)
{
DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
scd.BufferCount = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.OutputWindow = hWnd;
scd.SampleDesc.Count = 1;
scd.SampleDesc.Quality = 0;
scd.Windowed = TRUE;
D3D11CreateDeviceAndSwapChain(NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
NULL,
NULL,
NULL,
D3D11_SDK_VERSION,
&scd,
&swapchain,
&dev,
NULL,
&devcon);
ID3D11Texture2D *pBackBuffer;
swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
pBackBuffer->Release();
devcon->OMSetRenderTargets(1, &backbuffer, NULL);
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = 800;
viewport.Height = 600;
devcon->RSSetViewports(1, &viewport);
}
void RenderFrame(void)
{
devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));
swapchain->Present(0, 0);
}
void CleanD3D(void)
{
swapchain->Release();
backbuffer->Release();
dev->Release();
devcon->Release();
}