JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=37e42e63fd8194068d1deecfa522a9fbMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Triangle-Programm stüzt ab
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Reboot
Mini JLI'ler



Anmeldedatum: 24.01.2007
Beiträge: 23

Medaillen: Keine

BeitragVerfasst am: 24.01.2007, 17:10    Titel: Triangle-Programm stüzt ab Antworten mit Zitat

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. Smile
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
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 24.01.2007, 17:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.01.2007, 17:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Reboot
Mini JLI'ler



Anmeldedatum: 24.01.2007
Beiträge: 23

Medaillen: Keine

BeitragVerfasst am: 25.01.2007, 12:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 25.01.2007, 15:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Reboot
Mini JLI'ler



Anmeldedatum: 24.01.2007
Beiträge: 23

Medaillen: Keine

BeitragVerfasst am: 27.01.2007, 16:00    Titel: Antworten mit Zitat

Ich weiß jetzt, dass es an der memcpy-Funktion liegt! Very Happy
Soweit, so gut. Leider weiß ich nicht, wie ich das Problem behebe... Crying or Very sad

Weiß einer weiter?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.01.2007, 16:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Reboot
Mini JLI'ler



Anmeldedatum: 24.01.2007
Beiträge: 23

Medaillen: Keine

BeitragVerfasst am: 28.01.2007, 11:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 28.01.2007, 13:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 32
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 28.01.2007, 19:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 28.01.2007, 21:42    Titel: Antworten mit Zitat

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) Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Reboot
Mini JLI'ler



Anmeldedatum: 24.01.2007
Beiträge: 23

Medaillen: Keine

BeitragVerfasst am: 29.01.2007, 14:03    Titel: Antworten mit Zitat

Ich benutze keine Projektionsmatrix.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 29.01.2007, 14:36    Titel: Antworten mit Zitat

Was bei RHW eh keine Sinn machen würde, da dieses Flag ja gerade dazu da ist, sämtliche gesetzten Matrizen zu ignorieren Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.01.2007, 15:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 29.01.2007, 15:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum