Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 16:18

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Best Practice: VAO und Shader
BeitragVerfasst: Mi Aug 19, 2015 18:11 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Guten Abend!
Arbeitet man mit VBOs, so will man natürlich auch direkt VAOs benutzen.
Per glEnableVertexAttribArray und anschließen glVertexAttribPointer würde man dann die entsprechenden Arrays an den Shader übergeben. Dafür braucht man jedoch den Index des Attributs im Shader. Das kann man nach dem Linken mit glGetAttribLocation heraus finden. Schön, jetzt habe ich für einen Shader und ein VBO ein VBA zusammen gebastelt.

Nun kommt ein zweiter Shader und schon passt das ganze nicht mehr zusammen?
Meine Idee wäre jetzt, dass ich für meine Engine vordefinierte Indizes verwende und das ganze dann mittels glBindAttribLocation regle. Dabei müssten diese Werte dann am besten mit denen von nVidia übereinstimmen, das es dort scheinbar zu Treiberproblem kommt, auch wenn ich nicht ganz verstanden habe, was das Problem ist. (hier, Vertex Attribute Aliasing, Seite 7) Erlaubt nVidia nicht irgendetwas den Index 2 zu zuordnen oder ist ein gl_Normal dann das gleiche, wie das, was man unter Index 2 angegeben hat?

So würde mein VAO einfach die festen Werte zugeordnet bekommen und die ganze Sache läuft für alle Shader? Und was passiert beim Wechsel? Wie muss ich hier verstehen, wie wird da was "gedeichselt"? :D

Idee der Implementierung wäre dann sowas wie shader->setAttribute(SHADER_ATTRIBUTE_VERTEX, "vertex")
Ziel ist es ja, nicht für jede Shader- und Model-Kombination ein eigenes VAO zu erstellen.


Oder gibt es da eine noch bessere Methode?
Danke für eure kreativen Vorschläge!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Mi Aug 19, 2015 19:21 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ja, es gibt eine bessere Lösung.
layout(location = X)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Mi Aug 19, 2015 19:39 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Also ich fasse zusammen. Ich einige mich mit mir selbst auf Indizes für die verschiedenen Attribute.
Im shader selbst muss ich dann festlegen welchen index die variable erhält.
Code:
  1. layout(location = 5) in vec3 position;

Und in meinem VAO würde ich dann einfach die Vertexkoordinaten auf 5 setzen?

Das heißt also insbesondere, dass ich mich nicht mehr mit den Namen der Variablen rum ärgern muss? :idea:
PS: und mit Uniforms geht das ganze auch so? <3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Mi Aug 19, 2015 22:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Ganz genau. Beachte aber, dass layout(location=x) erst seit OpenGL 3.3 für in und out bzw. ab OpenGL 4.3 für uniform funktioniert.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Do Aug 20, 2015 00:01 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Da er VAOs verwendet die selbst erst mit OpenGL 3.0 eingeführt werden, gehe ich davon aus das er modernes OpenGL benutzt. OpenGL 3.3 sollte es eigentlich überall geben wo es auch OpenGL 3.0 gibt.

Die Sache bei "Uniform" ist in der Tat ein wenig problematisch. Ich persönlich verwende dort "layout" nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Fr Aug 21, 2015 08:32 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Für Uniforms muss ich als trotzdem auf glGetUniformLocation zurück greifen, brauche also letzendlich doch wieder den Variablennamen.
Dann kann man ja auch direkt vordefinierte Namen verwenden. Ist zwar irgendwie unschön, aber naja. (glBindUniformLocation scheint es ja nicht zu geben)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Fr Aug 21, 2015 16:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Für Uniforms muss ich als trotzdem auf glGetUniformLocation zurück greifen, brauche also letzendlich doch wieder den Variablennamen.


Wen du keine Variablen speichern willst, kann du es auch so lösen.
Code:
  1. gluniform4fv(glgetUniformLocation(shaderProgram, "VecColor"), col);


Ist aber nicht unbedingt Zeit optimiert.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Fr Aug 21, 2015 18:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Desmulator hat geschrieben:
Für Uniforms muss ich als trotzdem auf glGetUniformLocation zurück greifen, brauche also letzendlich doch wieder den Variablennamen.
Dann kann man ja auch direkt vordefinierte Namen verwenden. Ist zwar irgendwie unschön, aber naja. (glBindUniformLocation scheint es ja nicht zu geben)


Schon mit UBOs und glGetUniformBlockIndex und glUniformBlockBinding probiert?

Oder ab GL 4.2 sowas :

Code:
  1. layout (std140, binding = 0) uniform uMatrices
  2. {
  3.   mat4 proj;
  4.   mat4 view;
  5.   mat4[64] model;
  6. };

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Sa Aug 22, 2015 10:35 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
mathias hat geschrieben:
Zitat:
Für Uniforms muss ich als trotzdem auf glGetUniformLocation zurück greifen, brauche also letzendlich doch wieder den Variablennamen.


Wen du keine Variablen speichern willst, kann du es auch so lösen.
Code:
  1. gluniform4fv(glgetUniformLocation(shaderProgram, "VecColor"), col);


Ist aber nicht unbedingt Zeit optimiert.


Das Problem ist viel mehr, dass ich keine Namen vorgeben möchte. Die Variablen werde ich natürlich speichern. Ich habe lieber eine Index fest gelegt als einen Namen. Nachher verbaut man sich mit Groß- und Kleinschreibung und sucht ewig nach dem Fehler. Ein Zahlenwert erscheint mir da irgendwie robuster.

Sascha Willems hat geschrieben:
Code:
  1. layout (std140, binding = 0) uniform uMatrices
  2. {
  3.   mat4 proj;
  4.   mat4 view;
  5.   mat4[64] model;
  6. };


Okay, das sieht interessant aus. Wie nutzt man denn effektiv diese Array? Einfach alle möglichen transformationen an den shader schicken und dann per uniform die entsprechende auswählen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Best Practice: VAO und Shader
BeitragVerfasst: Sa Aug 22, 2015 12:04 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
Okay, das sieht interessant aus. Wie nutzt man denn effektiv diese Array? Einfach alle möglichen transformationen an den shader schicken und dann per uniform die entsprechende auswählen?

Bei solchen Fragen wirfst du am Besten einen Blick ins OpenGL Wiki. Das DelphiGL Wiki ist da leider nicht mehr ganz auf dem Stand der Dinge. Das Stichwort ist UBO, bzw. Uniform Buffer: https://www.opengl.org/wiki/Uniform_Buffer_Object

Im Prinzip schreibst du die Daten einfach nach einander nach bestimmten Regeln in ein gewöhnliches Buffer Objekt. Das bindest du dann einfach an den Uniform Block im Shader.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.090s | 17 Queries | GZIP : On ]