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

Aktuelle Zeit: Do Mär 28, 2024 23:03

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 52 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Mo Nov 09, 2015 22:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Nein, wie viele Binding Points gleichzeitig aktiv sind. Deaktivierst du die zwischen den Meshes, teilen die sich die, oder hat jeder eigene?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Mo Nov 09, 2015 22:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Nein, wie viele Binding Points gleichzeitig aktiv sind.
Gemäss Fehlermeldung alle.

Zitat:
Deaktivierst du die zwischen den Meshes,
Nicht das ich wüsste, wie würde dies gehen ?

Zitat:
teilen die sich die, oder hat jeder eigene?
Jede Mesh hat die eigenen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Mo Nov 09, 2015 22:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Deaktivieren nicht direkt, ich meinte eher ob du die Indizes der Binding Points wiederverwendest.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Mo Nov 09, 2015 23:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Create wird bei jeder Mesh 2x aufgerufen, einaml für Light und einmal für Material.
UpdateBuffer bei jeder Änderung des Lichtes/Material.
Destroy beim entfernen der Mesh.

Code:
  1. type
  2.  
  3.   { TUBO }
  4.  
  5.   TUBO = class(TObject)
  6.   private
  7.     BindingPoint, buffer: GLuint;
  8.   public
  9.     constructor Create(Shader: TShader; UniformName: PGLchar; size: GLsizeiptr);
  10.     destructor Destroy; override;
  11.  
  12.     procedure UpdateBuffer(Data: PGLvoid; size: GLsizeiptr);
  13.   end;
  14.  
  15.  
  16. implementation
  17.  
  18. { TUBO }
  19.  
  20. constructor TUBO.Create(Shader: TShader; UniformName: PGLchar; size: GLsizeiptr);
  21. const
  22.   BPInc: GLuint = 0;
  23. var
  24.   id: GLuint;
  25. begin
  26.   inherited Create;
  27.   BindingPoint := BPInc;
  28.   Inc(BPInc);
  29.   glGenBuffers(1, @buffer);
  30.   id := glGetUniformBlockIndex(Shader.ID, UniformName);
  31.   if id = GL_INVALID_INDEX then begin
  32.     ShowMessage(UniformName + ' ' + IntToStr(GL_INVALID_INDEX));
  33.     Exit;
  34.   end;
  35.   glUniformBlockBinding(Shader.ID, id, BindingPoint);
  36.  
  37.   glBindBuffer(GL_UNIFORM_BUFFER, buffer);
  38.   glBufferData(GL_UNIFORM_BUFFER, size, nil, GL_DYNAMIC_DRAW);
  39.  
  40.   glBindBufferBase(GL_UNIFORM_BUFFER, BindingPoint, buffer);
  41. end;
  42.  
  43. destructor TUBO.Destroy;
  44. begin
  45.   glDeleteBuffers(1, @buffer);
  46.   inherited Destroy;
  47. end;
  48.  
  49. procedure TUBO.UpdateBuffer(Data: PGLvoid; size: GLsizeiptr);
  50. begin
  51.   glBindBuffer(GL_UNIFORM_BUFFER, buffer);
  52.   //  glBufferData(GL_UNIFORM_BUFFER, size, Data, GL_DYNAMIC_DRAW);
  53.   glBufferSubData(GL_UNIFORM_BUFFER, 0, size, Data);
  54.  
  55.   //  glBindBufferBase(GL_UNIFORM_BUFFER, BindingPoint, buffer);
  56. end;

_________________
OpenGL


Zuletzt geändert von mathias am Di Nov 10, 2015 19:39, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Mo Nov 09, 2015 23:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hat jeder Mesh seinen eigenen Shader? Wie sehen die IDs aus?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Di Nov 10, 2015 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Hat jeder Mesh seinen eigenen Shader?

Ja

Zitat:
Wie sehen die IDs aus?

Wen du damit die programObj, dann etwa so: 1, 4, 7, 10 ,13 usw.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Di Nov 10, 2015 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
mathias hat geschrieben:
Zitat:
Wie sehen die IDs aus?

Wen du damit die programObj, dann etwa so: 1, 4, 7, 10 ,13 usw.
Ich glaube Sascha meint, welchen Wert hat die Variable BindingPoint in deinen Instanzen der Klasse TUBO?

_________________
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: UnifomBlockObject
BeitragVerfasst: Di Nov 10, 2015 19:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Genau, wie die Binding Points aussehen. Ich kann mir nicht vorstellen dass du für jeden der 800 Meshes eindeutige Binding Points benötigst die alle gleichzeitig aktiv sind. Genau das sagt die Meldung ja, aber so komplex sind deine Shader ja wohl nicht, oder?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Di Nov 10, 2015 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Genau, wie die Binding Points aussehen.

Der erste Wert hat 0, anschliessend wird fortlaufen Inkrementiert.

Dies passiert hier:
Code:
  1.  
  2. const
  3.   BPInc: GLuint = 0;  
  4. ...
  5.   BindingPoint := BPInc;
  6.   Inc(BPInc);

So wie es aussieht, gibt es Probleme, wen dieser Wert etwas über 200 kommt.

Wen ich für Light immer 0 nehme und für Material 1 geht es auch nicht.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Di Nov 10, 2015 19:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Zitat:
Genau, wie die Binding Points aussehen.

Der erste Wert hat 0, anschliessend wird fortlaufen Inkrementiert.

Dies passiert hier:
Code:
  1.  
  2. const
  3.   BPInc: GLuint = 0;  
  4. ...
  5.   BindingPoint := BPInc;
  6.   Inc(BPInc);

So wie es aussieht, gibt es Probleme, wen dieser Wert etwas über 200 kommt.


Klar, du hast dann über 200 simultan aktive Binding Points und dass liegt über dem Hardwarelimit. Ich gehe aber nicht davon aus dass du auch nur eine Shaderpipeline aktiv hast die 200+ Binding Points verwendet, also musst du die halt einfach wiederverwenden. Wenn dein umfangreichstes Shaderset also 20 Binding Points hat (was viel wäre, sogar für ein Set dass die komplette Pipeline aus Vertex, Geometry, Tess Control, Tess Eval und Fragment umfasst) musst du die erneut nutzen wenn ein anderer Shader aktiviert wird.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Do Nov 12, 2015 16:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Du meinst, ich sollte in meinem Beispiel nur 2 UBOs erzeugen, einmal für Light und einmal für Material, und diese beiden dann in allen Shadern verwenden.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Do Nov 12, 2015 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Du meinst, ich sollte in meinem Beispiel nur 2 UBOs erzeugen, einmal für Light und einmal für Material, und diese beiden dann in allen Shadern verwenden.


Genau, und dann immer die selben Bindingpoints.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Do Nov 12, 2015 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wie würde dies dann aussehen ?

Muss ich für jeden Shader den ich erzeuge, ein
Code:
  1. id := glGetUniformBlockIndex(Shader.ID, UniformName);
aufrufen und die id merken ?

Und beim Updaten dann so ?

Code:
  1. procedure TUBO.UpdateBuffer(Data: PGLvoid; size: GLsizeiptr);
  2. begin
  3.   glBindBuffer(GL_UNIFORM_BUFFER, buffer);
  4.   glUniformBlockBinding(Shader.ID, id, BindingPoint);
  5.   glBufferSubData(GL_UNIFORM_BUFFER, 0, size, Data);
  6. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Do Nov 12, 2015 19:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Leg die Bindings doch direkt im Shader fest :
Code:
  1. layout (binding = 0) uniform UBO {
  2.     mat4 projection;
  3.     mat4 model;
  4.     mat4 viewM
  5.     float tessInner;
  6.     float tessOuter;
  7. } ubo;


Mach ich auch nur noch so. Wobei es bei der API die ich grade verwende sowas wie das ermitteln von Uniform locations zum Glück nicht mehr gibt. Da steuert man alles über bindings und locations im Shader, aber das geht bei modernem OpenGL ja auch und ist viel schicker als das Suchen der Locations / Binding Points.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: UnifomBlockObject
BeitragVerfasst: Do Nov 12, 2015 19:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Leg die Bindings doch direkt im Shader fest :


Code:
  1. 0(18) : error C7532: layout qualifier 'binding' requires "#version 420" or later
  2. 0(18) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable


Ich will aber gerne kompatibel zu OpenGL3.3 bleiben.


Irgendwie wird das ganze sehr kompliziert, um es in meine Classen zu integrieren.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 52 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.207s | 17 Queries | GZIP : On ]