[Projekt] breeze 2.0

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

mnemonix hat geschrieben:Schick, gefällt mir der Editor. Sieht zumindest im Moment recht leichtgewichtig, also nicht überladen, aus. Die Modelle hast in Blender erstellt? Ach, und woher kommen in der Konsole immer diese E_INVALIDARG Fehler? ^^
Das ist eine intern gefangene Exception beim Resize der Targets, nämlich immer dann, wenn die Engine feststellt, dass sich für das Swap Chain Target kein Shader Resource View ("Textur") erstellen lässt; daraufhin lässt die Engine es einfach sein. ;)

Und ja, Leichtgewichtigkeit war das Ziel; schon alleine, weil ich nicht die Ressourcen habe, einzeln aufwendige Spezial-UIs zu schreiben. Die Engine bietet eine kompakte Reflection-Schnittstelle für Eigenschaften, Komponenten und Komponentenverwaltung. Der Editor kennt so fast nichts von der Engine und die Engine bietet Ressourcen-Verwaltung, Entities etc. einfach durch diese Schnittstelle an. Hat den Vorteil, dass die meiste neue Funktionalität ohne weiteres Zutun direkt im Editor landet. In der Entwicklung abseits des Editors läuft natürlich alles uneingeschränkt durch die normalen API-Schnittstellen, ohne Indirektion durch das Reflection-System.

Die Test-Modelle sind in der Tat in Blender hingehuddelt. Vielleicht suche ich mir ja irgendwann kompetente Grafiker. ;)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Noch ein Rat zum Schluss: Hütet euch vor frühzeitiger Spieler/Physik-Integration, sonst wird jeder Test zum Jumping Puzzle. :P

dev13.png
dev8.png
dev11.png
Anmerkung: ArtificialMind hat mich gestern dazu bewegt, FXAA zu integrieren. Entgegen meiner Vorurteile funktioniert Post Processing Anti-Aliasing auf "normaler" Geometrie gar nicht schlecht.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Krishty »

CodingCat hat geschrieben:Anmerkung: ArtificialMind hat mich gestern dazu bewegt, FXAA zu integrieren. Entgegen meiner Vorurteile funktioniert Post Processing Anti-Aliasing auf "normaler" Geometrie gar nicht schlecht.
Endlich! Das Aliasing hat mich vorher immer fast verrückt gemacht …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: [Projekt] breeze 2.0

Beitrag von eXile »

CodingCat hat geschrieben:Entgegen meiner Vorurteile funktioniert Post Processing Anti-Aliasing auf "normaler" Geometrie gar nicht schlecht.
Es wird auf sämtlichen geradlinigen, lokalen Kontrastunterschieden der Luminanz von Nicht-sRGB-Render-Targets gut funktionieren. ;)
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ich habe soeben die verbleibenden 3K LOC Alt-Code aus der Engine gelöscht; nach einem halben Jahr Kernsanierung habe ich nun endlich wieder von allem eine einzige vollständige Version. Das öffentliche Repository ist aktualisiert. Wenn ich jetzt noch die externen Bibliotheken (Qt!) in eine halbwegs zahme, ohne große Umstände kompilierbare Form bekäme, wäre ich tatsächlich nahe an einem ersten, out-of-the-box lauffähigen Release.

Bis dahin ist dieses "Release" weiterhin für die wenigen Hochinteressierten, die tatsächlich ab und an ihre Nase in fremden Code stecken. Von Interesse könnten hier die neuen datenorientierten Klassen für Entities und Mesh-Rendering sein. Diese setzen um, was ich in diesem Thread vor einiger Zeit skizziert hatte. Ich habe das Gefühl, hier langsam eine akzeptabel kompakte Form zu erreichen, allerdings würde ich die manuelle Indexschieberei gerne noch etwas minimieren.

Von Interesse könnte auch die Umsetzung von Hot Reload/Hot Swap sein, die ein einfaches Bus-System und regelmäßige Commit-Aufrufe nutzt, um auf aktualisierte Nachfolger bestehender Ressourcen zu reagieren.

Grauen findet sich in meinem Versuch, alle drei Lichttypen auf einmal über ein Template zu lösen; die Kombination von komplexer Rendering-Logik mit Datenorientierung und C++' Template-Syntax sorgt hier für maximales Programmiererglück.

Die aktualisierte Dokumentation ist möglicherweise noch weniger hilfreich als beim letzten Mal; ich hoffe fest darauf, im Laufe des Jahres eine lauffähige Projektmappe mit aussagekräftiger Beispielanwendung einchecken zu können.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Jonathan
Establishment
Beiträge: 2545
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Jonathan »

Ja, hört sich schon cool an. Hätte ich jetzt einen Monat oder so Zeit und keine anderen Projekte, würde ich mir das schon alles mal gerne komplett angucken und mich inspirieren lassen. Aber ich fürchte, ein kurzes Überfliegen und Probekompilieren wird kaum etwas bringen, und sehr viel mehr Zeit habe ich leider nicht.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 5047
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Geht mir genauso. Könnte spannend sein, die Konzepte zu studieren und im Zusammenspiel zu erleben. Aber die Zeit habe ich nicht, mich jetzt in diese Massen fremder Gewohnheiten und Gepflogenheiten einzuarbeiten.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Mir fällt es einfach schwer, deinen Code zu lesen. Das mag einerseits an persönlichen Gewohnheiten meinerseits liegen. Aber ich finde es schwierig, deine Konzepte aus deinem Code zu extrahieren.
Und da du alles aus c++ herausholen möchtest, was geht, leidet meiner meinung nach die Lesbarkeit und Verständlichkeit. Dazu kommt noch: eine 1000-Zeilen-Datei ist schwierig zu überfliegen. Vielleicht bin ich auch einfach zu blöd bzw. habe halt nicht genügend Zeit.

Gruß Kimmi
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Um das klarzustellen: Ich erwarte hier von niemandem, meinen Code zu studieren; ich lese ja auch nicht permanent den Code von anderen. Ich möchte den Code auch nicht als Ideallösung hinstellen, vielmehr ist er unter sehr spezifischen Gesichtspunkten entstanden, welche ich in meinen vielzähligen Beiträgen in diesem Forum bisweilen angedeutet habe. Ich stelle meinen Code online, um ein Beispiel für die mögliche Umsetzung dieser Punkte in einem größeren Gesamtprojekt zu bieten. Schlussendlich ist dieses ganze Projekt auch ein großes Experiment zur eleganten oder weniger eleganten Umsetzbarkeit oder Nichtumsetzbarkeit, Vereinbarkeit oder Unvereinbarkeit von systemischen Idealvorstellungen wie Effizienz durch datenorientierten Entwurf, langfristige Stabilität durch objektorientierten Entwurf (Modularität, Zustandsminimierung, Wiederverwendbarkeit, Einfachheit ...), Entkopplungsmöglichkeiten in C++ etc. Meine Suche ist hier nie abgeschlossen; ich hoffe, für einige dieser Punkte einigermaßen elegante Lösungen gefunden zu haben; und ich hoffe, für einige Punkte in Zukunft noch bessere Lösungen zu finden. Schlussendlich ist das Projekt groß, und auch meine Zeit begrenzt. ;)
kimmi hat geschrieben:Und da du alles aus c++ herausholen möchtest, was geht, leidet meiner meinung nach die Lesbarkeit und Verständlichkeit. Dazu kommt noch: eine 1000-Zeilen-Datei ist schwierig zu überfliegen. Vielleicht bin ich auch einfach zu blöd bzw. habe halt nicht genügend Zeit.
Dass Konzepte wie Datenorientierung mit der zusätzlichen Einführung von Speicherverwaltung und Speicherplatzierung in ohnehin schon nicht-triviale Probleme die Dinge nicht einfacher machen, ist klar. Meine Hoffnung ist hier, mit Datenstrukturen wie dem Structure-of-Array-vector Lösungen gefunden zu haben, die den Code nicht allzu sehr verschlimmern. Ich vermute, du sprichst mit der 1000-Zeilen-Datei die MeshControllers/LightControllers an; hier wäre es definitiv schön, noch eine Unterteilung in Render-Logik und Controller-Verwaltungslogik hinzubekommen. Meine Erfahrung mit datenorientiertem Entwurf ist noch sehr kurz und ich hoffe, dass ich die in meinem Code damit momentan einhergehende Kopplung von allgemeiner Verwaltung und spezifischer Logik noch etwas minimiert bekomme.
Davon abgesehen bin ich leider über den Punkt hinaus, an dem ich immer alles hochverständlich in winzige Häppchen teilen kann; irgendwann muss einfach ziemlich viel Funktionalität her, darunter dynamische Verwaltung und Reflection für den Editor, Ressourcen-Integration für Hot Swap etc. Hier denke ich, dass der Code bei näherem Hinsehen durchaus seinen Schrecken verliert, denn abgesehen von der großen Menge an zu erfüllenden Aufgaben sind die Zuständigkeiten in der Regel doch sehr klar verteilt.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Ich finde deine Ansätze auch oft sehr hilfreich, nur es kostet halt zur Zeit noch recht viel Zeit, diese heraus zu extrahieren :). Da sehe ich in deinem Code noch Potential.

Gruß Kimmi
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

kimmi hat geschrieben:Ich finde deine Ansätze auch oft sehr hilfreich, nur es kostet halt zur Zeit noch recht viel Zeit, diese heraus zu extrahieren :). Da sehe ich in deinem Code noch Potential.
Die Frage ist, inwieweit das Code für sich leisten kann. Abgesehen von einigen, teilweise bereits genannten Hot Spots, sehe ich nicht, inwieweit Änderungen am Code dies noch allzu stark verbessern könnten. Hier müsstest du wohl konkreter werden. ;)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Ok, ein Beispiel, was ich innerhalb von 1 Minute suchen gefunden habe: MeshController::Commit hat eine Looptiefe von etwa 4 ohne einen für mich hilfreichen Kommentar. Dazu sind viele structs gestreut, deren Sinn man nicht auf Anhieb versteht. Als Anwender muß ich mehrmals darüber nachdenken, was das alles soll und was da passiert. Sollte ich da einen Bug fixen müssen, hätte ich eine ziemlich große Einarbeitungszeit ( wo finde ich was etc. ).
Such doch mal nach Code-Reading in Google. Da findest du viele Dinge, die gerade auf Lesbarkeit abzielen, wenn du Hinweise haben möchtest.

Versteh mich nicht falsch, ich will nicht rummäkeln. Ich sehe das halt an den von dir hier gezeigten Stellen als ein Problem für mich und wollte dir einfach mal Feedback geben. Und das ist halt auch nur mein Feedback weil meine Meinung.

Gruß Kimmi
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

kimmi hat geschrieben:Ok, ein Beispiel, was ich innerhalb von 1 Minute suchen gefunden habe: MeshController::Commit hat eine Looptiefe von etwa 4 ohne einen für mich hilfreichen Kommentar. Dazu sind viele structs gestreut, deren Sinn man nicht auf Anhieb versteht. Als Anwender muß ich mehrmals darüber nachdenken, was das alles soll und was da passiert. Sollte ich da einen Bug fixen müssen, hätte ich eine ziemlich große Einarbeitungszeit ( wo finde ich was etc. ).
Such doch mal nach Code-Reading in Google. Da findest du viele Dinge, die gerade auf Lesbarkeit abzielen, wenn du Hinweise haben möchtest.
Die structs sind eigentlich nicht gestreut, sondern in ihrer Verschachtelung ein exaktes Abbild der Datenstruktur, die jeweils aufgebaut wird. Dass sich in der Mitte nochmal ein struct-Block findet, liegt daran, dass die entsprechende Datenstruktur erst im dort nachfolgenden Code Verwendung findet. Dass du im Falle einer Veränderung darüber nachdenken müsstest, ist unzweifelhaft, immerhin ist die Datenstruktur alles andere als trivial. Als bloßer Anwender siehst du vom Inhalt der gesamten Datei im Übrigen nichts. Es ist klar, dass der Code wenig dokumentiert ist; immerhin steht nicht in Aussicht, dass in allzu naher Zukunft viele Fremde daran werkeln werden.

Dass es wünschenswert wäre, die Datei nochmal in einen Verwaltungs- und einen Rendering-Teil zu unterteilen, hatte ich ja bereits angesprochen, da sind wir uns denke ich einig. Spannender ist deine Bemerkung zur Komplexität von Commit. Ich weiß, dass es zu den weit verbreiteten Best Practices gehört, verschachtelte Schleifen in eigene Funktionen/Methoden zu verpacken. Die dort aufgebaute Datenstruktur enthält einige Querverbindungen via Zeiger/Indizes; das was dort aufgebaut wird, hat einen starken Zusammenhang. Ist es nun transparenter, die Datenstruktur in wenigen kompakten Blöcken aufzubauen, oder den Aufbau gemäß Best Practices in kleine überschaubare Häppchen zu unterteilen?

Da du es so konkret ansprichst, hier das Experiment: Commit() vorher und nachher.

Auffällig ist, dass der Code vorher wesentlich kompakter (überschaubarer?) war. Dafür sind die Geltungsbereiche nun wesentlich klarer. Relevante Information wird in den Funktionsköpfen wiederholt (ins Gedächtnis gerufen?). Der Code enthält neben trivialen Verben nun auch kurze Halbsätze in den Funktionsnamen, die eine gewisse Absichtserklärung enthalten. Fazit: Der Ablauf ist nun klarer. Ist die Datenstruktur als Ganzes, mit ihren Zusammenhängen und Invarianten, ebenfalls leichter zu erfassen geworden?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Ich schau mir das später durch, gerade habe ich leider nicht die Zeit. Die Frage wegen Kompaktheit gegenüber kürzeren Funtionen / Methoden ist schwierig, da viel eigener Geschmack dabei. Kompakter lässt einem in der Tat den Algorithmus besser durchschauen. Allerdings verliere ich ab einer gewissen Komplexität die Übersicht. Ich denke, man muß beides gegeneinander abwägen.
Super finde ich, daß du so offen mit dieser Kritik umgehst.

Wegen den Structs: da hast du recht, sie bilden die Datenstruktur ab. Wenn man das erst mal gescnall hat, ist alles etwas leichter zu rallen :).

Gruß Kimmi
j.klugmann
Establishment
Beiträge: 201
Registriert: 07.07.2010, 13:00
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von j.klugmann »

Tatsächlich ist DOD ja ein Design-Konzept wie jedes andere auch, unterscheidet sich aber in Struktur und prinzipiell von üblichen imperativen OOP-Ansätzen. Ich nutze seit gut einem Jahr DOD in einem Projekt, in dem ich in Echtzeit Driver/Application-API Calls überwache und daraus einen analysierbaren Datenstrom forme und habe seither viele von Cats Tipps und Tricks, die er hier im Forum preisgibt, ins Programm eingebaut. Klar, Cats Code könnte an einigen Stellen noch etwas übersichtlicher gestaltet werden, aber in welchem großen Projekt findet man nicht solche Stellen? Die geringe Lesbarkeit für andere Entwickler ergibt sich meines Erachtens nach, eher daraus, dass hier ein überwiegend unbekanntes Konzept verwendet wird, welches sich fundamental von üblichen Ansätzen in der C++/Java/C#-Welt unterscheidet. Ähnlich wie bei funktionalen Programmiersprachen erlangt man als Entwickler die Fähigkeit den entsprechenden Code schnell zu verstehen, erst mit Übung und Praxiserfahrung in der jeweiligen Sprache.

Ähnlich ist es meines Erachtens nach bei DOD auch, man braucht halt etwas Übung, um die dort üblichen Pattern und Abläufe zu verstehen. Bei anderen DOD-Projekten aus meinem Bekanntenkreis, die um Längen nicht an Cats C++-Expertise herankommen, ist die Lesbarkeit alleine durch die mangelnde Erfahrung stark beeinträchtigt. Mangelnde Lesbarkeit ist also kein DOD-Problem, sondern eine Schwäche des jeweiligen Teams. Ein weiterer Punkt, den ich an DOD sehr schätze ist, dass der Code durch die Orientierung am Datenstrom meist sehr selbsterklärend ist, sobald man DOD etwas kennengelernt hat. Mir reicht üblicherweise bei solchen Projekten eine reine API-Dokumentation.

Bin ich eigentlich der einzige, der regelmäßig durch Cats LeanCpp und Breeze-Repositories stöbert?
Imaging-Software und bald auch Middleware: http://fd-imaging.com
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

...
Bin ich eigentlich der einzige, der regelmäßig durch Cats LeanCpp und Breeze-Repositories stöbert?
Nein, daher mein Feedback :).
Ich kenne DOD noch aus alten Fortran-Tagen, wo dieses Design-Konzept ganz und gäbe ist. Auch wirst du es in vielen C-Projekten finden. Womit bewiesen wäre: kommt alles mal wieder, funktinierende Konzepte kommen vielleicht mal aus der Mode, aber selten in die Jahre.

Gruß Kimmi
j.klugmann
Establishment
Beiträge: 201
Registriert: 07.07.2010, 13:00
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von j.klugmann »

Große C-Projekte? Ich kenne kein einziges Open-Source Projekt.
Imaging-Software und bald auch Middleware: http://fd-imaging.com
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Blender? War meines Wissens mal komplett in c, keine Ahnung, ob das immer noch so ist.

Gruß Kimmi
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von dot »

j.klugmann hat geschrieben:Große C-Projekte? Ich kenne kein einziges Open-Source Projekt.
Linux? ;)
Benutzeravatar
Schrompf
Moderator
Beiträge: 5047
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Und was ist daran Daten-orientiertes Design?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von dot »

Ich dachte es ging um große Open Source Projekte in C... ;)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Nun ja, schaut man sich so manchen Datenentwurf in C bzw. anderen prozedualen Sprachen wie zum Beispiel Fortran an, wird genau dieses gemacht. Ich in meinem ersten Job beispielsweise habe genau den daten-orientierten Entwurf auf Performance-Gründen zu benutzen gelernt. Lesbar war das dann leider nicht immer. OOD brachte dann verständlicheren Code hervor, der allerdings nicht so cache-freundlich sprich nicht so performat war. Nun entdeckt man halt auch in c++ die alten Tricks aus Fortran wieder.

Gruß Kimmi
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Nunja, Cache-Optimierung von Datenstrukturen ist ja weder neu, noch je "aus der Mode" gewesen. Das, was gerade als "Data-oriented Design" gehypet wird, ist zwar meines Wissens nach nicht klar definiert worden, geht aber wie ich das verstehe wesentlich mehr in Richtung Entwurf. Dazu gehört das Grundprinzip der Gruppenverarbeitung, wo es mehrere Objekte gleichen Typs gibt, sowie die Bevorzugung direkter expliziter Ausformulierung gegenüber einer sukzessiven Durchlöcherung abstrakter Subsysteme und der damit verbundenen Akkumulation von Objektindirektionen. Schlussendlich steht dahinter die Erkenntnis, dass jede Abstraktionsebene auch eine Barriere darstellt, welche die Datenverarbeitung und den zugehörgigen Code tatsächlich umständlicher (nicht nur ineffizienter) macht, sofern diese Abstraktion nicht tatsächlich notwendig ist (weil tatsächlich polymorphe Objekte verarbeitet werden). Weiterhin lässt sich die Abstraktion selbst im polymorphen Fall oftmals eine Ebene höher schieben (Objektgruppen statt individueller Objekte), wobei durch den Wegfall der Abstraktion innerhalb der Gruppe der Datenzugriff wesentlich erleicht wird, ohne dabei die Abstraktion selbst zu verlieren.

Soweit die Theorie. In der Praxis möchte man dann natürlich auch die Möglichkeiten der Cache-Optimierung mitnehmen, was wieder viel Indexschieberei bedeuten kann. Hierbei handelt es sich jedoch prinzipiell schon um einen Optimierungsschritt, nicht mehr direkt um den datenorientierten Entwurf.

Nebenbei: Der Rettungsring jeder leeren Szene: Planares Wasser. ;)
dev23.png
dev24.png
(Ich muss mich unbedingt mal mit Normal Filtering / Specularity Anti-Aliasing befassen. Dieser Artikel sieht ganz brauchbar aus.)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von kimmi »

Die Art des Entwickeln in zum Beispiel Siumulationen in F77 richtet sich nach den Datenstrukturen, also genau wie in der von dir angewandten Art und Weise. Man schaut sich die Daten an, dann die Operationen auf die Daten, mit dem Input entwirft man den Code. Dann optimiert man. Deswegen kriegen heute F77-Entwickler auch ein sehr ansehnliches Gehalt, wenn sie alten Code aufarbeiten bzw. erweitern dürfen :). F77 ist nämlich nicht wirklich lesbar.

By the Way: Schicke Bilder...

Gruß Kimmi
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ein bisschen Parallax Mapping mit Tiefenanpassung (SV_DepthGreaterEqual) macht die Kantenwelt gleich viel glaubhafter.
parallax6.png
parallax5.png
(Billiges 16-Step-Ray-Marching mit stückweise linearer Höhenannahme. Korrekt skalierter Tangentenraum im Pixel Shader über Screen-Space-Derivatives konstruiert; für nicht-orthogonal texturierte Oberflächen bräuchte ich den Co-Tangentenraum; habe das hier aber noch nicht so weit durchschaut, dass ich die Skalierung der Co-Tangenten/Co-Bitangenten vollständig richtig hinbekomme.)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

CodingCat hat geschrieben:[...] habe das hier aber noch nicht so weit durchschaut, dass ich die Skalierung der Co-Tangenten/Co-Bitangenten vollständig richtig hinbekomme [...]
Nachtrag: Jetzt hab ichs, ist schlussendlich ganz einfach. Das, was im dort angegebenen Code fehlt, ist lediglich die Division durch die Determinante bei der Invertierung der 3x3-Matrix, die den Tangentenraum aufspannt. (Da der Code für Normal-Mapping gedacht ist, macht dort ein normierter Co-Tangentenraum wesentlich mehr Sinn als einer, der die absolute Skalierung der Texturkoordinaten respektiert.)

Ersetzt man im Angegebenen Code ...
float invmax = inversesqrt( max( dot(T,T), dot(B,B) ) );
... durch den Kehrwert der Determinante ...
float scale = 1.0f / dot(dp1, cross(dp2, N));
..., dann erhält man einen wunderschön skalierten Co-Tangentenraum, aufgespannt durch die zurückgegebene Matrix.

Mit der resultierenden Matrix ist dann auch die Transformation in nicht-orthogonale Tangentenräume kein Problem mehr. (Mein zuvoriger Ansatz: Im orthogonalen Fall reicht es aus, die Tangente und Bitangente mit dem Kehrwert ihrer jeweiligen Betragsquadrate zu skalieren, um den Co-Tangentenraum zu erhalten).

Toller Nebeneffekt dieser Mühen: Ich brauche ab sofort überhaupt keine vorberechneten Tangenten mehr, weder für Normal Mapping, noch für Parallax Mapping. Damit entfallen auch verlustbehaftete Kompressionen wie die Auslassung der Bitangenten, welche dann auch keine Korrektheit bei nicht-orthogonalen Tangentenräumen mehr erlaubt.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 5047
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Sieht schick aus! Warum aber GreaterOrEqual? Sollten neue Pixel nicht *vor* den alten sein, also eine geringere Tiefe haben, wenn sie sichtbar sein sollen? Und zur Optik: je mehr Shader man drauf wirft, desto mehr sieht man den Texturen an, dass die Höhen/Normalen nur aus der Diffuse erzeugt wurden. Aber die Grafiker machen das grad alle so, CrazyBump und Konsorten laden dazu ja regelrecht ein. Wird dauern, eh das wieder rausgewachsen ist.

Den Trick mit den Screen-Space-Derivatives muss ich mir merken, das könnte speziell für dynamisch erzeugte Geometrie eine wichtige Sache werden.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Krishty »

Er spricht nicht vom Vergleich, sondern von der Shader-Semantik (Conservative Depth Output). Die Tiefe über das Pseudoregister SV_DepthGreaterEqual auszugeben teilt der Hardware mit, dass die Tiefe, die man im Pixel Shader schreibt, größer oder gleich der Tiefe des interpolierten Dreiecks ist, das zum Rasterizer geschickt wurde. Dadurch können Pixel von der GPU teilweise verworfen werden ohne erst auf die Tiefenausgabe des Shaders warten zu müssen. (Tatsächlich ist es leicht komplizierter; siehe hier.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ganz genau, die virtuelle Geometrie liegt quasi unter der Oberfläche, d.h. Höhe 1 entspricht der tatsächlichen Oberfläche und Höhe 0 einer virtuellen Grundebene unter der Oberfläche. Entsprechend liegt virtuelle Geometrie allenfalls hinter der echten, nie davor, und die Hardware kann weiterhin Z-Culling vor Ausführung des teuren Parallax-Shaders durchführen.
Schrompf hat geschrieben:Und zur Optik: je mehr Shader man drauf wirft, desto mehr sieht man den Texturen an, dass die Höhen/Normalen nur aus der Diffuse erzeugt wurden. Aber die Grafiker machen das grad alle so, CrazyBump und Konsorten laden dazu ja regelrecht ein. Wird dauern, eh das wieder rausgewachsen ist.
Tatsächlich habe ich die gezeigte Textur von CG Textures einfach einmal durch die CrazyBump-Eval gejagt. Fine-Tuning ist leider gerade nicht, weil meine Eval aufgebraucht war, bevor ich Zeit hatte, die entsprechenden Dinge zu implementieren. Das geht sicher noch hübscher, insbesondere mit etwas gefaketem AO, korrekten Parallax-angepassten Schatten; weiterhin sollten diffuse Texturen wohl von sämtlicher Shading-Information befreit werden etc. Dazu gab es übrigens gerade einen netten FMX-Vortrag von Crytek.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 5047
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Ah, verstehe. Die GPU kann dann immernoch klassisch vorab den Tiefentest machen und muss nur nachher nochmal ran. Spannend.

Danke übrigens für den Vortrag-Link. Genau das meinte ich.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten