DGL
https://delphigl.com/forum/

Array an VS übergeben (Instanziierung Fehlercode 1282)
https://delphigl.com/forum/viewtopic.php?f=20&t=11657
Seite 1 von 1

Autor:  Amnesia [ Do Jul 19, 2018 10:26 ]
Betreff des Beitrags:  Array an VS übergeben (Instanziierung Fehlercode 1282)

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 :)

Autor:  Amnesia [ Do Jul 19, 2018 10:28 ]
Betreff des Beitrags:  Re: Array an VS übergeben (Instanziierung Fehlercode 1282)

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.

Autor:  mathias [ Do Jul 19, 2018 17:27 ]
Betreff des Beitrags:  Re: Array an VS übergeben (Instanziierung Fehlercode 1282)

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. }

Autor:  Amnesia [ Fr Jul 20, 2018 06:26 ]
Betreff des Beitrags:  Re: Array an VS übergeben (Instanziierung Fehlercode 1282)

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 :?

Autor:  mathias [ Fr Jul 20, 2018 16:59 ]
Betreff des Beitrags:  Re: Array an VS übergeben (Instanziierung Fehlercode 1282)

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(... ?

Autor:  Amnesia [ Fr Jul 20, 2018 18:01 ]
Betreff des Beitrags:  Re: Array an VS übergeben (Instanziierung Fehlercode 1282)

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:

Autor:  mathias [ Fr Jul 20, 2018 18:08 ]
Betreff des Beitrags:  Re: Array an VS übergeben (Instanziierung Fehlercode 1282)

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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/