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

11

27.06.2014, 20:11

Du meinst mit dieser eigenen Syntax so etwas wie location parameter = 0, o.ä. ? Denn eig. möchte ich bis OpenGL 3.0 schon unterstützen.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

12

27.06.2014, 20:43

Ja. Möchtest du des unterstützen oder musst du es unterstützen? Das ist ein Unterschied. Meiner Erfahrung nach gibt es relativ wenige GPUs die 3.0 unterstützen aber 3.3 nicht. Explizit auf 3.0 zu setzen scheint mir deshalb nicht Halbes und nichts Ganzes. Meine alte Grafikkarte wollte zum Beispiel nur bis 3.2, aber das nur weil die Treiber nicht geupdatet wurden. Es hat sich nicht umsonst die führende Versionsnummer nicht geändert. Ich würde dir echt raten wenn möglich auf 3.3 zu setzen, anstatt dich mit depracted Zeug die Hände dreckig zu machen und dann dafür nicht vollends aufwärts kompatibel zu sein. Und es sind echt ein paar wichtige Features für Shader hinzugekommen.

13

27.06.2014, 20:48

Nun, ich glaube ich habe einen "Workaround gefunden" platziert man an den Anfang der Datei so etwas, wie "@enable-syntax-replacement" (Darf ich auch das '@' verwenden, oder würde ich dir damit vor den Bug fahren?), dann wird mittels eines simplen Pre-processors die Syntax entfernt, und ein Post-Build step eingefügt, welcher die Location dann eben manuell bindet. Dann hätte man auch bei OpenGL 3.0 die gleiche Syntax. Zur anderen Frage: Ob ich muss ist relativ. Bei meinem Projekt habe ich mir eben felsenfest vorgenommen ab OpenGL 3.0 zu unterstützen, und es würde mich doch etwas ärgern, wenn ich das umstellen würde... :S )

Für alle die es jetzt überhaupt noch interessieren sollte: Ich habe den Source-Code des EFX-Parser mal isoliert und hochgeladen. Hier könnt ihr ihn euch als ZIP-Archiv runterladen: http://dl.garishland.de/d2/libefx.zip

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

27.06.2014, 21:14

Wenn du auch das Zeichen verwenden willst, warum nicht? Wenn dann freut es mich doch eher wenn man sieht, dass die Beiträge "sogar" ;) gelesen werden.

Das mit OpenGL würde ich nochmal überdenken. Ich kann schon verstehen, dass du es vermeiden willst mit der ursprünglichen Annahme. Nur um jetzt die "Locations" direkt anzugeben, würde ich jetzt auch nicht 3.3 voraussetzen. Ein Umstieg würde ich mir eher generell durchführen und dann mit den vielen anderen Features gemeinsam schrittweise erfolgen lassen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (27.06.2014, 21:25)


15

27.06.2014, 21:30

Hmmm.... Es klingt schon schlüssig, was du sagst, und im Endeffekt spricht wohl auch tatsächlich nichts dagegen. Wie du schon erwähnt hast, ist die Anzahl der Grafikkarten, welche OpenGL 3.0 aber nicht OpenGL 3.3 unterstützen, schwindend gering. Von daher sollten also keine Probleme auftreten, zumal ich überhaupt keine Legacy-Funktionen verwende. Auch die Kontext-Erstellung (Marke Eigenbau, genauso wie Fenster, sowohl auf Linux als auch auf Windows) habe ich so aufgebaut, dass ich nur eine Zeile ändern muss, um die Version zu wechseln. Also glaube ich, dass ich deinen Vorschlag in die Tat umsetzen werde. Der EFX-Parser... Ich weiß jetzt ehrlich gesagt nicht, was ich damit machen soll. Wieder ausbauen, und durch ein anderes, einfacheres Format ersetzen? Oder aber das Format einfach etwas anpassen, d.h. nur noch die eingebetteten Shader-Codes drinlassen, Mappings entfernen, und dann eben so parsen? Btw, die Idee mit dem @AllShaders- finde ich ziemlich gut. Würdest du mir erlauben, sie zu übernehmen? Generell muss ich sagen, deine Antworten haben mir immens geholfen, da ich davor zwar über Location-Definierung (oder hat das einen besonderen Namen, und ich kenne ihn nur nicht ?( ) wusste, mich aber nie wirklich entscheiden konnte, was ich machen soll. Außerdem habe ich mir mal vor Augen geführt, wie viel Overhead die momentane Implementierung mit sich führt. Das ist ja erschreckend! Auch da zeigen die Layouts dann doch ihre starke Seite. Dass sie sogar mehr oder weniger ein inoffizieller "Standard" sind, wusste ich ebenso wenig. Im jedem Falle klingt die Methode plausibel, und meine Verunsicherung hast du aus dem Weg geräumt, soll heißen, was mich von ihr ferngehalten hat, besteht jetzt nicht mehr, und ich bemerke, dass sie weitaus vorteilhafter ist. Danke dir!

Wenn du auch das Zeichen verwenden willst, warum nicht? Wenn dann freut es mich doch eher wenn man sieht, dass die Beiträge "sogar" gelesen werden.

Ich bin verwirrt. Sogar ziemlich. Warum sollte ich die Beiträge denn nicht lesen? Ich frage doch nach etwas, ich kann doch froh, dass sich jemand seine eigene, kostbare Zeit nimmt, nur um mir zu helfen. Also ich finde, dass man zumindest so viel Respekt haben sollte.

Also: Nächster Schritt: Auf OpenGL 3.3 umstellen, und kompilieren. Dann das Shader-Format ersetzen / abändern, und mit Layouts arbeiten

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

16

27.06.2014, 22:42

Zitat

zumal ich überhaupt keine Legacy-Funktionen verwende.

Sicher? :P Ich habe zum Teil auch erst gemerkt was alles depracted ist, als mein Core Profile es mir um die Ohren gehauen hat. Du solltest langfrstig dann unbedingt explizit ein Core-Profile erstellen und kein Compatibility Profile. Das lässt alles durchgehen. Zum Teil sind Kleinigkeiten deprecated, auf die wäre ich sonst nie gekommen. (Zum Beispiel "glGetString(GL_EXTENSIONS)")

Zitat

Der EFX-Parser... Ich weiß jetzt ehrlich gesagt nicht, was ich damit machen soll. Wieder ausbauen, und durch ein anderes, einfacheres Format ersetzen?

Ich denke, ein gewisse Vorverarbeitung von Shadern ist notwendig bzw. vereinfacht einiges. So etwas wie alle Shader in einer Datei finde ich persönlich dramatisch praktisch im Vergleich zu dem in der Regel 2-3 mal höheren sonst Dateiwirrwarr. Meine Shaderverwaltung kann, wenn verfügbar, auch die Shaderbinaries(4.1 oder auch schon früher mit der Äquivalenten "ARB_get_program_binary") automatisch cachen und abgleichen. Außerdem kann sie automatisch Defines für "Konstanten-Interop" einfügen. Ich für mich will diese Features nicht mehr vermissen.

Zitat

Btw, die Idee mit dem @AllShaders- finde ich ziemlich gut. Würdest du mir erlauben, sie zu übernehmen?

Warum nicht? Warum sollte ich hier meine Vorschläge anpreisen, wenn man sie dann nicht verwenden soll/darf? ;)

Zitat

Location-Definierung (oder hat das einen besonderen Namen, und ich kenne ihn nur nicht)

Die Syntax im Shader heißt wohl "explicit attribute location". So nennt sich zumindest auch die entsprechende Core Extension.

Zitat

Warum sollte ich die Beiträge denn nicht lesen?

Das war auch nicht an dich gerichtet sondern eigentlich eher ironisch gemeint. Deshalb Smiley und Anführungszeichen... Es gibt genug Leute die das nämlich wirklich tun, oder es zumindest so den Eindruck machen.

Um noch zwei wichtige zentrale Neuerungen seit OpenGL 3.0 zu nennen, die man noch ergänzen sollte: Uniform Buffer Object(!) & Texture Buffer

17

27.06.2014, 22:55

Uniform Buffer Object sagt mir im Entfernten etwas, in Texture Buffer muss ich mich wohl erst mal einlesen 8| Kennst du generell irgendwelche Diskussionen über dieses Theme, beziehungsweise Shader-Management im Allgemeinen? Ich besitze zwar das OpenGL Shading Language Cookbook, allerdings muss ich gestehen, dass ich etwas enttäuscht davon bin.

Was meinst du mit "Konstanten-Interop"? Das will sich mir jetzt nicht wirklich erschließen.... Meinst du damit, dass deine Shader-Verwaltung Code "injiziert", welcher die Locations für die einzelnen Attribute via Defines bereitstellt, etwa so #define POSITION_LOC [...] layout(location=POSITION_LOC) in vec3 aPosition;?

Sicher? Ich habe zum Teil auch erst gemerkt was alles depracted ist, als mein Core Profile es mir um die Ohren gehauen hat. Du solltest langfrstig dann unbedingt explizit ein Core-Profile erstellen und kein Compatibility Profile. Das lässt alles durchgehen. Zum Teil sind Kleinigkeiten deprecated, auf die wäre ich sonst nie gekommen. (Zum Beispiel "glGetString(GL_EXTENSIONS)")


Mmhmm.. ich sollte es auf jeden Fall einmal darauf ankommen lassen, um zu sehen in wie weit ich wirklich beim Core-Profile bin. Danke für den Hinweis.

Das war auch nicht an dich gerichtet sondern eigentlich eher ironisch gemeint. Deshalb Smiley und Anführungszeichen... Es gibt genug Leute die das nämlich wirklich tun, oder es zumindest so den Eindruck machen.


Das habe ich auch schon so verstanden. Ich war nur erstaunt, dass es wohl Leute gibt, die Fragen, und nicht zuhören, da ich mir nicht erklären kann, wieso sie dann fragen. 8|

Im Zuge der Locations habe ich noch eine weitere Frage: Welche Möglichkeiten gibt es, Attribute mit verschiedenen Sets zu verwalten, etwa Textur-Koordinaten. Da gibt es die ersten Texture-Koordinaten, die Zweiten, die Dritten evtl. auch noch, .... Auch hier wieder explizite Locations? Wie sieht es mit Texturen aus? Explizite Locations für Diffuse-Texture, Specular-Texture, und co. oder aber dynamisch mittels Material und Parameter-Name verlinkt?

Entschuldige bitte, wenn diese Fragen jetzt einfach nur stupide klingen, aber Shader-Parameter sind einfach ein Thema, bei dem ich nicht wirklich durchblicke. Shader an sich sind eine wirklich feine Sache, aber die Verwaltung ihrer Parameter fordert mich momentan.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

18

27.06.2014, 23:28

Wegen dem Uniform Buffer Object... kurz zusammengefasst: Mehrere Uniforms in einem Buffer. Außerdem einheitliche Schnittstelle im Shader, so das die Uniform Buffer zwischen Shader ausgetauscht werden können, ohne die Daten neu auf die GPU hochzuladen. Im DirectX Jargon sind das, soweit ich weiß, dann die Constant Buffer.
Texture Buffer sind ein ähnliches Konzept, können allerdings in der Regel viel größer werden. Sie sind im Prinzip einfach eine Möglichkeit beliebige Buffer ähnlich einer 1D Texture zuzugreifen. Deshalb der Name.

Für weitere Informationen, als beste Quelle empfinde ich inzwischen meist das OpenGL Wiki: https://www.opengl.org/wiki/Main_Page
Ist auch wirklich relativ aktuell und frei von deprecated Zeugs.

Das mit Konstanten-Interop habe ich in der Tat so gemeint. Ich habe das bisher aber nicht für "Locations" verwendet, obwohl das natürlich gehen würde.

Zitat

Welche Möglichkeiten gibt es, Attribute mit verschiedenen Sets zu verwalten, etwa Textur-Koordinaten.

Einfach mehrere Locations? Sinnvollerweise vielleicht in Reihe, aber nicht einmal das wäre notwendig. Die 1. Texturkoordinate ist halt dann meinetwegen 3, die 2. 4 die 5. 6 und so weiter. Soviele Texturkoordinaten braucht man doch aber in der Regel eh nicht?

Zitat

Wie sieht es mit Texturen aus?

Texturen haben keine Locations sondern nur Texture Units die man auch jederzeit ändern könnte, weil sie ja auch Uniforms sind. Normalerweise macht es natürlich Sinn, die Textur immer in der Gleiche und auch an die erste freie Texture Unit zu binden.

Kann es sein dass du Uniforms und Vertex Attribute durcheinander bringst? Uniforms(und damit auch Texturen die bekanntlich über Sampler Uniforms zugänglich gemacht werden) sind immer gleich während des gesamten Draw-Calls. Vertex-Attribute ändern sich mit jeden Vertex. Vertex Attribute kommen aus einem VAO und aus einem VBO. Wenn man diese in mehreren Shadern benutzen will, müssen deren Locations natürlich gleich gesetzt sein. Uniforms hingen werden ja direkt gesetzt und deren Location muss ausgelesen werden. (Jedenfalls noch in 3.3)

19

27.06.2014, 23:34

Nein, was Uniforms und Attribute sind weiß ich schon, was ich nicht weiß, wie unterschiedliche Texturen, wie etwa Diffuse-, Gloss-, und dann evtl. noch Normal-Map jeweils an die richtige Stelle übergeben werden können, da das ja nicht einmal mit Locations richtig lösbar scheint. Im Endeffekt also: Woher weiß ich, an welchen Parameter ich die Texture-Unit einer bestimmten Textur übergeben soll. Das müsste meines Wissens nach im Material definiert werden, oder?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

20

27.06.2014, 23:58

Du initialierst die Sampleruniforms einfach mit aufsteigend Indices die ja für die Texture Unit steht.
An diese bindest du dann einfach die richtigen Texturen.
Das kannn man eigentlich ähnlich organisieren wie die Locations der Vertexattribute.
Aber irgendwie bin ich mir auch ein bisschen unsicher was du jetzt wissen willst, bzw. was jetzt dein Problem eigentlich ist.

Werbeanzeige