Direct3d



  • Hi.
    Ich möchte etwas mitC++ und Drrect3D machen, doch ich kriege ständig ne Fehlermeldung.

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""public: void __thiscall Direct3D::Init(struct HWND__ *)" (?Init@Direct3D@@QAEXPAUHWND__@@@Z)".	c:\Users\Michael\documents\visual studio 2010\Projects\Direct3D\Direct3D\Direct3D.obj
    

    und

    error LNK1120: 1 nicht aufgelöste externe Verweise.	c:\users\michael\documents\visual studio 2010\Projects\Direct3D\Debug\Direct3D.exe
    

    Kann mir jemand sagen, wie ich den Linker Fehler beheben kann.
    (Habe exakt, nach diesem Tutorial gearbeitet:
    http://www.youtube.com/watch?v=FqO5XkIVLj8&list=PL010894570055D2DA)



  • Du hast vergessen d3d9.lib zu linken. Ich würde mir an deiner Stelle aber die Frage stellen, ob es nicht besser wäre, Direct3D 11 zu lernen. Direct3D 9 ist mittlerweile wirklich schon arg veraltet...



  • du bist sicher nicht der einzige mit diesem fehler, schonmal versucht danach zu suchen? die suche hier ist echt gut!



  • dot schrieb:

    Du hast vergessen d3d9.lib zu linken. Ich würde mir an deiner Stelle aber die Frage stellen, ob es nicht besser wäre, Direct3D 11 zu lernen. Direct3D 9 ist mittlerweile wirklich schon arg veraltet...

    Diesen Vorschlag finde ich unpassend - der Einstieg in DX11 ist weitaus schwerer als mit DX9 und die meisten Spiele heutzutage sind aus Basis von DX9 oder DX10, da Unterstützung für DX11 noch nicht allzu verbreitet ist. Meiner Meinung nach sollte man sich erst einmal mit den Basics mit einer weit verbreiteten Version vertraut machen.



  • Das Problem ist, dass D3D9 noch eine Fixed Function Pipeline hat. Die "Basics", die man in der Regel dort also lernt, sind heutzutage völlig irrelevant...



  • Ne ich habe alle libs importiert.
    Der nimmt die aus ihrgend einem Grund nicht an...



  • Was genau meinst du mit "importiert"? Wenn du d3d9.lib gelinked hättest, gäbe es den Fehler nicht. Die einzige Erklärung für den Fehler ist, dass du d3d9.lib nicht gelinked hast...



  • Ich binde die nötigen Bibliotheken mit

    #pragma comment (lib, "d3d9.lib")
    #pragma comment (lib, "d3dx9.lib")
    

    ein. hast du genau die beiden Bibliotheken drin oder andere?



  • Doch habe beide drin.



  • Nope hast du nicht, sonst hättest du den Fehler nicht.

    Da sich da offenbar in zwei Foren parallel die gleiche Diskussion entwickelt, verlink ich hier einfach mal: http://www.spieleprogrammierer.de/18-c-cplusplus-csharp-delphi-java-python-und-lua/19739-cplusplus-direct3d/



  • In deinen Projekteinstellungen solltest du unter Configuration Properties > Linker > General die Option Additional Library Directories finden (auf Deutsch übersetzen, sofern du nicht das englische Visual Studio benutzt). Dort sollte der Eintrag *$(DXSDK_DIR)\Lib\x86* drinstehen. Dann anschließend in einem Header-File meine #pragma -Direktiven einfügen und gut ist.



  • dot schrieb:

    Das Problem ist, dass D3D9 noch eine Fixed Function Pipeline hat. Die "Basics", die man in der Regel dort also lernt, sind heutzutage völlig irrelevant...

    Und DirectX 11 läuft nicht unter WinXP.

    Nein, wer heute erst mit einer 3d API anfängt und diese lernen will, der sollte gleich OpenGL >= 4.x.

    Das läuft auch unter Windows XP und ne ganze Menge anderer Systeme.



  • DuffCola schrieb:

    Hi.
    Ich möchte etwas mitC++ und Drrect3D machen, doch ich kriege ständig ne Fehlermeldung.

    Tue dir bitte selbt einen Gefallen und lerne OpenGL 4.x und nicht dieses veraltete DirectX Gedöns.



  • DirectX 11 = veraltet schrieb:

    Und DirectX 11 läuft nicht unter WinXP.

    Windows XP ist veraltet.

    DirectX 11 = veraltet schrieb:

    Nein, wer heute erst mit einer 3d API anfängt und diese lernen will, der sollte gleich OpenGL >= 4.x.

    DirectX 11 = veraltet schrieb:

    Das läuft auch unter Windows XP und ne ganze Menge anderer Systeme.

    DirectX 11 = veraltet schrieb:

    Tue dir bitte selbt einen Gefallen und lerne OpenGL 4.x und nicht dieses veraltete DirectX Gedöns.

    Ich denk diese Diskussion sollten wir besser in einem der vielen Direct3D vs OpenGL Threads führen. Der Threadersteller hat im verlinkten Parallelthread angegeben, OpenGL bereits zu kennen und hier wurde explizit nach Direct3D gefragt. Aber vielleicht kannst du uns ja sagen, wie intensiv du dich eigentlich mit Direct3D beschäftigt hast und wieso genau Direct3D 11 deiner Meinung nach veraltet ist!?



  • dot schrieb:

    DirectX 11 = veraltet schrieb:

    Und DirectX 11 läuft nicht unter WinXP.

    Windows XP ist veraltet.

    Wird noch bis April 2014 supported.

    Ich denk diese Diskussion sollten wir besser in einem der vielen Direct3D vs OpenGL Threads führen. Der Threadersteller hat im verlinkten Parallelthread angegeben, OpenGL bereits zu kennen und hier wurde explizit nach Direct3D gefragt. Aber vielleicht kannst du uns ja sagen, wieviele Jahre professionelle Erfahrung du mit Direct3D hast und wieso genau Direct3D 11 deiner Meinung nach veraltet ist!?

    Es ist veraltet weil die Entwicklung von modernen Spielen in Richtugn der vielen anderen Plattformen geht.

    Heute werden Spiele entwickelt für:

    - Android
    - iPhone
    - diverse Konsolen
    und auf dem PC nimmt Valve mit ihrer Steam Plattform nun auch Linux ins Angebot,
    während Windows 8 immer weiter von allen diesen Plattformen verdrängt wird.

    Bei allen diesen Plattformen ist OpenGL die erste Wahl, insofern macht es heutzutage keinen Sinn mehr, sich mit DirectX festzufahren. Ganz gleich welche Vorzüge DirectX auf Windows Plattformen haben mag.

    Und gerade dann, wenn er Indie Entwickler werden will, sollte er sich nicht auf eine einzige Plattform festlegen.



  • Zumal OpenGL 4.x alles nötige bietet um eine moderne Grafikkarte auszureizen.



  • DirectX 11 = veraltet schrieb:

    Bei allen diesen Plattformen ist OpenGL die erste Wahl,

    Korrektur.

    Es ist keine Wahl, es ist sogar ein MUSS!
    Zumindest auf den Plattformen die nicht von Microsoft sind.

    OpenGL ES zähle ich mal noch zu OpenGL.



  • DirectX 11 = veraltet schrieb:

    Es ist veraltet weil die Entwicklung von modernen Spielen in Richtugn der vielen anderen Plattformen geht.

    Unterschiedliche Plattformen haben eben unterschiedliche APIs.

    DirectX 11 = veraltet schrieb:

    Heute werden Spiele entwickelt für:

    - Android
    - iPhone
    - diverse Konsolen
    und auf dem PC nimmt Valve mit ihrer Steam Plattform nun auch Linux ins Angebot,
    während Windows 8 immer weiter von allen diesen Plattformen verdrängt wird.

    Bei allen diesen Plattformen ist OpenGL die erste Wahl, insofern macht es heutzutage keinen Sinn mehr, sich mit DirectX festzufahren. Ganz gleich welche Vorzüge DirectX auf Windows Plattformen haben mag.

    I beg to differ. Auf Android und iOS gibt es nur OpenGL ES. Ich entwickle nicht für Konsolen, aber afaik ist der OpenGL Wrapper auf der Play Station ein Witz und niemand, der es auch nur irgendwie ernst meint, verwendet dort was anderes als die nativen APIs der Plattform. Die XBox 360 hat afaik ein leicht modifiziertes Direct3D 9 (überleg mal, woher der Name XBox möglicherweise kommt). Die einzige mir bekannte Konsole, die im Moment auf OpenGL setzt, ist die Wii U, wobei ich keine Ahnung hab, was für eine konkrete Geschmacksrichtung von OpenGL dort genau wieder läuft. Die Ouya ist nur ein Smartphone ohne Phone und mit HDMI Ausgang und muss sich erst mal durchsetzen. Auf Windows ist Direct3D 11 aktuell vom Smartphone bis zum PC durch die Bank die native Grafik API, OpenGL ist dort lediglich für Desktopanwendungen eine Option. Auf Linux gibts im Moment praktisch keine andere Wahl als OpenGL.

    Es mag sein, dass die Anzahl der Plattformen, die eine API mit einem "OpenGL" im Namen bieten, zahlenmäßig überwiegt. Aber die Vorstellung, dass du dank OpenGL einfach so für alle Geräteklassen vom Smartphone über die Konsole bis zum PC den selben Code verwenden kannst, entbehrt jeder Realität. Du wirst für jede Plattform so oder so mindestens einen separaten Codepfad brauchen und dort verwendest du dann sinnvollerweise die für deine Anwendung auf der jeweiligen Plattform am besten geeignete API.

    Übrigens gehen grad Gerüchte um, dass die nächste Playstation Direct3D 11 oder zumindest eine sehr ähnliche API verwenden wird. Was die nächste XBox angeht, ist wohl sowieso klar, welche API dort zum Einsatz kommt...

    Zu deinem Rat zu OpenGL >= 4.x muss ich sagen, dass es schön wär, wenn das so einfach wär, aber leider ist OpenGL >= 4.x im Moment praktisch nur auf Linux und Windows Desktops eine Option (Mac schließt du damit prinzipiell aus, weil die bei 3.2 Schluss gemacht haben) und auch dort nur mit NVIDIA oder ATI Hardware...

    DirectX 11 = veraltet schrieb:

    Und gerade dann, wenn er Indie Entwickler werden will, sollte er sich nicht auf eine einzige Plattform festlegen.

    Sagt ja auch niemand, dass er das tun soll. Aber ich denk, gerade als Indie wäre es wichtig, die sehr begrenzen Ressourcen erst mal auf die Plattform zu fokussieren, mit der ich die größte Anzahl an potentiellen Spielern erreichen kann. Und zumindest mir kommt es so vor, dass das auch genau das ist, was so ziemlich alle Indies tun...



  • dot schrieb:

    DirectX 11 = veraltet schrieb:

    Es ist veraltet weil die Entwicklung von modernen Spielen in Richtugn der vielen anderen Plattformen geht.

    Unterschiedliche Plattformen haben eben unterschiedliche APIs.

    Da er unter Windows entwickelt kann er OpenGL nehmen.

    Es mag sein, dass die Anzahl der Plattformen, die eine API mit einem "OpenGL" im Namen bieten, zahlenmäßig überwiegt. Aber die Vorstellung, dass du dank OpenGL einfach so für alle Geräteklassen vom Smartphone über die Konsole bis zum PC den selben Code verwenden kannst, entbehrt jeder Realität.

    OpenGL ES ist ein Subset von OpenGL.
    Und ja, man kann gleich so programmieren, das man sich auf das Subset beschränkt oder im Code entsprechend berücksichtigt.
    Die paar speziellen Anpassungen die übrig bleiben, die kann man problemlos lösen.

    Mit dem normalen OpenGL ist man auf allen PC Plattformen gleich Zuhause.
    Also Mac OS X, Linux und Windows (und hierbei sogar noch Windows XP, was mit DX11 nicht mehr geht).

    Die Argumente die du gegen OpenGL bezüglich der Konsolen genannt hast, dürften momentan sowieso nicht das Thema sein, weil ein Neuling eh keine Entwicklerkits für diese Plattformen kriegt.
    Aber er kann dennoch in Android einsteigen und mit ein bischen Aufwand auch für das iPhone entwickeln, wenn er gleich auf OpenGL setzt.

    Du wirst für jede Plattform so oder so mindestens einen separaten Codepfad brauchen und dort verwendest du dann sinnvollerweise die für deine Anwendung auf der jeweiligen Plattform am besten geeignete API.

    Auch unter Windows 7 ist OpenGL die am besten geeignete API, denn es gibt hier keinen Nachteil bei der Spieleentwicklung wenn er hierfür OpenGL anstatt DX11 verwendet.

    Übrigens gehen grad Gerüchte um, dass die nächste Playstation Direct3D 11 oder zumindest eine sehr ähnliche API verwenden wird.

    Ich hoffe dir ist schon klar, das so ein Gelaber typischerweise von Laien kommt die die Fähigkeit einer 3d Grafikkarte immer anhand der DirectX Version festmachen, die diese Grafikkarte abdecken kann?

    Faktisch bedeutet das also, das die nächste PS einfach eine der neueren OpenGL Versionen verwenden wird.
    Das hat also nichts mit DirectX zu tun.

    Zu deinem Rat zu OpenGL >= 4.x muss ich sagen, dass es schön wär, wenn das so einfach wär, aber leider ist OpenGL >= 4.x im Moment praktisch nur auf Linux und Windows Desktops eine Option (Mac schließt du damit prinzipiell aus, weil die bei 3.2 Schluss gemacht haben) und auch dort nur mit NVIDIA oder ATI Hardware...

    Man kann auch für nen Mac Port die OpenGL 4.x Funktionen mit entsprechenden Define Anweisungen ausklammern und durch OpenGL 3.x Gegenstücke ersetzen.
    Damit wird er dann immer noch > 80 % des Codes wiederverwerten können, was
    bei DirectX 11 eben nicht der Fall wäre.

    Für DX11 müßte er eine extra OpenGL Version schreiben nur um Mac OS X zu unterstützen. Da kann man also auch gleich OpenGL verwenden und sich dieses Problem sparen. Selbst wenn in Mac OS X also momentan nur OpenGL 3.2 unterstützt wird, spart man sich mit OpenGL also trotdem mehr arbeit, als wenn man DX11 verwendet und dann später alles mit OpenGL nochmal schreiben muss.

    Sagt ja auch niemand, dass er das tun soll. Aber ich denk, gerade als Indie wäre es wichtig, die sehr begrenzen Ressourcen erst mal auf die Plattform zu fokussieren, mit der ich die größte Anzahl an potentiellen Spielern erreichen kann. Und zumindest mir kommt es so vor, dass das auch genau das ist, was so ziemlich alle Indies tun...

    Gerade als Indie sollte man sich auf keinen Fall nur eine Plattform konzentrieren, weil man gar nicht das Marketingbudget hat um auf nur einer Plattform bekannt zu werden.

    Liefert man aber noch nen Mac OS X und Linux Port dazu, dann kriegt man von der Community dieser beiden Plattformen Gratis Werbung für das eigene Spiel, weil die froh sind, wenn es mal wieder ein neues Spiel für ihre Plattform gibt.

    Auch verkauft man so wesentlich mehr Exemplare, weil es als Indie eben gar nicht einfach ist, auf einer starken Plattform durchzusetzen.

    Wer nur für Windows entwickelt, der hat dort nämlich auch das Problem dass er > 10000 andere Spiele als Konkurrenz hat, die von den Nutzern auch alle gespielt werden wollen und die Zeit ist für die meisten Spieler nunmal auch endlich.
    Wenn er auch für Linux entwickelt, dann liegt seine Konkurrenz bei momentan unter 100 Spielen, dementsprechend stark dürfte sein Spiel daher auch von Linux only Spielern gewürdigt werden.

    Für nur wenige Plattformen entwickeln kann man sich nur dann leisten, wenn man schon groß ist.

    Aber warum wehrst du dich eigentlich so gegen die Verwendung von OpenGL?

    Hast du vielleicht irgendein Buch über die Spieleprogrammierung mithilfe von DirectX geschrieben und siehst nun den Verkaufserfolg deines Buches gefährdet oder woher kommt die Gegenwehr gegen OpenGL?



  • Die Frage ist doch eher, ob nicht du Minderwertigkeitskomplexe hast, oder warum musst du "dein" OpenGL so "anpreisen" ?


Anmelden zum Antworten