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

Aktuelle Zeit: Do Mär 28, 2024 17:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jul 19, 2018 10:26 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
Moin,

versuche gerade einen Wald zu erzeugen. Habe ein Baum object und versuche dies dann zu clonen und die Position zu verändern.
Die Positionen werden über einen vector an den ForestShader übergeben.
Die Klasse für mein ForestShader sieht folgendermaßen aus:

.h:
Code:
  1.  
  2. class ForestShader : public PhongShader {
  3. public:
  4.     ForestShader(const std::string& AssetDirectory, std::vector<Vector> pos);
  5.     virtual ~ForestShader(){}
  6.     virtual void assignLocations();
  7.     virtual void activate(const BaseCamera& Cam) const;
  8.     virtual void deactivate() const;
  9.  
  10. protected:
  11.     const Texture* DiffuseTexture;
  12.     GLint OffSetLoc;
  13.     GLint RotationMatLoc;
  14.     Vector* offset;
  15.     Matrix* RotationMat;
  16.     int number;
  17. };
  18.  


.cpp:
Code:
  1.  
  2. #include "ForestShader.h"
  3. #include <string>
  4.  
  5. ForestShader::ForestShader(const std::string& AssetDirectory, std::vector<Vector> pos) {
  6.     std::string VSFile = AssetDirectory + "vsForest.glsl";
  7.     std::string FSFile = AssetDirectory + "fsForest.glsl";
  8.     if (!load(VSFile.c_str(), FSFile.c_str()))
  9.         throw std::exception();
  10.     assignLocations();
  11.     this->number = pos.size();
  12.     this->offset = new Vector[this->number];
  13.     this->RotationMat = new Matrix[this->number];
  14.     specularColor(Color(0, 0, 0));
  15.     for (int i = 0; i < this->number; i++) {
  16.         this->offset[i] = pos[i];
  17.         //this->RotationMat[i] = Matrix().identity().rotationY(rand() % 360);
  18.     }
  19. }
  20.  
  21. void ForestShader::assignLocations() {
  22.     PhongShader::assignLocations();
  23.     this->OffSetLoc = glGetUniformLocation(ShaderProgram, "offsets");
  24.     //this->RotationMatLoc = glGetUniformLocation(ShaderProgram, "RotationMat");
  25. }
  26.  
  27. void ForestShader::activate(const BaseCamera& Cam) const
  28. {
  29.     setParamArray3fv(this->OffSetLoc, this->number, reinterpret_cast<GLfloat *>(&this->offset[0]));
  30.     //setParamArray4fv(this->RotationMatLoc, this->number, reinterpret_cast<GLfloat *>(&this->RotationMat[0]));
  31.     PhongShader::activate(Cam);
  32. }
  33.  
  34. void ForestShader::deactivate() const
  35. {
  36.     PhongShader::deactivate();
  37. }
  38.  

hinter setParamArray3fv(this->OffSetLoc, this->number, reinterpret_cast<GLfloat *>(&this->offset[0]));
steckt
Code:
  1.  
  2. glUniform3fv(ID, number, pos);
  3.  

und hier einmal mein Shader vsForest.glsl
Code:
  1.  
  2. #version 400
  3.  
  4. layout(location=0) in vec4 VertexPos;
  5. layout(location=1) in vec4 VertexNormal;
  6. layout(location=2) in vec2 VertexTexcoord;
  7.  
  8. out vec3 Position;
  9. out vec3 Normal;
  10. out vec2 Texcoord;
  11.  
  12. uniform mat4 ModelMat;
  13. uniform mat4 ModelViewProjMat;
  14. uniform vec3 offsets[30];
  15. //uniform mat4 RotationMat[10];
  16.  
  17. void main()
  18. {
  19.     vec3 offset = offsets[gl_InstanceID];
  20.     //mat4 rotation = RotationMat[gl_InstanceID];
  21.     Position = (ModelMat * (VertexPos + vec4(offset,0))).xyz;
  22.     Normal =  (ModelMat * VertexNormal).xyz;
  23.     Texcoord = VertexTexcoord;
  24.     gl_Position = (ModelViewProjMat * (VertexPos + vec4(offset,0)));
  25. }
  26.  


Komisch ist, das der Code funktioniert aber mir trotzdem eine Fehlermeldung angezeigt wird, bin aber auch relativ neu in openGl und Shader Programmierung.
Hoffe das mir jemand helfen kann :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 19, 2018 10:28 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
was ich noch vergessen habe, wir machen dieses Projekt im Rahmen des Studiums und haben alle Vector klassen und Matrizen selber erstellt. Nutzen also kein glm und wenn ich
Code:
  1.  
  2. vec3 offset = offsets[gl_InstanceID];
  3.  

aus dem Code entferne kommt keine Fehlermeldung, also liegt es wohl irgendwie an dem übergebenen array.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 19, 2018 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ist dein Ziel so etwas: https://wiki.delphigl.com/index.php/Laz ... t_Texturen

Du hast mich gerade auf etwas schmackhaft gemacht. Die Funktion glDrawArraysInstanced muss ich mal ausprobieren.
Bis jetzt habe ich immer mit einer for-Schleife und glDrawArrays gezeichnet.

Zitat:
Komisch ist, das der Code funktioniert aber mir trotzdem eine Fehlermeldung angezeigt wird,

Eine Fehlermeldung oder eine Warnung ?
Im Shader oder in deinem C++ - Code ?
Bei einem Fehler hättest du keine Ausgabe.

PS: Kannst du bitte deinem Code die richtigen Syntaxhiglight setzen, danke.

Ich habe es gerade probiert, folgender Code wirs mir ohne Fehler übersetzt:
Code:
  1. #version 330
  2.  
  3. layout (location =  0) in vec3 inPos; // Vertex-Koordinaten
  4. layout (location = 10) in vec2 inUV;  // Textur-Koordinaten
  5.  
  6. out vec2 UV0;
  7.  
  8. uniform mat4 Matrix[30];              // Matrix für die Drehbewegung und Frustum.
  9.  
  10. void main(void)
  11. {
  12.   mat4 m = Matrix[gl_InstanceID];
  13.   gl_Position = m * vec4(inPos, 1.0);
  14.  
  15. //  gl_Position = Matrix[gl_InstanceID] * vec4(inPos, 1.0);
  16.   UV0         = inUV;                 // Textur-Koordinaten weiterleiten.
  17. }

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2018 06:26 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
Das hier beschreibt mein Ziel wohl am besten

https://learnopengl.com/Advanced-OpenGL/Instancing

Es ist keine Fehlermeldung oder ein warning was durch den Compiler erzeugt wird sondern ein OpenGl Error.

in meiner draw Methode die ich in der main ausführe überprüfe ich ob OpenGl Errors erzeugt wurden.

Code:
  1.  
  2.     GLenum err;
  3.     while ((err = glGetError()) != GL_NO_ERROR) {
  4.         std::cout << "OpenGL error: " << err <<  std::endl;
  5.     }
  6.  


Bin mir nicht ganz sicher wieso es passiert wenn ich auf das array zugreife :?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2018 16:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Es ist keine Fehlermeldung oder ein warning was durch den Compiler erzeugt wird sondern ein OpenGl Error.
Jetzt wäre noch interessant, was er ausspuckt.

Zitat:
in meiner draw Methode die ich in der main ausführe überprüfe ich ob OpenGl Errors erzeugt wurden.

Ist die Überprüfung direkt hinter glDrawArraysInstanced(... ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2018 18:01 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
Okay, ich habe den fehler gefunden :roll:

ich habe
Code:
  1. glUniform3fv(ID, number, pos);
vor
Code:
  1. glUseProgram(ShaderProgram);
genutzt :oops: oh man ... seltsam das es trotzdem funktioniert hat, aber okay :lol:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2018 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
genutzt :oops: oh man ... seltsam das es trotzdem funktioniert hat, aber okay :lol:

Könnte sein, das du nur ein Shader verwendest und da reicht es, wen glUseProgram einmal aufgerufen will und dann ist er aktiv, bis du dein Programm beendest.

Ich habe Dank dir auch was gelernt, mit glDrawArraysInstanced kann man mehrere Aufrufe von glDrawArrays sparen.
Ein Nachteil, es wird mehr Speicher verbraucht, da man mehrere Matrizen in einem Array braucht, aber das ist bei den heutigen PCs kein Problem mehr.

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.041s | 19 Queries | GZIP : On ]