Ich habe ein Problem bei der 3D Programmierung
-
Bei diesem Programm will ich ein einfaches Dreicek darstellen.
Leider bleibt main bildschirm schwarz.#define WINDOW_CLASS_NAME "freestyle-games" #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <d3d9.h> LPDIRECT3D9 lp3D = NULL; LPDIRECT3DDEVICE9 lp3DD = NULL; #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) HWND main_window_handle = NULL; HINSTANCE hinstance_app = NULL; void Init_3D(); void Render(); LPDIRECT3DVERTEXBUFFER9 VB_Triangle = NULL; // Definition des Vektorformats #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) struct CustomVertex{ FLOAT x, y, z, rhw; // die transformierte Position des Knoten (Vertex) DWORD color; // die Farbe an diesem Knoten }; // die Vertices des Dreiecks CustomVertex TriangleVertices[] = { { 400.0f, 330.0f, 0.0f, 1.0f, 0xFFFF0000 }, { 240.0f, 330.0f, 0.0f, 1.0f, 0xFF00FF00 }, { 320.0f, 150.0f, 0.0f, 1.0f, 0xFF0000FF } }; LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT ps; HDC hdc; switch(msg) { case WM_CREATE: { return(0); } break; case WM_PAINT: { hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); return(0); } break; case WM_DESTROY: { PostQuitMessage(0); return(0); } break; default: break; } return (DefWindowProc(hwnd, msg, wparam, lparam)); } int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; HWND hwnd; MSG msg; winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); hinstance_app = hinstance; if (!RegisterClassEx(&winclass)) return(0); if (!(hwnd = CreateWindowEx(NULL, WINDOW_CLASS_NAME, "freestyle-games", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, 1680,1050, NULL, NULL, hinstance, NULL))) return(0); main_window_handle = hwnd; Init_3D(); while(TRUE) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); if(KEYDOWN(VK_ESCAPE)) { SendMessage(hwnd,WM_CLOSE,0,0); } Render(); } } return(msg.wParam); } void Init_3D() { lp3D = Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS D3DPParams; ZeroMemory(&D3DPParams,sizeof(D3DPParams)); D3DPParams.SwapEffect = D3DSWAPEFFECT_DISCARD; D3DPParams.hDeviceWindow = main_window_handle; D3DPParams.BackBufferCount = 1; D3DPParams.Windowed = FALSE; D3DPParams.BackBufferWidth = 1680; D3DPParams.BackBufferHeight = 1050; D3DPParams.BackBufferFormat = D3DFMT_X8R8G8B8; lp3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, main_window_handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPParams, &lp3DD); //Szene initialisieren BYTE* VertexBufferStart; lp3DD->CreateVertexBuffer( sizeof(TriangleVertices), D3DUSAGE_WRITEONLY, D3D_CUSTOMVERTEX, D3DPOOL_MANAGED, &VB_Triangle,NULL); VB_Triangle->Lock(0,0,(void**)&VertexBufferStart,0); // Daten des Dreiecks in der Buffer kopieren memcpy(VertexBufferStart,TriangleVertices, sizeof(TriangleVertices)); // Vertex Buffer wieder freigeben VB_Triangle->Unlock(); lp3DD->SetVertexShader(NULL); } void Render() { lp3DD->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255),1.0f,0); // Beginn der Szene lp3DD->BeginScene(); // Den Datenstrom setzen lp3DD->SetStreamSource(0,VB_Triangle, sizeof(CustomVertex),NULL); // Das Dreieck ist das erste Element im Buffer und // es wird ein Objekt gezeichnet lp3DD->DrawPrimitive(D3DPT_TRIANGLELIST,0,1); // Die Szene ist beendet lp3DD->EndScene(); // und kann angezeigt werden lp3DD->Present(NULL,NULL,NULL,NULL); }
[edit="rapso"]cpp tags eingebaut[/edit]
-
ohne deinen code angeschaut zu haben: Versuche mal die Clear Color auf Rot oder auf etwas anderes wie schwarz zu setzen - funktiniert das?
-
Nutze die CPP-Tags, um deinen Code vernünftig formatiert darzustellen. 90% der Leser werden ihn sonst nicht lesen.
-
Vertexwahn schrieb:
ohne deinen code angeschaut zu haben: Versuche mal die Clear Color auf Rot oder auf etwas anderes wie schwarz zu setzen - funktiniert das?
lp3DD->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255),1.0f,0);
Er cleart auf blau. Kann aber so auf Anhieb auch nichts feststellen.
Vllt Grafikkarte nicht kompatibel?
rya.
-
Hallo,
ob in Zeile 214 das passiert, was es machen soll kann ich nicht genau sagen. Mal prüfen was sizeof(TriangleVertices) liefer, evtl durch 3*sizeof(CustomVertex) ersetzen.
Des Weiteren fehlen noch einiger Renderstates. Keine Ahnung was die Standardeinstellungen sind, aber:
Licht aus,
Z-Buffer, Z-Test aus
Textur(1) auf NULL
...Hoffe das hilft Dir weiter.