|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Reboot Mini JLI'ler
Anmeldedatum: 24.01.2007 Beiträge: 23
Medaillen: Keine
|
Verfasst am: 24.01.2007, 17:10 Titel: Triangle-Programm stüzt ab |
|
|
Hallo! Mit diesem Tread wollte ich mich erst mal vorstellen und eine Frage stellen. Ich hab hier einen Quellcode von einem Programm das ich selbst geschrieben habe. Ich benutze DirectX 9. Eigentlich sollte ja ein Triangle zu sehen sein. Aber das Programm stürzt dauernd ab. Kann mir einer sagen, wo mein Fehler liegt? Ich bin in Sachen 3D ein totaler Anfänger.
Hoffentlich macht es euch nichts aus, dass ich einen so langen Quelltext reinsetzte.
CPP: | #include <windows.h>
#include <d3d9.h>
const char szPN[] = "DirectX Triangle"; //Programmname
int nBreite = GetSystemMetrics(SM_CXSCREEN);
int nHoehe = GetSystemMetrics(SM_CYSCREEN);
VOID *pVoid = 0;
LPDIRECT3D9 D3D9 = 0;
LPDIRECT3DDEVICE9 D3DDEV = 0;
LPDIRECT3DVERTEXBUFFER9 D3DVB9 = 0;
struct VERTEX
{
float x, y, z, rhw;
DWORD Color;
};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wc;
wc.cbClsExtra = false;
wc.cbWndExtra = false;
wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = szPN;
wc.lpszMenuName = false;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
hWnd = CreateWindow(szPN, szPN, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
D3DPRESENT_PARAMETERS D3DPP;
ZeroMemory(&D3DPP, sizeof(D3DPP));
D3DPP.hDeviceWindow = hWnd;
D3DPP.Windowed = false;
D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
D3DPP.BackBufferWidth = nBreite;
D3DPP.BackBufferHeight = nHoehe;
D3DPP.BackBufferFormat = D3DFMT_X8R8G8B8;
D3D9 = Direct3DCreate9(D3D_SDK_VERSION);
D3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &D3DPP, &D3DDEV);
VERTEX Vert[] =
{
{ 1.0f, 1.0f, 1.0, 0.5f, D3DCOLOR_XRGB(255,0,0) }, //Punkt: Unten Links
{ 10.0f, 1.0f, 1.0f, 0.5f, D3DCOLOR_XRGB(0,255,0) }, //Punkt: Unten Rechts
{ 5.0f, 5.0f, 1.0f, 0.5f, D3DCOLOR_XRGB(0,0,255) } //Punkt: Oben Mitte
};
D3DDEV->CreateVertexBuffer(3 * sizeof(VERTEX), NULL, CUSTOMFVF, D3DPOOL_MANAGED, &D3DVB9, NULL);
D3DVB9->Lock(NULL, NULL, (void **) &pVoid, NULL);
memcpy(D3DVB9, Vert, sizeof(Vert));
D3DVB9->Unlock();
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
D3DDEV->Clear(NULL, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, NULL);
D3DDEV->BeginScene();
D3DDEV->SetStreamSource(NULL, D3DVB9, NULL, sizeof(VERTEX));
D3DDEV->SetFVF(CUSTOMFVF);
D3DDEV->DrawPrimitive(D3DPT_TRIANGLELIST, NULL, 1);
D3DDEV->EndScene();
D3DDEV->Present(NULL, NULL, NULL, NULL);
}
}
if(D3D9 != 0) { D3D9->Release(); }
if(D3DDEV != 0) { D3DDEV->Release(); }
if(D3DVB9 != 0) { D3DVB9->Release(); }
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
|
|
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 24.01.2007, 17:35 Titel: |
|
|
Bist du sicher das deine Grafikkarte und der installierte Treiber Hardwarebeschleunigung unterstützen?
Probier mal anstelle von
CPP: | D3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &D3DPP, &D3DDEV);
|
folgendes zu nehmen
CPP: | D3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPP, &D3DDEV);
|
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 24.01.2007, 17:40 Titel: |
|
|
Starte das Programm im Debugger, am besten im Fenstermodus (hat bei mir zum debuggen immer besser geklappt, als Fullscreen) und guck genau nach in welche Zeile das abstürtzt.
Evtl. findest du dann auch schon direkt einen Null-Zeiger oder ähnliches. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Reboot Mini JLI'ler
Anmeldedatum: 24.01.2007 Beiträge: 23
Medaillen: Keine
|
Verfasst am: 25.01.2007, 12:51 Titel: |
|
|
Leider kratzt bei mir der Debugger immer ab, wenn ich versuche mein Programm zu debuggen.
Die veränderung der Device-Einstellung bringt auch nix. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 25.01.2007, 15:13 Titel: |
|
|
Hm, ich hab früher immer ein Logbuch bentutz, einfach ne Minifunktion, die einen string in eine Textdatei schreibt. Diese Funktion rufst dud ann alle paar Zeilen auf, und kannst so die "Absturtzstelle" recht gut lokalisieren.
[edit]
Ok, wo der fehelr sehr wahrscheinlich sien könnte: Prüfe bitte das Direct3D Objekt, das Direct3DDevice und den Direct3DVertexbuffer9 auf NULL. Wenn eins von denen nicht erstellt werden konnte, müsste der Zeiger NULL sein und wenn du den dann später verwendest bekommst du logischerweise eine Acces Violation.
Also, direkt nach dem erstellen auf NULL testen, und entsprechende Fehlermeldungen einbauen.
(Das Device auf 0 zu testen ist sehr sinnvoll, da es stark von der verwendeten hardware abhängt, ob es geht oder net. D.h. dadurch kann es auf anderen Rechnern sehr einfach zu Fehlerquellen kommen.) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Reboot Mini JLI'ler
Anmeldedatum: 24.01.2007 Beiträge: 23
Medaillen: Keine
|
Verfasst am: 27.01.2007, 16:00 Titel: |
|
|
Ich weiß jetzt, dass es an der memcpy-Funktion liegt!
Soweit, so gut. Leider weiß ich nicht, wie ich das Problem behebe...
Weiß einer weiter? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.01.2007, 16:20 Titel: |
|
|
Ja ich.
CPP: | D3DVB9->Lock(NULL, NULL, (void **) &pVoid, NULL);
memcpy(D3DVB9, Vert, sizeof(Vert));
D3DVB9->Unlock(); |
CPP: | D3DVB9->Lock(NULL, NULL, (void **) &pVoid, NULL); |
Das lockt deinen VertexBuffer und legt auf pVoid die Adresse der vom VertexBuffer zurückgegebenen Daten.
Welche du aber in
CPP: | memcpy(D3DVB9, Vert, sizeof(Vert)); |
nicht verwendest.
Besser wäre daher wohl folgendes:
CPP: | memcpy(pVoid, Vert, sizeof(VERTEX)*3); |
mfg Mark _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Reboot Mini JLI'ler
Anmeldedatum: 24.01.2007 Beiträge: 23
Medaillen: Keine
|
Verfasst am: 28.01.2007, 11:38 Titel: |
|
|
Jetzt stürzt das Programm zwar nicht ab, aber den Triangle sieht man nicht. Es ist nur der weiße Hintergrund zu sehen. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 28.01.2007, 13:54 Titel: |
|
|
Hm, du verwendest XYZRHW und gibts w an? Ich bin mir nicht sicher, aber du könntest versuchen statt 0.5 einfach 0 anzugeben.
Dann könnte es am Cullen liegen, denke ich jetzt aber net, weil das Dreieck a im Uhrzeigersinn angegeben ist.
Achja, die bezeichnung bei dir ist übrigens falsch, du musst beachten das bei XYZRHW die Dreieckskoordinaten dirket Bildschirmkoordinaten sind und du keine Matrixen darauf mehr anwenden kannst. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 32 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 28.01.2007, 19:12 Titel: |
|
|
Ich kann mich irren aber muss rhw nich immer 1.0 sein? _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 28.01.2007, 21:42 Titel: |
|
|
51m0n hat Folgendes geschrieben: | Ich kann mich irren aber muss rhw nich immer 1.0 sein? |
Nein, soweit ich weiß können die Werte zwischen 0.0f und 1.0f liegen. Ich weiß nicht genau, ob sie so beschränkt sind, aber der Wert ist auf jeden Fall nicht festgelegt. Damit gibt man den Abstand zum Bildschirm an.
@Reboot: Was für eine Projektionsmatrix verwendest du denn? Orthogonale oder Perspektivische?
Könnte u.a. auch sein, dass du hier noch was an den Werten ändern muss. Das kann manchmal etwas dauern, bis du rausgefunden hast, wann das Objekt sichtbar ist.
Wie Jonathan_Klein erwähnt hat, könnte es ja auch am Cullen liegen. Deshalb würde ich testweise (aber nur bis du es herausgefunden hast), das Cullen abstellen. Dafür gibts auch ein Renderstate(siehe DX-Doku; irgendwas mit ..._CULLMODE) _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Reboot Mini JLI'ler
Anmeldedatum: 24.01.2007 Beiträge: 23
Medaillen: Keine
|
Verfasst am: 29.01.2007, 14:03 Titel: |
|
|
Ich benutze keine Projektionsmatrix. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.01.2007, 14:36 Titel: |
|
|
Was bei RHW eh keine Sinn machen würde, da dieses Flag ja gerade dazu da ist, sämtliche gesetzten Matrizen zu ignorieren _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.01.2007, 15:35 Titel: |
|
|
Ich habe mir dein programm mal kopiert und bei mir läuft es, ich nehme an du bekommst einen weissen Bildschirm zu sehen?
Dann schaue macl nach oben links, bei mir war dort ein kleines hässliches Dreieck zu sehen.
Edit:
Vor:
CPP: | while(msg.message != WM_QUIT) |
solltest du noch
CPP: | memset(&msg, 0, sizeof(MSG)); |
schreiben um Fehler zu vermeiden. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.01.2007, 15:55 Titel: |
|
|
Jop, das da ein keliens Dreieck ist, hab ich mir auch gedacht, auch wenn ichs nciht getestet habe. Schließlich gibts du da Pixelkoordinaten an. Kanns sein, dass du das 5*10 Pixel große Dreieck einfach übersehen hast? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|