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

Aktuelle Zeit: Do Apr 18, 2024 03:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Viewportkoordinaten extrem klein?
BeitragVerfasst: Mi Okt 30, 2013 13:21 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Also ich habe momentan wieder ein extrem seltsames Problem das ich überhaupt nicht nachvollziehen kann. Die Vertexpositionen muss ich extrem klein angeben. Die Szene scheint Millionenfach vergrößert. Eigentlich ist es doch so, dass links unten im Viewport die Koordinaten (-1,-1) liegen und rechts oben (1,1). Irgendwie wird bei mir eine Primitive aber bereits bei 0.0000000000000000001 größer als der Viewport. Der Vertexshader:
Code:
  1.  
  2. #version 330
  3. uniform mat3x2 ViewTransformMatrix;
  4.  
  5. layout(location = 0) in vec2 Position;
  6. layout(location = 1) in vec4 Color;
  7. layout(location = 2) in vec2 TexCoord0;
  8.  
  9. smooth out vec2 FragTexCoord0;
  10. smooth out vec4 FragColor;
  11.  
  12. void main()
  13. {
  14.     //vec2 FragPosition = ViewTransformMatrix * vec3(Position.x, Position.y, 1.0);
  15.     gl_Position = vec4(Position.x, Position.y, 0.0, 0.0);
  16.     FragColor = Color;
  17.     FragTexCoord0 = TexCoord0;
  18. }
  19.  

Und der Fragmentshader:
Code:
  1.  
  2. #version 330
  3. uniform sampler2D TexSampler;
  4.  
  5. smooth in vec2 FragTexCoord0;
  6. smooth in vec4 FragColor;
  7. out vec4 OutColor;
  8.  
  9. void main()
  10. {
  11.    OutColor = FragColor; // * texture2D(TexSampler, FragTexCoord0);
  12. }
  13.  

Die Shader kompilieren eigentlich ohne Probleme. Ob mit oder ohne das Laden von Shaderbinaries ändert nichts am Ergebnis.

Ich verwende eigentlich ein VBO und ein VAO, aber ich in meiner Verzweiflung auch schon den Immediate Mode ausprobiert und das Problem besteht auch da. Deshalb vermute ich das Problem irgendwie im Shader.
Das VBO und VAO initlialisiere ich so: (Ich verwende für die Objektorientierung EXT_direct_state_access. Objektorientierung hier nicht, weil ich den Code für das Forum vereinfacht habe)
Code:
  1.  
  2. GLint VAO_ID;
  3. GLint VBO_ID;
  4. struct Vertex
  5. {
  6. public:
  7.     Vec<2, float> Pos;
  8.     ColorRGBA<unsigned char> Color;
  9.     Vec<2, float> TexCoord;
  10. };
  11.  
  12. glGenBuffers(1, &VBO_ID);
  13. glGenVertexArrays(1, &VAO_ID);
  14. glEnableVertexArrayAttribEXT(VAO_ID, 0);
  15. glVertexArrayVertexAttribOffsetEXT(VAO_ID, VBO_ID, 0, 2, GL_FLOAT, false, sizeof(Vertex), offsetof(Vertex, Pos));
  16. glEnableVertexArrayAttribEXT(VAO_ID, 1);
  17. glVertexArrayVertexAttribOffsetEXT(VAO_ID, VBO_ID, 1, 4, GL_UNSIGNED_BYTE, true, sizeof(Vertex), offsetof(Vertex, Color));
  18. glEnableVertexArrayAttribEXT(VAO_ID, 2);
  19. glVertexArrayVertexAttribOffsetEXT(VAO_ID, VBO_ID, 2, 2, GL_FLOAT, false, sizeof(Vertex), offsetof(Vertex, TexCoord));
  20.  
  21. glNamedBufferDataEXT(VBO_ID, 3 * sizeof(Vertex), GL_STATIC_DRAW, nullptr);
  22. Vertex* VertexPtr = reinterpret_cast<Vertex*>(glMapNamedBufferEXT(VBO_ID, GL_WRITE_ONLY));
  23. VertexPtr->Pos = Vec<2, float>(0.0f, 0.0f);
  24. VertexPtr->Color = ColorRGBA<unsigned char>(255, 0, 255, 255);
  25. VertexPtr->TexCoord = Vec<2, float>(0.0f, 0.0f); //Momentan nicht genutzt
  26. VertexPtr++;
  27. VertexPtr->Pos = Vec<2, float>(0.00000000000000000003f, 0.00000000000000000002f);
  28. VertexPtr->Color = ColorRGBA<unsigned char>(0, 255, 0, 255);
  29. VertexPtr->TexCoord = Vec<2, float>(0.0f, 0.0f); //Momentan nicht genutzt
  30. VertexPtr++;
  31. VertexPtr->Pos = Vec<2, float>(0.0f, 0.00000000000000000002f);
  32. VertexPtr->Color = ColorRGBA<unsigned char>(0, 0, 0, 255);
  33. VertexPtr->TexCoord = Vec<2, float>(0.0f, 0.0f); //Momentan nicht genutzt
  34. VertexPtr++;
  35. glUnmapNamedBufferEXT(VBO_ID);
  36.  
  37. //Und später rendern...
  38. glBindVertexArray(VAO_ID);
  39. glDrawArrays(GL_TRIANGLES, 0, 3); //Gleiches Problem auch bei GL_LINE_LOOP
  40.  

Hier vermute ich aber weniger das Problem, weil die gleichen Symptome auch im Immediate Mode auftreten:
Code:
  1.  
  2. //Rendern...
  3. glBegin(GL_TRIANGLES);
  4. glVertex2f(0.0f, 0.0f);
  5. glVertex2f(0.00000000000000000003f, 0.00000000000000000002f);
  6. glVertex2f(0.0f, 0.00000000000000000002f);
  7. glEnd();
  8.  

Das gerendere Ergebnis unterscheidet sich bis auf die Farbe nicht von dem des VAO und VBOs.
Ich habe inzwischen echt keine Idee mehr woran die seltsamen Ergebnisse bei Koordinaten liegen könnten. Ich hoffe ihr habt eine Idee. :wink:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Zuletzt geändert von OpenglerF am Mi Okt 30, 2013 17:33, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 14:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wie sehen denn deine Matrizen aus? (Projection und Modelview)

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 16:32 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ich gebe wie oben im Shader steht die Daten im VertexShader durch, ohne irgendwelche Transformationen durchzuführen.
Code:
  1. gl_Position = vec4(Position.x, Position.y, 0.0, 0.0);


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Sehr merkwürdig... hast du dir mal die Vertex-Koordinaten als Farbe ausgeben lassen?

_________________
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  
BeitragVerfasst: Mi Okt 30, 2013 17:30 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ich habe das gerade einmal ausprobiert:
Code:
  1.    
  2.     smooth in vec4 FragColor;
  3.     out vec4 OutColor;
  4.  
  5.     void main()
  6.     {
  7.         OutColor = vec4(gl_FragCoord.x * 0.005, gl_FragCoord.y * 0.005, 0.0f, 1.0f); // FragColor; // * texture2D(TexSampler, FragTexCoord0);
  8.     }
  9.  

Das Dreieck ist komplett einheitlich gelb (R: 255; G: 255; B: 0).
Eigentlich habe ich einen Farbverlauf erwartet. (?)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Hab' gerade mal die Spec nach "gl_FragCoord" durchsucht:
glsl-spec 3.30.6 hat geschrieben:
By default, gl_FragCoord assumes a lower-left origin for window coordinates and assumes pixel centers
are located at half-pixel coordinates. For example, the (x, y) location (0.5, 0.5) is returned for the lower-
left-most pixel in a window.

Somit ist es kein Wunder, dass du nur gelb siehst, da gl_FragCoord.xy in Pixeln als Einheit misst. Du teilst zwar durch 200, aber ich denke das reicht nicht, da deine Auflösung höher als 200 Pixel ist.

Was ich auch eigentlich meinte ist, dass du die Variable, die du mit
Code:
  1. layout(location = 0) in vec2 Position;
im Vertexshader deklariert hast, unverändert in den Fragmentshader durchreichst und als Farbe ausgibst.

_________________
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  
BeitragVerfasst: Mi Okt 30, 2013 19:10 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Wenn ich die Position mit "out smooth" durchreiche dann ist das ganze Dreieck absolut schwarz.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 19:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Damit weißt du wenigstens, dass die Koordinaten vollkommen korrekt im Shader ankommen (kleine Werte -> schwarz...). Da du keine Matrizen verwendest, kann es auch nicht an einem falsch eingestellten Frustum oder so liegen. *grübel*

Du renderst nicht zufällig in ein FBO, welches dann wieder als Quad gerendert wird oder so? Ich wüsste nämlich nicht, welche Parameter in der Rendering Pipeline sonst noch Position und Größe auf dem Bildschirm beeinflussen könnten.

Ansonsten: Hast du vielleicht eine ältere Version des Quelltextes, bei dem das Problem noch nicht auftrat? Wenn ja: Schritt für Schritt prüfen, mit welcher Änderung das Phänomen kam. Das weißt du wahrscheinlich alles selbst, aber mehr fällt mir dazu nicht ein. :?

_________________
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  
BeitragVerfasst: Mi Okt 30, 2013 21:11 
Offline
DGL Member

Registriert: Mo Okt 01, 2012 13:21
Beiträge: 5
Programmiersprache: Delphi, Python
Hi,

setz mal die w-Komponente von gl_Position auf 1.0 statt 0.0. Soweit ich wird die w-Komponente zum Clipping verwendet, was Probleme gibt wenn diese 0 ist.
hab es gerade in einem vom meinen Shadern probiert (1.0 durch 0.0 ersetzt) und das Bild war schwarz.

Gruß Pivi


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 22:22 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Wow, danke! Das war der Tipp in die richtige Richtung! Nach dem Vertexshader gibt es in scheinbar GLSL eine integrierte festverdrahtete perspektivische w-Division. Durch numerische Ungenauigkeiten kommt es dann offensichtlich zu diesen extrem kleinen Skalierungsfaktor.

Nachdem ich die W-Koordinate auf 1.0 gesetzt habe geht alles.
Vielen dank an alle die geholfen haben!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 30, 2013 22:56 
Offline
DGL Member

Registriert: Mo Okt 01, 2012 13:21
Beiträge: 5
Programmiersprache: Delphi, Python
freut mich das es klappt,

habe noch mal nachgelesen: Es wird nach den Vertex Shader eine Division durch w durchgeführt, um die Normalized-Device-Coordinates zu erhalten, welche ja immer zwischen -1 und 1 liegen.
Das ist nötig da zum Beispiel bei Anwendung einer perspektivischen Projektion die erhaltenen Koordinaten nicht zwischen -1 und 1 liegen, insbesondere ist w dann ungleich 1.

Bei einer Division durch 0 ist das Ergebnis quasi unendlich, wodurch alle Dreiecke riesig werden und Du so kleine Werte eingeben musstest.

Das ganze steht auch hier auch ausführlicher:
http://www.opengl.org/wiki/Vertex_Post-Processing


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 » OpenGL


Wer ist online?

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