Frage zu DirectX



  • Hallo, ich möchte mich mit DirectX beschäftigen und ein Buch durcharbeiten. Das Buch
    nutzt DirectX 8. Sollte man damit anfangen oder ist es zu alt? Mir geht es erst mal grundlegende Kenntnisse zu bekommen. Mein Ziel ist es irgendwann einmal ein Spiel wie CS zu schreiben.
    Aber bevor ich mich mit dem Thema beschäftigen möchte, hätte ich noch paar Fragen. Wie hängen C++, Grafikkartentreiber, API DirectX, Engine zusammen? Vielleicht kann jemand ein kleines Beispiel machen, wie die Komponenten in einem Spiel miteinander interagieren? Was ich weiß ist:

    Grafikengine ist für die Darstellung von Grafik zuständig.
    Grafikkartentreiber dient zur Kommunikation zwischen Hardware und Software.
    DirectX ist eine Bibliothek für grafische Funktionen.

    1. Was ist der Unterschied zwischen dem programmierten Spiel und der Grafikengine bzw. Spiele Engine? Muss jedes Spiel auch eine Engine haben?

    2. Ist denn DirectX nicht auch für die Grafikdarstellung verantwortlich? Wo ist die Abgrenzung zu der Grafikengine? Könnte man auch ein Spiel ohne eine API machen?

    3. In welcher Sprache ist DirectX geschrieben?

    4. Ich habe gelesen, dass DirectX auch Hardwarezugriffe macht. Aber das wäre doch die Aufgabe des Grafikkartentreibers?

    Vielen Dank

    Tori



  • tori1117 schrieb:

    Hallo, ich möchte mich mit DirectX beschäftigen und ein Buch durcharbeiten. Das Buch
    nutzt DirectX 8. Sollte man damit anfangen oder ist es zu alt?

    Zu alt.

    tori1117 schrieb:

    Mir geht es erst mal grundlegende Kenntnisse zu bekommen. Mein Ziel ist es irgendwann einmal ein Spiel wie CS zu schreiben.

    Ich würde auch für Grundlagen nicht D3D8 empfehlen.
    Von mir aus noch D3D9, aber vermutlich wäre es kein Fehler gleich mit D3D11 anzufangen. Wobei die Einstiegshürde bei D3D11 vermutlich höher ist als bei D3D9 bzw. D3D9Ex.

    tori1117 schrieb:

    Aber bevor ich mich mit dem Thema beschäftigen möchte, hätte ich noch paar Fragen. Wie hängen C++, Grafikkartentreiber, API DirectX, Engine zusammen? Vielleicht kann jemand ein kleines Beispiel machen, wie die Komponenten in einem Spiel miteinander interagieren? Was ich weiß ist:

    Grafikengine ist für die Darstellung von Grafik zuständig.
    Grafikkartentreiber dient zur Kommunikation zwischen Hardware und Software.
    DirectX ist eine Bibliothek für grafische Funktionen.

    1. Was ist der Unterschied zwischen dem programmierten Spiel und der Grafikengine bzw. Spiele Engine? Muss jedes Spiel auch eine Engine haben?

    Nein, nicht jedes Spiel muss eine Grafik-Engine haben.
    Jedes Spiel (das Grafik ausgibt) braucht Code um eben die Grafik auszugeben. Wenn der direkt mit dem restlichen Spiel-Code verwachsen ist spricht man aber üblicherweise nicht von einer Grafik-Engine.
    Wenn der Code aber schön sauber vom "eigentlichen" Spiel getrennt ist und dem Spiel ein deutlich vereinfachtes Interface zur Verfügung stellt um die Grafiken zu verwalten/auszugeben, dann nennt man diesen Code eben Grafikengine.

    tori1117 schrieb:

    1. Ist denn DirectX nicht auch für die Grafikdarstellung verantwortlich?

    DirectX stellt dir Funktionen zur Verfügung mit der du die Grafikkarte ansprechen kannst.

    tori1117 schrieb:

    Wo ist die Abgrenzung zu der Grafikengine?

    DirectX ist "low-level", d.h. es tut quasi nix für dich was die Grafikkarte nicht direkt "in Hardware" umsetzen kann. Das Spiel möchte aber meist ein "high-level" Interface. Um den Teil dazwischen kümmert sich die Grafik-Engine.

    Das kann sehr wenig sein oder sehr viel. Eine einfache 2D Engine tut nicht viel. Die "übersetzt" vielleicht bloss einen "mal Sprite X an Position Y" Aufruf vom Spiel in das Zeichnen von zwei Dreiecken mit den passenden Koordinaten und der passenden Textur.
    Eine Engine wie die Frostbite 2 macht dagegen massiv viel mehr, z.B. die ganzen Licht-/Schattenberechnungen und Physik (und noch vieles mehr was mit Grafik nichts zu tun hat).

    tori1117 schrieb:

    Könnte man auch ein Spiel ohne eine API machen?

    Klar. Bloss nicht auf PC mit Betriebssystemen wie Windows oder Linux oder auf aktuellen Konsolen. Unter DOS bzw. auf älteren Computern war es aber üblich dass Spiele keine API verwendet, sondern direkt auf die Hardware zugegriffen haben.

    tori1117 schrieb:

    1. In welcher Sprache ist DirectX geschrieben?

    Vermutlich in C++, theoretisch wäre aber auch C möglich. Wird auf jeden Fall mit Visual C++ übersetzt.

    tori1117 schrieb:

    1. Ich habe gelesen, dass DirectX auch Hardwarezugriffe macht. Aber das wäre doch die Aufgabe des Grafikkartentreibers?

    Ja, das ist die Aufgabe des Grafikkartentreibers. Also nein, DirectX selbst macht keine Hardwarezugriffe. DirectX - bzw. genauer Direct3D, worum es dir ja vermutlich geht - ist eine reine Usermode DLL, die über eine standardisierte Schnittstelle (WDDM, bzw. XDDM auf älteren Windows Plattformen) mit dem Grafikkartentreiber plaudert. Und der Grafikkartentreiber macht dann die Hardwarezugriffe.
    Ginge auch nicht anders, da die selben DirectX DLLs mit allen Grafikkarten funktionieren, verschiedene Grafikkarten aber komplett unterschiedlich angesprochen werden müssen.



  • Vielen Dank das hat mich im Verständnis weiter gebracht. Habe noch Fragen.
    Es gibt ja eine API Mantle, die low level und hardwarenah ist. Was bedeutet low level und hardwarenah?

    Wo ist die Shaderprogrammierung HLSL in dem System einzuordnen? Macht man das in DirectX? Muss ich die auch lernen?



  • Low-Level googelst du dir bitte.
    Und hardwarenahe heisst eben hardwarenahe. Also dass Mantle selbst nicht viel macht ausser deine Aufrufe/Daten/... an die Hardware weiterzugeben.

    tori1117 schrieb:

    Wo ist die Shaderprogrammierung HLSL in dem System einzuordnen?

    Shader sind Programme die dazu verwendet werden bestimmte Dinge während der Grafikausgabe zu berechnen bzw. zu verändern.
    Wenn du z.B. mit einer "Camera" in deiner Szene rumfahren möchtest, dann müssen irgendwo die Eckpunkte der Objekte passend verschoben werden, so dass sie, wenn man sie dann am Bildschirm hinzeichnet, so aussehen wie aus der Position der Camera betrachtet.
    Das würde z.B. der Vertex-Shader machen.
    Und dann muss man natürlich für jeden Pixel einen Farbwert bestimmen. Also z.B. Lichtberechnung machen damit man weiss wie hell der Pixel sein soll, oder die Farbe aus einer Textur auslesen usw. Das macht der Pixelshader.

    tori1117 schrieb:

    Macht man das in DirectX?

    Und was soll das heissen? DirectX ist eine Library, IN der programmiert man gar nix. Man programmiert es in Notepad oder irgend einem anderen Editor, und übergibt es dann an DirectX.

    tori1117 schrieb:

    Muss ich die auch lernen?

    Kommt drauf an was du machen willst. Ganz einfache Sachen kann man in D3D9 noch ohne Shader machen. In D3D11 nicht mehr, da musst du alles mit Shadern machen.

    Bzw. kannst du sonst auch einfach eine fertige Game-Engine verwenden. Dann kümmert sich diese um das ganze Zeugs mit DirectX (inklusive Shader und noch 1000 anderen Sachen), und du kannst dich darauf konzentrieren ein Spiel zu programmieren.



  • tori1117 schrieb:

    Wo ist die Shaderprogrammierung HLSL in dem System einzuordnen? Macht man das in DirectX? Muss ich die auch lernen?

    Shader sind Programme die vom Grafiktreiber/der API fuer die GPU kompiliert werden und auf der GPU laufen. (Das hat hustbaer nicht so ganz deutlich gemacht glaube ich.) Wenn Leute ueber die "programmable pipeline" (im Gegensatz zur "fixed-function pipeline") reden sind Shader das was damit gemeint ist. Es gibt verschiedene Arten von Shadern, und du brauchst immer zumindest Vertex- und Pixel-Shader, die anderen sind optional. Na ja den Rest musst du dir dann irgendwo durchlesen. 😉 Ich wuerde btw wirklich mit D3D11 anfangen, alles andere macht IMO wenig Sinn, auch wenn die Einstiegshuerde aufgrund der programmable pipeline vielleicht etwas hoeher ist. Bevor du damit anfaengst solltest du allerdings *mindestens* sehr solide C Kenntnisse (C++ wuerde nicht schaden, WinAPI hilft auch) haben, alles andere ist Zeitverschwendung. Tut mir leid aber es ist nun mal so, du wirst mindestens gute 80 Stunden mit Konsolenprogrammen verbringen muessen um zumindest C zu lernen, auch wenn du eigentlich 3D Programme schreiben willst.


Anmelden zum Antworten