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

Aktuelle Zeit: Fr Mai 10, 2024 13:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Z-Achse vertauscht.
BeitragVerfasst: So Jan 26, 2014 20:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Bei OpenGL ist Z+ gegen mich. Link

Nun zu meinem Problem, die Z+ Achse geht in meinem Program in den Bildschirm hinein, Quad überdeckt Triangle, obwohl Quad im Z minus hat.

Ich vermute mal in meinem Android -Programm ist dies richtig. Android Post


Der Fehler hat sich in meine sämtlichen Programmen eingeschlichen. :evil:

Code:
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9.   ExtCtrls, dglOpenGL, ShaderUnit, Windows;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Timer1: TTimer;
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure FormDestroy(Sender: TObject);
  19.     procedure FormPaint(Sender: TObject);
  20.     procedure FormResize(Sender: TObject);
  21.     procedure Timer1Timer(Sender: TObject);
  22.   private   { private declarations }
  23.     procedure InitScene;
  24.     procedure RenderScene;
  25.   public        { public declarations }
  26.     DC: HDC;
  27.     RC: HGLRC;
  28.     ProgramID: GLuint;
  29.   end;
  30.  
  31. var
  32.   Form1: TForm1;
  33.  
  34. implementation
  35.  
  36. {$R *.lfm}
  37.  
  38. { TForm1 }
  39.  
  40. const
  41.   fTriangle: array[1..3, 1..3] of GLfloat =
  42.     ((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0));
  43.   fTriangleColor: array[1..3, 1..3] of GLfloat =
  44.     ((1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0));
  45.   fQuad: array[1..4, 1..3] of GLfloat =
  46.     ((-0.2, 0.3, -0.1), (-0.2, -0.6, -0.1), (0.2, 0.3, -0.1), (0.2, -0.6, -0.1));  // Z ist minus, Quad müsste verdeckt sein.
  47.   fQuadColor: array[1..4, 1..3] of GLfloat =
  48.     ((1.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0), (1.0, 0.0, 0.0));
  49.  
  50. var
  51.   uiVBO: array[0..3] of UINT;
  52.   uiVAO: array[0..1] of UINT;
  53.  
  54. procedure TForm1.InitScene;
  55. begin
  56.   glClearColor(0.0, 0.5, 1.0, 1.0); //Hintergrundfarbe: Hier ein leichtes Blau
  57.  
  58.   glGenVertexArrays(2, uiVAO); // Generate two VAOs, one for triangle and one for quad
  59.  
  60.   //  glGenVertexArrays(2, uiVAO); // Generate two VAOs, one for triangle and one for quad
  61.   glGenBuffers(4, uiVBO); // And four VBOs
  62.  
  63.   // Setup whole triangle
  64.   glBindVertexArray(uiVAO[0]);
  65.  
  66.   glBindBuffer(GL_ARRAY_BUFFER, uiVBO[0]);
  67.   glBufferData(GL_ARRAY_BUFFER, sizeof(fTriangle), @fTriangle, GL_STATIC_DRAW);
  68.   glEnableVertexAttribArray(0);
  69.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  70.  
  71.   glBindBuffer(GL_ARRAY_BUFFER, uiVBO[1]);
  72.   glBufferData(GL_ARRAY_BUFFER, sizeof(fTriangleColor), @fTriangleColor, GL_STATIC_DRAW);
  73.   glEnableVertexAttribArray(1);
  74.   glVertexAttribPointer(1, 3, GL_FLOAT, False, 0, nil);
  75.  
  76.   // Setup whole Quad
  77.   glBindVertexArray(uiVAO[1]);
  78.  
  79.   glBindBuffer(GL_ARRAY_BUFFER, uiVBO[2]);
  80.   glBufferData(GL_ARRAY_BUFFER, sizeof(fquad), @fQuad, GL_STATIC_DRAW);
  81.   glEnableVertexAttribArray(0);
  82.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  83.  
  84.   glBindBuffer(GL_ARRAY_BUFFER, uiVBO[3]);
  85.   glBufferData(GL_ARRAY_BUFFER, sizeof(fQuadColor), @fQuadColor, GL_STATIC_DRAW);
  86.   glEnableVertexAttribArray(1);
  87.   glVertexAttribPointer(1, 3, GL_FLOAT, False, 0, nil);
  88.  
  89.   ProgramID := InitShader('VertexShader.txt', 'FragmentShader.txt');
  90.   glUseProgram(programID);
  91.  
  92.   // Enable depth test
  93.   glEnable(GL_DEPTH_TEST);
  94.   // Accept fragment if it closer to the camera than the former one
  95.   glDepthFunc(GL_LESS);
  96.  
  97. end;
  98.  
  99. procedure TForm1.RenderScene;
  100. begin
  101.   glEnable(GL_CULL_FACE);
  102.   glCullFace(GL_BACK);
  103.  
  104.   glFrontFace(GL_CCW);
  105.  
  106.   // We just clear color
  107.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  108.  
  109.   // Triangle render
  110.   glBindVertexArray(uiVAO[0]);
  111.   glDrawArrays(GL_TRIANGLES, 0, 3);
  112.  
  113.   // Quad render using triangle strip
  114.   glBindVertexArray(uiVAO[1]);
  115.   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  116.  
  117.   SwapBuffers(DC);
  118. end;
  119.  
  120.  
  121. procedure TForm1.FormCreate(Sender: TObject);
  122. begin
  123.   DC := GetDC(Handle);
  124.   if not InitOpenGL then Application.Terminate;
  125.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  126.   ActivateRenderingContext(DC, RC);
  127.  
  128.   InitScene;
  129. end;
  130.  
  131. procedure TForm1.FormDestroy(Sender: TObject);
  132. begin
  133.   glDeleteBuffers(4, @uiVBO);
  134.   glDeleteBuffers(2, @uiVAO);
  135.   DeactivateRenderingContext;
  136.   DestroyRenderingContext(RC);
  137.   ReleaseDC(Handle, DC);
  138. end;
  139.  
  140. procedure TForm1.FormPaint(Sender: TObject);
  141. begin
  142.   RenderScene;
  143. end;
  144.  
  145. procedure TForm1.FormResize(Sender: TObject);
  146. begin
  147.   glViewport(0, 0, ClientWidth, ClientHeight);
  148. end;
  149.  
  150. procedure TForm1.Timer1Timer(Sender: TObject);
  151. begin
  152.   FormPaint(Sender);
  153. end;
  154.  
  155. end.


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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Mo Jan 27, 2014 07:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich glaube es liegt daran, dass du keine Projection Matrix hast.Im Shader gibst du die Vertexdaten wahrscheinlich einfach nur aus. Daher wird nirgendswo festgelegt, wie der Wert für den Depthbuffer aussieht. Den Wertebereich legt man ja üblicherweise mit der Projectionsmatrix fest. siehe Z-near & Z-far.
Du könntest auch im Vertexshader gl_FragDepth setzen und den Wert festzulegen.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Mo Jan 27, 2014 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Der Depthtest funktioniert auch ohne Matrizen. Zeig' mal deinen Vertexshader. In dem bisher geposteten Code kann ich keinen Fehler erkennen.

_________________
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: Z-Achse vertauscht.
BeitragVerfasst: Mo Jan 27, 2014 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Viel kann da nicht falsch sein.

Wen ich diesen Befehl einfüge, dann würde es funktionieren:

glDepthRange(1.0, 0.0);, default währe glDepthRange(0.0, 1.0);, somit kann es an dem auch nicht liegen.

Code:
  1. #version 330  // VertexShader
  2. in vec3 inPos;
  3. in vec4 inColor;
  4.  
  5. out vec4 Color;
  6.  
  7. void main(void)
  8. {
  9.   gl_Position = vec4(inPos, 1.0);
  10.   Color = inColor;
  11. }        
  12.  
  13. ---------------------------------
  14.  
  15. #version 330  // FragmentShader
  16. in vec4 Color;
  17. out vec4 outColor;
  18.  
  19. void main(void)
  20. {
  21.   outColor = Color;
  22. }        

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Mo Jan 27, 2014 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Zitat:
Der Depthtest funktioniert auch ohne Matrizen.

Sicher. Aber die Depthrange ist ja 0.0 - 1.0. Wenn er da jetzt -0.1 in der Z-Achse ausgibt, landet des Quad natürlich vor allem anderen.
Soweit ich es verstanden habe, führt z.b. eine Perspektivische Projektion dazu, dass alles was zwischen fNear und zFar liegt auf den Bereich zwischen -1 und 1 gemappt wird. OpenGL führt danach die Perspektivische Division durch W (welches im Beispiel 1.0 ist, bei einer Projektionsmatrix aber einen negativen Wert hat) aus und das ganze landet in einem Bereich zwischen 0 und 1 für den Depthbuffer.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Mo Jan 27, 2014 22:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Könnte es sein, das die dglOpenGL etwas falsch initialisiert ?

Ich habe vorhin das Programm unter Delphi 6 mit dglOpenGL getestet, der gleiche Fehler.
Gegenwärtig programmiere ich mit Lazarus.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Mo Jan 27, 2014 22:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Könnte es sein, das die dglOpenGL etwas falsch initialisiert ?


Nein, die initialisiert nichts, sondern stellt dir nur den Kontext und die OpenGL-Funktionen zur Verfügung. Wenn da sowas Grundlegendes wie die Z-Reihenfolge falsch wäre, hätte man das sicher schon vorher gemerkt.

Zumal ich ja selbst (sowie die meisten DGL'ler) auch die ja nutzen und das problemlos klappt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 09:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
kuckst du hier http://www.matrix44.net/cms/notes/openg ... -in-opengl

dein Screenshot ist also absolut richtig.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 17:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
yunharla hat geschrieben:
kuckst du hier http://www.matrix44.net/cms/notes/openg ... -in-opengl

dein Screenshot ist also absolut richtig.


Ich habe deinen Link angeschaut, dort zeigt Z+ auch Richtung Betrachter.
Somit währe mein Screenshot nach meiner Meinung falsch.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 18:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Ich glaube, damadmax hat schon recht. Wenn man sich die Matrix anschaut, die bspw. von glOrtho berechnet wird, sieht man, dass dort das Vorzeichen der Z-Achse umgekehrt wird. Erst dadurch wird das Koordinatensystem offenbar rechtshändig. Ich habe gestern mal etwas experimentiert und zu meiner eigenen Überraschung ähnliche Ergebnisse bekommen wie du, mathias.

_________________
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: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 18:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Nur die Frage, was soll ich am besten machen ?

Soll ich die Z-Achse mit glDepthRange(1.0, 0.0); vertauschen.

Die meisten Vektoren, welche man findet z.B. die von OBJ-Dateien sind im Gegenuhrzeigersinn gezeichnet.
OpenGL zeichnet auch im GUZ.

Oder soll ich mit einer Matrix wie die von glOrtho multiplizieren ?

Schlussendlich will ich richtige Koordinaten und nicht ein gebastel.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Sobald man etwas dreidimensionales darstellen will, benutzt man doch eigentlich sowieso Matrizen. Und 2D wird i.d.R. nur für Fullscreen-Quads (Postprocessing), Textausgaben usw. gebraucht. Dabei braucht man die Z-Koordinaten sowieso nicht.

Was hast du in deinem konkreten Fall vor?

_________________
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: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 19:52 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Sobald man etwas dreidimensionales darstellen will, benutzt man doch eigentlich sowieso Matrizen.
Normalerweise verwende ich schon Matrizen, bei dem obigen Code, wollte ich möglichst schlank, das man den Fehler besser sieht.
Zitat:
Was hast du in deinem konkreten Fall vor?

Momentan baue ich eine Bibliothek auf, mit verschiedene Objekten, unter anderen auch ein OBJ-Loader.
Aber ich will nicht noch mehr Fehler einbauen, durch die Z-Inventierung habe ich alle Vektoren im Uhrzeigersinn kreiert, anstelle im Gegenuhrzeigersinn, wie es üblich währe.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 20:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Momentan baue ich eine Bibliothek auf, mit verschiedene Objekten, unter anderen auch ein OBJ-Loader.
Aber ich will nicht noch mehr Fehler einbauen, durch die Z-Inventierung habe ich alle Vektoren im Uhrzeigersinn kreiert, anstelle im Gegenuhrzeigersinn, wie es üblich währe.


"Üblich" gibt es in dem Sinne ja nicht. Über das Koordinatensystem bestimmst du selbst, und auch die Reihenfolge der Eckpunkte gibts du selbst an (glFrontFace). Falsch machen kann man also nix, solange man es einheitlich macht.

P.S. : Hab auch grad nen OBJ-Loader für Android gebaut ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Z-Achse vertauscht.
BeitragVerfasst: Di Jan 28, 2014 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
mathias hat geschrieben:
durch die Z-Inventierung habe ich alle Vektoren im Uhrzeigersinn kreiert
Ich glaube, du hast was missverstanden. Beim Backface-Culling spielt es keine Rolle, ob du z invertierst oder nicht. Ob die Vertices eines Dreiecks im oder gegen den Uhrzeigersinn angeordnet sind, wird beim Rendern immer aus der Sicht des Betrachters entschieden. Ein Dreieck mit den Koordinaten
Code:
  1. vec3(-1.0,-1.0, z)
  2. vec3( 1.0,-1.0, z)
  3. vec3(-1.0, 1.0, z)
(die im VS 1:1 durchgereicht werden) ist immer counter-clockwise - egal, ob z nun 0.5 oder -0.5 ist.

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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