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

Aktuelle Zeit: Do Mär 28, 2024 12:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Standard Werte in struct
BeitragVerfasst: So Jan 25, 2015 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Kann man bei struct auch Default-Werte zuweisen ?

Code:
  1. struct Ttest
  2. {
  3.   float x;
  4.   float y;
  5. };
  6.  
  7. uniform Ttest test = (3.3, 4.4); // geht nicht, Syntax-Fehler
  8.  
  9. uniform float UmgebungsLicht = 0.3;  // geht    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: So Jan 25, 2015 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
So sollte es gehen (untested):
Code:
  1. uniform Ttest test = Ttest(3.3, 4.4);

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: So Jan 25, 2015 20:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Danke, jetzt geht es, dies kompiliert er ohne Fehler.

Code:
  1. struct Light
  2. {
  3.   vec4 position;
  4.   vec4 ambientColor;
  5.   vec4 diffuseColor;
  6.   vec4 specularColor;
  7.   vec3 specularDirection;
  8. };
  9.  
  10. uniform Light light = Light(
  11.   vec4(-1.5, 1.5, 1.5, 1.0),
  12.   vec4(0.2, 0.2, 0.2, 1.0),
  13.   vec4(0.8, 0.8, 0.8, 1.0),
  14.   vec4(1.0, 1.0, 1.0, 1.0),
  15.   vec3(0.0, 0.0, -1.0)
  16. );    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Mi Jan 28, 2015 22:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe folgenden Code gefunden.
Code:
  1. layout (std140) uniform Materials {
  2.     vec4 diffuse;
  3. };

Wen ich dort eine Standard-wert zuweisen will, kommt ein Fehler.
Code:
  1. layout (std140) uniform Materials {
  2.   vec4 diffuse = vec4(0.1, 1.0, 1.0, 1.0);
  3. };  

Muss ich da den Umweg über struct machen ?

Was macht layout (std140), mit google habe ich nichts schlaues gefunden ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Do Jan 29, 2015 12:15 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ein Blick ins OpenGL Wiki:
https://www.opengl.org/wiki/GLSL_Interf ... ory_layout


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: So Feb 01, 2015 23:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Jetzt weiss ich wie man Block-Uniform ansprechen kann.

Shader:

Code:
  1. layout (std140) uniform Materials {
  2.   vec4 diffuse;    // Farbe
  3.   vec4 ambient;    // Umgebungslicht
  4.   vec4 specular;   // Spiegelnd
  5.   float shininess; // Glanz
  6. };


Code:
  1. type
  2.   TMaterial = record
  3.     diffuse: TVector4f;    // Farbe
  4.     ambient: TVector4f;    // Umgebungslicht
  5.     specular: TVector4f;   // Spiegelnd
  6.     shininess: glFloat;    // Glanz
  7.   end;
  8.  
  9. const
  10.   Material: TMaterial = (
  11.     diffuse: (0.2, 0.05, 0.05, 1.0);
  12.     ambient: (0.1, 0.1, 0.1, 1.0);
  13.     specular: (0.1, 0.1, 0.1, 1.0);
  14.     shininess: 0.1);  
  15.  
  16. var
  17.   Mat_ID, buffer: gluint;
  18.   bindingPoint: gluint = 1;  
  19.  
  20. ...
  21.     Mat_ID := glGetUniformBlockIndex(Program_ID, 'Materials');
  22.     glUniformBlockBinding(Program_ID, Mat_ID, bindingPoint);
  23.  
  24.     glGenBuffers(1, @buffer);
  25.     glBindBuffer(GL_UNIFORM_BUFFER, buffer);
  26.  
  27.     glBufferData(GL_UNIFORM_BUFFER, sizeof(Material), @Material, GL_DYNAMIC_DRAW);
  28.     glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, buffer);
  29.  
  30. //    glDeleteBuffers(1, @buffer);


Ich nehme mal an, das dies die schnellere Variante ist, als jede Uniform-Variable einzeln zu übergeben.

Sind Uniform Übergabe eine teure Sache ?
Oder merkt man es nicht gross, wen man bei jedem Draw-Scene es aufruft ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Mo Feb 02, 2015 08:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Uniform bilden aktuell(OpenGL 3 und aufwärts) das größte Bottleneck in deferred rendering engines.
Uniform updates benötigen sehr häufig einen syncpoint, dieser ist eine synchronisierung zwischen GPU und CPU, also beide warten aufeinander, bis sie frei sind und genau die Bus Frequence überlappt. Dann werden Daten ausgetauscht und beide dürfen normal weiter arbeiten. Syncpoints kann man laut "Zero Overhead" Team mit einem Profiler auf spüren, diese Calls kosten in der regel auf der CPU mehr als 1us.
Bindless API und UBO zielt genau auf dieses Problem ab.
UBO benutzt man, um die Anzahl der Syncpoints zu reduzieren, in dem man mehrere Daten in ein Objekt packt und das Objekt dann updated.
Matrizen für Kamera und Licht werden häufig als UBO verpackt oder Shader und deren Settings für ein Material(was deferred rendering sehr exessiv benutzt).

Google mal nach Zero Driver Overhead und da gibt es dann diverse links zu verwandte Paper.
NV hatte glaub bei Command Buffer Object Slide ne Liste von Syncpoint Kaniddaten.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Mo Feb 02, 2015 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich es richtig verstehe, würde so etwas Sinn machen ?

Code:
  1. layout (std140) uniform allUniforms {
  2.   vec4 diffuse;  
  3.   vec4 ambient;
  4.   vec4 specular;
  5.   float shininess;
  6.   mat4 WorldMatrix; // (neu)
  7. };
  8.  
  9. uniform sampler2D myTextureSampler[4]; // wird nur einmal inizialisiert

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Mo Feb 02, 2015 20:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
allUniforms ist ein viel versprechender UBO Kandidat.
http://www.geeks3d.com/20140704/gpu-buffers-introduction-to-opengl-3-1-uniform-buffers-objects/

Privat benutzt ich GLSL 4.2 location und named UBO.
Dies erlaubt, dann auch die Texturen initial zu binden.
Binding points
Code:
  1.     struct SharedTransformUniforms
  2.     {
  3.         RF_Geo::Mat4f ModelView;
  4.         RF_Geo::Mat4f ModelViewProjection;
  5.     } m_SharedTransformUniforms;
  6.  
  7. // init
  8.     GLfloat points[] = {
  9.         0.0f, 0.5f, 0.0f,
  10.         0.5f, -0.5f, 0.0f,
  11.         -0.5f, -0.5f, 0.0f
  12.     };
  13.     GLfloat colours[] = {
  14.         1.0f, 0.0f, 0.0f,
  15.         0.0f, 1.0f, 0.0f,
  16.         0.0f, 0.0f, 1.0f
  17.     };
  18.     GLuint vbo = 0;
  19.     glGenBuffers(1, &vbo);
  20.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  21.     glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
  22.     GLuint colours_vbo = 0;
  23.     glGenBuffers(1, &colours_vbo);
  24.     glBindBuffer(GL_ARRAY_BUFFER, colours_vbo);
  25.     glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW);
  26.  
  27.     vao = 0;
  28.     glGenVertexArrays(1, &vao);
  29.     glBindVertexArray(vao);
  30.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  31.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); // location 0
  32.     glBindBuffer(GL_ARRAY_BUFFER, colours_vbo);
  33.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); // location 1
  34.     glEnableVertexAttribArray(0);// sagt dem VAO das 0 aktiv sein soll
  35.     glEnableVertexAttribArray(1);// gleiches für 1 und damit brauch man nur VAO binden und nicht mehr setzen
  36.  
  37.     // erzeugt ein Datenblob, dessen struktur im Shader definiert wird
  38.     glCreateBuffers(1, &m_SharedUBO);
  39.     glNamedBufferData(m_SharedUBO, sizeof(SharedTransformUniforms), &m_SharedTransformUniforms, GL_STREAM_DRAW);
  40.  
  41. // game loop
  42.     /// Informiere und update alle Render Komponenten
  43.     RF_Algo::ForEach(m_RenderComponents, [messageIn, messageOut](RF_Collect::Array<ZP_Comp::RenderBehaviour>::EnumeratorType& Enum) {Enum->ProcessMessages(messageIn, *messageOut); });
  44.     RF_Algo::ForEach(m_CameraComponents, [messageIn, messageOut](RF_Collect::Array<ZP_Comp::CameraBehaviour>::EnumeratorType& Enum) {Enum->ProcessMessages(messageIn, *messageOut); });
  45.     m_MessageIn.Clear();
  46.     ProcessRequests();// load/reload shader/textures/meshes
  47.  
  48.     /// Aktive Kamera wurde geändert also auch das UBO updaten.
  49.     m_SharedTransformUniforms.ModelView = m_CameraComponents(m_ActiveCamera).m_Camera.GetMatrix();
  50.     m_SharedTransformUniforms.ModelViewProjection = m_CameraComponents(m_ActiveCamera).GetProjection() * m_SharedTransformUniforms.ModelView;
  51.  
  52.     glBindBufferBase(GL_UNIFORM_BUFFER, 2, m_SharedUBO);// binde UBO auf location 2, kann in Init() wenn jeder Drawcall den nutzen soll
  53.     glNamedBufferSubData(m_SharedUBO, 0, sizeof(SharedTransformUniforms), &m_SharedTransformUniforms);// async update, wenn noch nicht von der GPU benötigt
  54.  
  55.     // Render alle Komponenten in den jeweiligen Pass
  56.     for (RF_Type::Size i = 0; i < m_Passes.Count(); ++i)
  57.     {
  58.         RF_Type::UInt64 Pass = m_Passes(i).Name;
  59.  
  60.         RF_Algo::ForEach(m_RenderComponents, [Pass, messageOut](RF_Collect::Array<ZP_Comp::RenderBehaviour>::EnumeratorType& Enum) {Enum->RenderPass(Pass, *messageOut); });
  61.     }
  62. // render code ^^
  63.     glUseProgram(m_Shader);
  64.     glBindVertexArray(m_VAO);
  65.     glDrawArrays(GL_TRIANGLES, 0, 3);
  66.  


location sagt an welcher Stelle im VAO die Daten liegen und erspart das lästige rum hantieren mit namen im Shader suchen und dann mit den Daten zu verbinden.
Man bindet im VAO die Attribute und im Shader sagt man, in welchen Array die liegen.
Code:
  1. #version 420
  2. layout(location = 0) in vec3 vertex_position;
  3. layout(location = 1) in vec3 vertex_colour;
  4.  
  5. layout(std140, binding=2) uniform SharedTransformUniforms
  6. {
  7.     mat4 ModelView;
  8.     mat4 ModelViewProjection;
  9. };
  10.  
  11. out vec3 colour;
  12.  
  13. void main ()
  14. {
  15.   colour = vertex_colour;
  16.   gl_Position = ModelViewProjection * vec4(vertex_position,1);
  17. }

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Mo Feb 02, 2015 20:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Code:
  1. layout(std140, binding=2)


Dafür ist wohl OpenGL 3.3 zu schwach.
Ansonsten wäre es eine gute Sache.

Deine Links werde ich später genauer angucken.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Standard Werte in struct
BeitragVerfasst: Mo Feb 02, 2015 23:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wieso geht dir Verschachtelung mit vec3 bei Light.Pos nicht ?
Code:
  1. type
  2.   TMaterial = packed record
  3.     Light: packed record
  4.       Pos: TVector3f;  // ???
  5.     end;
  6.     Material: packed record
  7.       diffuse: TVector4f;    
  8.       ambient: TVector4f;  
  9.       specular: TVector4f;  
  10.       shininess: glFloat;    
  11.     end;
  12.   end;    


Code:
  1. struct Lights {
  2.   vec3 l_dir;   // ???
  3. };
  4.  
  5. struct Materials {
  6.   vec4 diffuse;  
  7.   vec4 ambient;
  8.   vec4 specular;
  9.   float shininess;
  10. };
  11.  
  12. layout (std140) uniform allUniforms {
  13.   Lights lights;
  14.   Materials materials;
  15. };
  16. ...
  17.   float intensity = max(dot(n, lights.l_dir), 0.0);


Ändere ich alle Light.Pos Parameter aus vec4 dann geht es. :?

Code:
  1. type
  2.   TMaterial = packed record
  3.     Light: packed record
  4.       Pos: TVector4f;    // ???
  5.     end;
  6.     Material: packed record
  7.       diffuse: TVector4f;    
  8.       ambient: TVector4f;  
  9.       specular: TVector4f;  
  10.       shininess: glFloat;  
  11.     end;
  12.   end;


Code:
  1. struct Lights {
  2.   vec4 l_dir;   // ???
  3. };
  4.  
  5. struct Materials {
  6.   vec4 diffuse;  
  7.   vec4 ambient;  
  8.   vec4 specular;  
  9.   float shininess;
  10. };
  11.  
  12. layout (std140) uniform allUniforms {
  13.   Lights lights;
  14.   Materials materials;
  15. };
  16. ...
  17.   float intensity = max(dot(n, lights.l_dir.rgb), 0.0);  



Code:
  1. type
  2.   TVector3f = array[0..2] of GLfloat;
  3.   TVector4f = array[0..3] of GLfloat;
  4.  


Nachtrag: Habe ich im Pascal-Code TVector4f und im Shader vec3, dann funktioniert es komischerweise auch.

_________________
OpenGL


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


Wer ist online?

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