Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

11

21.02.2012, 00:00

Zitat

Wer sagt dass der Renderer auf allen Plattformen die selbe API verwenden muss?

Doppelte Arbeit? Wozu? Bloß damit DirectX auch zum Zug kommt?

Zitat

Die Möglichkeit Shader offline zu kompilieren

Da hast du natürlich recht.

Zitat

Draw ohne Vertex Buffer

Hä?
Wo wir doch vorhin erst über den immidate mode gerredet habe?
Außerdem gibt es ja Displaylisten.

Zitat

Random Memory Access in Shadern

Was meinst du damit?

Zitat

Schau dir mal Direct3D 11 an

Anschaun? gern!
Aber auf meinen Computer(genauer gesagt wegen der Grafikkarte) läufts nicht. ;)

Zitat

Wenn du Speicherlecks erzeugst, dann ist das nicht die Schuld von Direct3D. Direct3D ist, dank COM, perfekter Kandidat für RAII. Mit OpenGL gestaltet sich das, aufgrund des merkwürdigen Objektmodells, meiner Erfahrung nach teilweise schwieriger.

Vielleicht machst du da was falsch?
Ich kapsle in OpenGL normalerweiße die OpenGL Funktionen immer in einer Klasse. (-> Ja auch ich mag OO)

Nur die OO von DirectX hat mir noch nie zugesagt. Dabei ist eben wie schon erwähnt dieses COM nicht ganz unschuldig. ;)

Es kann auch sein das sich vielleicht auch wircklich an manchen Stellen was geändert hat.

EDIT:
Ich seh grad das ich was ausgelassen hab:

Zitat

multithreaded Rendering

Hab micht ehrlichgesagt noch nie damit beschäftigt. ;)
Ich programmiere auch in letzter Zeit eher Anwendungen, da kommt es auf sowas nicht so an.
Gennerell kann ich es mir aber schon vorstellen. Man müsste die Funktionen entweder Kapseln und den Zugriff verwalten oder mehrere Renderingcontexte nutzen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (21.02.2012, 00:05)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

21.02.2012, 00:16

Zitat

Wer sagt dass der Renderer auf allen Plattformen die selbe API verwenden muss?

Doppelte Arbeit? Wozu? Bloß damit DirectX auch zum Zug kommt?

Nein. Z.B. damit ich vernünftige Performance auf Intel Karten mit ihren grottigen OpenGL Treibern hab. Mittlerweile is das schon besser, aber vor nicht all zu langer Zeit konnte es passieren, dass man allein durch die Portierung nach Direct3D die Performance verdoppelt konnte, weil die OpenGL Treiber mancher Karten so schlecht waren (betrifft hauptsächlich so On-board Chips wie die meisten Laptops sie haben). Abgesehen davon deckt OpenGL nicht alles ab was man in einer ernsthaften Anwendung braucht. Enumeration und Context Creation laufen beispielsweise eben nur über Plattformspezifische APIs (wgl, glx etc.).
Und dann macht der Renderer sowieso nur einen kleinen Teil einer ernsthaften Anwendung aus.
Natürlich wird es nicht immer sinnvoll sein, aber es gibt eben doch gute Gründe, warum man unter Windows Direct3D verwenden will, selbst wenn man auf anderen Plattformen gezwungenermaßen OpenGL oder sonstige APIs benutzt.

Zitat

Draw ohne Vertex Buffer

Hä?
Wo wir doch vorhin erst über den immidate mode gerredet habe?
Außerdem gibt es ja Displaylisten.

Ich rede nicht von Immediate Mode, Displaylisten oder sonstigem Kram aus dem letzten Jahrtausend, sondern von der Möglichkeit, Vertices über den Vertex Shader zu erzeugen ohne einen Buffer zu verwenden. Das kann massiv Bandbreite sparen, z.B. wenn ich Millionen von Sprites rendern will. Unter OpenGL nicht möglich (ich kenn nur einen Driver Hack auf den ich mich lieber nicht verlassen würde).

Zitat

Random Memory Access in Shadern

Was meinst du damit?

Genau das: Lesen und Schreiben aus dem/in den Grafikspeicher vom Shader aus (auch bekannt als Gathering/Scattering). Für viele aktuellere Techniken ein essentielles Feature. Unter OpenGL nur über herstellerspezifische Extensions verfügbar (NV_shader_buffer_load, NV_shader_buffer_store etc.)

Zitat

Schau dir mal Direct3D 11 an

Anschaun? gern!
Aber auf meinen Computer(genauer gesagt wegen der Grafikkarte) läufts nicht. ;)

Wenn du eine Direct3D 9 fähige Grafikkarte oder besser hast, dann läuft's bei dir.

Zitat

Wenn du Speicherlecks erzeugst, dann ist das nicht die Schuld von Direct3D. Direct3D ist, dank COM, perfekter Kandidat für RAII. Mit OpenGL gestaltet sich das, aufgrund des merkwürdigen Objektmodells, meiner Erfahrung nach teilweise schwieriger.

Vielleicht machst du da was falsch?
Ich kapsle in OpenGL normalerweiße die OpenGL Funktionen immer in einer Klasse. (-> Ja auch ich mag OO)

Ich halte zwar nicht viel von Wrappern, aber es würde mich sehr interessieren wie du da vorgehst. Meiner Erfahung nach ist es praktisch unmöglich OpenGL vernünftig in Klassen zu wrappen. Durch das merkwürdige Objektmodell (der ganze Bind Kram), ist das entweder nur sehr ineffizient möglich, oder man kann eben kein richtiges OOP betreiben.
Genau das ist eines der großen Problem von OpenGL, macht auch das Implementieren von Treibern zu einer weniger angenehmen Sache was man so hört und sorgt für unnötigen Overhead, der unter gewissen Umständen sogar ein performance-limitierender Faktor werden kann.

Es kann auch sein das sich vielleicht auch wircklich an manchen Stellen was geändert hat.

Was war denn die letzte Version von Direct3D mit der du so zu tun hattest?

Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von »dot« (21.02.2012, 00:30)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

21.02.2012, 00:36

EDIT:
Ich seh grad das ich was ausgelassen hab:

Zitat

multithreaded Rendering

Hab micht ehrlichgesagt noch nie damit beschäftigt. ;)
Ich programmiere auch in letzter Zeit eher Anwendungen, da kommt es auf sowas nicht so an.
Gennerell kann ich es mir aber schon vorstellen. Man müsste die Funktionen entweder Kapseln und den Zugriff verwalten oder mehrere Renderingcontexte nutzen.

Mehrere Kontexte sind genau der Alptraum von dem ich vorhin gesprochen hab. Aber damit muss man sich ja auch schon rumschlagen wenn man z.B. nur auf mehreren Bildschirmen/Grafikarten rendern will. (Multidisplay ist wieder so eine Sache die in Direct3D ganz klar und simpel gelöst ist, in OpenGL aber zur Qual wird, bzw. eh auch wieder nicht plattformunabhängig machbar ist)
Multithreaded Rendering im Stile von Direct3D (paralleles Füllen von Command Buffern) ist mit OpenGL momentan afaik absolut unmöglich.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (21.02.2012, 00:47)


  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

21.02.2012, 00:48

Zitat

Abgesehen davon deckt OpenGL nicht alles ab was man in einer ernsthaften Anwendung braucht. Enumeration und Context Creation laufen beispielsweise eben nur über Plattformspezifische APIs (wgl, glx etc.).

Volle zustimmung. Ist nicht gerade Ideal bei OpenGL.
Zum Glück greift hier OpenTK dem Entwickler unter die Arme. :)
Da gibt es unteranderem ein OpenGL Control.
Es können sogar problemlos mehere parallel betrieben werden. :)

Neulich wollte ich für mein Ressourcen Managment Daten über den GPU Speicher auslesen.
Was war die Lösung? Drei verschiedene Extensions von Nvidea und ATI. :cursing:

Gibt es in DirectX eine Möglichkeit Daten über die Speicherauslasung zu ermitteln?

Zitat

sondern von der Möglichkeit, Vertices über den Vertex Shader zu erzeugen ohne einen Buffer zu verwenden

Sowas Änliches ist mit OpenGL und Instanzing(Extension :D) oder Geometry Shader möglich.

Zitat

Genau das: Lesen und Schreiben aus dem/in den Grafikspeicher vom Shader aus

Schreiben geht auch mit TransformFeedback. (Ebenfalls Extension :D)

Zitat

Wenn du eine Direct3D 9 fähige Grafikkarte oder besser hast, dann läuft's bei dir.

Ich weiß nur das DirectX 11 Samples aus dem SDK bei mir grundsätzlich abgestürtzt sind.

Zitat

Ich halte zwar nicht viel von Wrappern

Auch dein toller Renderer ist im Prinzip ein Wrapper.

Zitat

Was war denn die letzte Version von Direct3D mit der du so zu tun hattest?

DirectX 9(aus C++) und *räusper* Managed DirectX. ^^

Zitat

Ich halte zwar nicht viel von Wrappern, aber es würde mich sehr interessieren wie du da vorgehst.

Ich weiß nicht wo da die große Schwierigkeit ist. :huh:
Wenn du willst kann ich dir auch Code zeigen.

EDIT:
Nochmal zur Performace:
Normalerweiße liest man, das OpenGL ein klein wenig schneller ist.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

21.02.2012, 00:57

Gibt es in DirectX eine Möglichkeit Daten über die Speicherauslasung zu ermitteln?

Nein. Das ist nicht wirklich sinnvoll möglich, da der Grafikspeicher unter Windows virtualisiert ist.

Zitat

sondern von der Möglichkeit, Vertices über den Vertex Shader zu erzeugen ohne einen Buffer zu verwenden

Sowas Änliches ist mit OpenGL und Instanzing(Extension :D) oder Geometry Shader möglich.

Nein, das ist was völlig anderes.

Zitat

Genau das: Lesen und Schreiben aus dem/in den Grafikspeicher vom Shader aus

Schreiben geht auch mit TransformFeedback. (Ebenfalls Extension :D)

Nein, das ist was völlig anderes.

Zitat

Wenn du eine Direct3D 9 fähige Grafikkarte oder besser hast, dann läuft's bei dir.

Ich weiß nur das DirectX 11 Samples aus dem SDK bei mir grundsätzlich abgestürtzt sind.

Natürlich laufen keine Dinge die Direct3D 11 Hardware benötigen auf dieser Karte. Nichts desto trotz kannst du in Direct3D 11 programmieren, du musst dich eben auf den entsprechenden Feature Level beschränken.

Zitat

Ich halte zwar nicht viel von Wrappern

Auch dein toller Renderer ist im Prinzip ein Wrapper.

Nein.

Zitat

Was war denn die letzte Version von Direct3D mit der du so zu tun hattest?

DirectX 9(aus C++) und *räusper* Managed DirectX. ^^

Gegenüber Direct3D 9 hat sich inzwischen sehr viel verändert.

Zitat

Ich halte zwar nicht viel von Wrappern, aber es würde mich sehr interessieren wie du da vorgehst.

Ich weiß nicht wo da die große Schwierigkeit ist. :huh:
Wenn du willst kann ich dir auch Code zeigen.

Erklär mir einfach nur wie du z.B. eine OpenGL Textur vernünftig in eine Klasse wrappen willst. Du hast also diese Klasse mit der Texture id als Member. Was für Methoden hat diese Klasse nun und wie implementierst du sie?
Sämtliche OpenGL Calls die auf Texturen arbeiten, referenzieren nicht direkt ein Texturobjekt, sondern beziehen sich auf ein globales Texture Target. Bevor du irgendwas mit einer Texture machen kannst, musst du sie zuerst in ein entsprechendes Target binden. Wenn du deiner Klasse also irgendwelche Methoden im Sinne der OOP verpassen willst, dann musst du am Anfang jeder Methode ein glBindTexture() stehen haben, was wahnsinnig ineffizient ist.
Die exakt selben Probleme hast du mit fast allen anderen OpenGL Objekten.
Wenn du eine gute Lösung dafür hast, dann würd ich sie wirklich sehr gern sehen, denn ich hab noch keine gefunden mit der ich zufrieden gewesen wäre...

EDIT:
Nochmal zur Performace:
Normalerweiße liest man, das OpenGL ein klein wenig schneller ist.

Man sollte eben nicht alles glauben was man liest ;)

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (21.02.2012, 01:12)


  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

16

21.02.2012, 01:14

Zitat

Nein, das ist was völlig anderes.

Wo liegen die Unterschiede?

Ist natürlich nicht genau das selbe, kann aber das andere Ersetzten.


Zitat

Auch dein toller Renderer ist im Prinzip ein Wrapper.
Nein.

Ich würde schon sagen das dein Renderer in diese Kategorien fällt:

Zitat

Allow code to work together which otherwise cannot (e.g. Incompatible data formats).
Enable cross language and/or runtime interoperability.


Zitat

Gegenüber Direct3D 9 hat sich inzwischen sehr viel verändert.

Schon möglich.
Für mich ist DirectX 10 oder höher aber wegen der XP inkompatibilität nicht spruchreif.

Zitat

Was für Methoden hat diese Klasse nun und wie implementierst du sie?
Sämtliche OpenGL calls die auf Texturen arbeiten, referenzieren nicht direkt ein Texturobjekt, sondern beziehen sich auf ein globales Texture Target. Bevor du irgendwas mit einer Texture machen kannst, musst du sie also zuerst in ein entsprechendes Target binden. Wenn du deiner Klasse also irgendwelche Methoden im Sinne der OOP verpassen willst, dann musst du am Anfang jeder Methode ein glBindTexture() stehen haben, was wahnsinnig ineffizient ist.

Schon klar.
Aber wo ist da das Problem?
Entweder meine Texture Klassen hat ein "Begin" und ein "End" oder ich merke mir die momentan aktive Texture global und setzte diese fals nötig automatisch.

Zitat

Man sollte eben nicht alles glauben was man liest.

DU sagst es. ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

21.02.2012, 01:34

Zitat

Nein, das ist was völlig anderes.

Wo liegen die Unterschiede?

Ist natürlich nicht genau das selbe, kann aber das andere Ersetzten.

Nein kann es nicht. Genaueres siehe z.B. der verlinkte Artikel. Ansonsten überleg dir einfach mal kurz, wie du z.B. sowas umsetzen würdest ;)

Zitat

Auch dein toller Renderer ist im Prinzip ein Wrapper.
Nein.

Ich würde schon sagen das dein Renderer in diese Kategorien fällt:

Zitat

Allow code to work together which otherwise cannot (e.g. Incompatible data formats).
Enable cross language and/or runtime interoperability.

Ein Wrapper (auch bekannt als Adapter) ist ein Layer, dessen primärer Zweck nicht die Abstraktion, sondern das Anpassen einer Schnittstelle an eine andere Schnittstelle ist.
Wenn ich einen Renderer für eine Anwendung schreibe, dann ist das bei mir eine anwendungsspezifische Abstraktion und kein Adapter.

Zitat

Gegenüber Direct3D 9 hat sich inzwischen sehr viel verändert.

Schon möglich.
Für mich ist DirectX 10 oder höher aber wegen der XP inkompatibilität nicht spruchreif.

Ja, wenn du XP unterstützen musst, dann bleibt dir nur Direct3D 9.

Zitat

Was für Methoden hat diese Klasse nun und wie implementierst du sie?
Sämtliche OpenGL calls die auf Texturen arbeiten, referenzieren nicht direkt ein Texturobjekt, sondern beziehen sich auf ein globales Texture Target. Bevor du irgendwas mit einer Texture machen kannst, musst du sie also zuerst in ein entsprechendes Target binden. Wenn du deiner Klasse also irgendwelche Methoden im Sinne der OOP verpassen willst, dann musst du am Anfang jeder Methode ein glBindTexture() stehen haben, was wahnsinnig ineffizient ist.

Schon klar.
Aber wo ist da das Problem?
Entweder meine Texture Klassen hat ein "Begin" und ein "End" oder ich merke mir die momentan aktive Texture global und setzte diese fals nötig automatisch.

Das ist aber imo weder gut noch sinnvoll. Denn damit kann ich nun sowas machen:

C-/C++-Quelltext

1
2
texture1.bind();
texture2.doSmth();  // tut was mit texture 1

Imo ein sehr deutliches Zeichen, dass das da keine Methoden sein sollten.

Zitat

Man sollte eben nicht alles glauben was man liest.

DU sagst es. ;)

Ich empfehle sehr, bei Artikeln die sowas behaupten das Datum zu beachten. Das übliche Argument warum OpenGL angeblich schneller sein soll, ist dass OpenGL direkt durch den Treiber implementiert wird und dabei viel im User Mode machen kann, während Direct3D eine Runtime dazwischen hat und viel öfter einen Kernel Call absetzten muss.
Vor in etwa 15 Jahren war das sogar korrekt. Aber schon damals hat das in der Praxis keine Rolle gespielt.
Und heute besitzt auch die Direct3D Architektur einen eigenen User Mode und einen Kernel Mode Layer. Und abgesehen davon ist das State Management in Direct3D extrem effizient. Die ganze API wurde mit Direct3D 10 von Grund auf neu designed, wobei minimaler Overhead eines der Hauptziele war. Ich würde sogar davon ausgehen, dass Direct3D mittlerweile einen Perfomancevorteil hat was das betrifft.
Brauchbare Treiber vorausgesetzt, ist mir in der Praxis aber bisher noch nie ein irgendwie nennenswerter Unterschied aufgefallen, wobei ich allerdings auch noch nie direkt verglichen habe.

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (21.02.2012, 01:57)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

21.02.2012, 11:25

Abgespalten von hier.

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

19

21.02.2012, 12:08

DirectX oder OpenGL?

Zitat

Nein kann es nicht. Genaueres siehe z.B. der verlinkte Artikel. Ansonsten überleg dir einfach mal kurz, wie du z.B. sowas umsetzen würdest. ;)

Mich würde mal intressieren wie du sowas in DirectX umsetzten willst.
Und, es gibt immer Spezialfälle bei denen ein Ersetzen mit einer änlichen Technik nur schwer bis überhaupt nicht gelingt. ;)

zu den von dir gennanten Funktionen frag ich mich auch:
Wo zum Täufel brauch ich sowas? Ehrlich gesagt denke ich auch, dass du das bisher genause wenig gebraucht hast.
Wie du selbst schon festgestellt hast, existieren Extensions, die die Funktionen auch auf OpenGL zur Verfügung stellen. Bei DirectX darfst du die Funktionen genauso wenig voraussetzen.
Zummindest dieses Random Memory Access ist daher für mich unintressant, da es auf meinen Computer sowieso nicht läuft.

Zitat

Wenn ich einen Renderer für eine Anwendung schreibe, dann ist das bei mir eine anwendungsspezifische Abstraktion und kein Adapter.

Stimmt natürlich.
Wenn du aber einen Renderer für unterschiedliche Grafik API schreibst, muss er Codeteile enthalten die wie ein Wrapper fungieren.

Zitat

Das ist aber imo weder gut noch sinnvoll. Denn damit kann ich nun sowas machen:

Das ist aber nicht die Schuld von OpenGL sondern vom Programmierer.
Auch OpenGL schützt vor Torheit nicht. ;)
Verantwortungsvolles Programmieren sollte man bei OpenGL und DirectX beherschen.

Zitat

Ich empfehle sehr, bei Artikeln die sowas behaupten das Datum zu beachten. Das übliche Argument warum OpenGL angeblich schneller sein soll

Zitat aus Wikipedia:

Zitat

Draw Call-Kosten sind niedriger als in Direct3D, was zu einer besseren Performance führt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

21.02.2012, 12:48

Zitat aus Wikipedia:

Zitat
Draw Call-Kosten sind niedriger als in Direct3D, was zu einer besseren Performance führt.


Nicht alles was Wikipedia verbreitet muss auch stimmen. Die Quelle von Wikipedia ist immerhin 6 Jahre alt.

Immerhin ist selbst Carmack der Meinung das Direct3D is now better than OpenGL
@D13_Dreinig

Werbeanzeige