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

Aktuelle Zeit: Sa Apr 27, 2024 01:31

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGl3: Nichts zu sehen
BeitragVerfasst: Do Mär 26, 2015 18:40 
Offline
DGL Member

Registriert: Mi Mär 25, 2015 19:13
Beiträge: 3
Programmiersprache: Delphi XE7
Ich habe mit Delphi XE7 ein Programm für die Vektorrechnung geschrieben - leider in OpenGl 1.
Um das mit der Oculus Rift zeigen zu können, muss ich OpenGl 3 einsetzen.
Ich habe ein Beispielprojekt (LibOVRWrapper for Delphi, japanische Seite) gefunden und wollte die Ausgabe erstmal ohne Oculus, also auf einem normalen Delphi-Vcl-Formular sehen.
Dazu habe ich alles entfernt, was Oculus-spezifisch zu sein schien.
Leider ist nichts zu sehen.

Den (etwas umfangreichen) Quellcode füge ich hier ein mit der Bitte, einen Blick darauf zu werfen.
Habe ich etwas grundsätzlich falsch gemacht?

Code:
  1.  
  2. procedure TForm1.FormCreate(Sender: TObject);
  3. const
  4.   vertexSource: PAnsiChar =
  5.     '#version 330'#10 +
  6.     'uniform mat4 MVPMatrix;'#10 +
  7.     'in vec3 VertexPosition;'#10 +
  8.     'in vec4 VertexColor;'#10 +
  9.     'out vec4 Color;'#10 +
  10.     'void main()'#10 +
  11.     '{'#10 +
  12.     '  gl_Position = MVPMatrix * vec4(VertexPosition, 1.0);'#10 +
  13.     '  Color = VertexColor;'#10 +
  14.     '}';
  15.   fragmentSource: PAnsiChar =
  16.     '#version 330'#10 +
  17.     'in vec4 Color;'#10 +
  18.     'out vec4 FragColor;'#10 +
  19.     'void main()'#10 +
  20.     '{'#10 +
  21.     '  FragColor = Color;'#10+
  22.     '}';
  23.   vertices: array[0..8] of GLfloat = (
  24.     0,1,0,
  25.     -1,-1,0,
  26.     1,-1,0
  27.   );
  28.   colors: array[0..11] of GLfloat = (
  29.     1,1,0,1,
  30.     0,1,1,1,
  31.     1,0,1,1
  32.   );
  33.  
  34.  
  35. begin
  36.   FDC := GetDC(Handle);
  37.   FRC := CreateWGLRenderingContext(FDC, TGLOption.Create(8,8,8,8,24,8,True), 4, 0).RenderingContext;
  38.   wglMakeCurrent(FDC, FRC);
  39.  
  40.   FVertexShader := glCreateShader(GL_VERTEX_SHADER);
  41.   glShaderSource(FVertexShader, 1, @vertexSource, nil);
  42.   glCompileShader(FVertexShader);                            {Status abgefragt:OK}  
  43.  
  44.   FFragmentShader := glCreateShader(GL_FRAGMENT_SHADER);
  45.   glShaderSource(FFragmentShader, 1, @fragmentSource, nil);
  46.   glCompileShader(FFragmentShader);                          {Status abgefragt:OK}
  47.  
  48.   FProgram := glCreateProgram;
  49.   glAttachShader(FProgram, FVertexShader);
  50.   glAttachShader(FProgram, FFragmentShader);
  51.   glLinkProgram(FProgram);                                   {Status abgefragt:OK}
  52.  
  53.   glUseProgram(FProgram);
  54.  
  55.   FMVPMatrixLocation := glGetUniformLocation(FProgram, 'MVPMatrix');
  56.   FPositionLocation  := glGetAttribLocation(FProgram,  'VertexPosition');
  57.   FColorLocation     := glGetAttribLocation(FProgram,  'VertexColor');
  58.  
  59.   glGenVertexArrays(1, @FVertexArray);
  60.   glBindVertexArray(FVertexArray);                                             {GL_NO_ERROR}
  61.   glGenBuffers(1, @FPositionBuffer);
  62.   glBindBuffer(GL_ARRAY_BUFFER, FPositionBuffer);                              {GL_NO_ERROR}
  63.   glBufferData(GL_ARRAY_BUFFER, SizeOf(vertices), @vertices, GL_STATIC_DRAW);  {GL_NO_ERROR}
  64.   glVertexAttribPointer(FPositionLocation, 3, GL_FLOAT, GL_FALSE, 0, nil);     {GL_NO_ERROR}
  65.   glEnableVertexAttribArray(FPositionLocation);                                {GL_NO_ERROR}
  66.   glGenBuffers(1, @FColorBuffer);
  67.   glBindBuffer(GL_ARRAY_BUFFER, FColorBuffer);                                 {GL_NO_ERROR}
  68.   glBufferData(GL_ARRAY_BUFFER, SizeOf(colors), @colors, GL_STATIC_DRAW);      {GL_NO_ERROR}
  69.   glVertexAttribPointer(FColorLocation, 4, GL_FLOAT, GL_FALSE, 0, nil);        {GL_NO_ERROR}
  70.   glEnableVertexAttribArray(FColorLocation);                                   {GL_NO_ERROR}
  71.   glBindVertexArray(0);
  72.  
  73.   glClearColor(0, 0, 1, 1);
  74.   glClearDepth(1.0);
  75.   glDepthFunc(GL_LEQUAL);
  76.   glEnable(GL_DEPTH_TEST);                                                     {GL_NO_ERROR}
  77.  
  78.   Application.OnIdle := AppIdle;
  79. end;
  80.  
  81. procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
  82. var AFov: ovrFovPort;
  83.     finalUp, finalForward, shiftedEyePos: TVector3D;
  84.     model, view, proj, mvp: TMatrix3D;
  85. begin
  86.   Done := False;
  87.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);                         {GL_NO_ERROR}
  88.  
  89.   with afov do
  90.    begin
  91.     uptan:=1.329;                                                              {von der Oculus-Demo abgeschrieben}
  92.     downtan:=1.329;
  93.     lefttan:=1.0587;
  94.     righttan:=1.0924;
  95.    end;
  96.  
  97.   finalUp :=      Vector3D(0,1,0,0);                                           {von der Oculus-Demo abgeschrieben}
  98.   finalForward := Vector3D(0,0,-1,0);
  99.   shiftedEyePos:= Vector3D(0, 0, 1);
  100.  
  101.   model:=IdentityMatrix3D;
  102.   view := MatrixLookAtRH(shiftedEyePos, shiftedEyePos + finalForward, finalUp);
  103.   proj := TMatrix3D(ovrMatrix4f_Projection(AFov, 0.01, 10000.0, True));
  104.   TransposeMatrix3D(proj);
  105.   mvp := model * view * proj;
  106.  
  107.   glViewPort(0,0,800,600);                                                     {GL_NO_ERROR}        
  108.   glUniformMatrix4fv(FMVPMatrixLocation, 1, GL_FALSE, @mvp);                   {GL_NO_ERROR}
  109.   glBindVertexArray(FVertexArray);                                             {GL_NO_ERROR}
  110.   glEnableVertexAttribArray(FColorLocation);                                   {GL_NO_ERROR}
  111.   glDrawArrays(GL_TRIANGLES, 0, 3);                                            {GL_NO_ERROR}
  112.  
  113.   glBindVertexArray(0);
  114. end;
  115.  
  116.  
  117.  
  118.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGl3: Nichts zu sehen
BeitragVerfasst: Fr Mär 27, 2015 10:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die Initialisierung ist nicht korrekt, denn für OpenGL 3.0 und aufwärts benötigt man eine 2 Schritte initialisierung.
Erst erstellt man ein normalen Kontext, der ist dann etwas zwischen 1.1 und 2.1 fähig.
Nun kann man nach fragen ob 3 und höher verfügbar ist und dann explizit ein solchen initialisieren.
http://wiki.delphigl.com/index.php/Tutorial_OpenGL3_Zeichenkontext

Das ist selbst mit OpenGL 4.5 noch ein Problem und soll erst mit der kommenden 5.0 gelöst werden, wenn eine neue Funktion eingeführt wird.

Dies ist notwendig, weil du im Shader explizit 330 anforderst und die Version hat alle obsolete API Calls raus geworfen und damit werden intern Fehler geworfen und einige Shader Variablen gibt es dann auch garnicht mehr.

Am Anfang solltest du auch die Matrix weg lassen, deine Vertices gehen von -1 bis 1 und damit kannst du die einfach so auf gl_Position übergeben und es wird von der linken bis rechten bildschirmhälfte gehen.

_________________
"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: OpenGl3: Nichts zu sehen
BeitragVerfasst: Fr Mär 27, 2015 19:43 
Offline
DGL Member

Registriert: Mi Mär 25, 2015 19:13
Beiträge: 3
Programmiersprache: Delphi XE7
Danke für den Hinweis und den Link. Das muss ich erst mal verdauen, sprich, nach Delphi umsetzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGl3: Nichts zu sehen
BeitragVerfasst: Fr Mär 27, 2015 20:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich denke der Fehler ist viel banaler, es fehlt am Ende der Renderscene SwapBuffers(FDC);

Wie soll OpenGL sonst wissen, wo es hinzeichnen soll.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGl3: Nichts zu sehen
BeitragVerfasst: So Mär 29, 2015 20:08 
Offline
DGL Member

Registriert: Mi Mär 25, 2015 19:13
Beiträge: 3
Programmiersprache: Delphi XE7
Nicht zu fassen. Ich sehe etwas. Ein Dreieck.

Die Anweisung HRC := CreateWGLRenderingContext(DC, TGLOption.Create(8,8,8,8,24,8,True), 4, 0).RenderingContext;

die im abgekupferten Quelltext steht, steckt in einer Unit namens OpenGl.Context.Win.pas, die der Autor (den ich nicht erreichen kann) mit dem Hinweis

// refer : Mike Lischke's OpenGL.pas

versieht. Sie scheint genau das zweischrittige Verfahren, das TAK2004 mir erklärt hat, umzusetzen.

Jedenfalls bis ich sehr froh und bedanke mich.
Nach den Osterferien geht es dann weiter.

Thomas.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGl3: Nichts zu sehen
BeitragVerfasst: Mo Mär 30, 2015 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Oh ein fehlendes Swap -_-

Ich habe auch vor in 1-2 Monaten mal unsere Simulations Software mit einer VR aus zu statten, damit man den Kameraturm vom Rover damit steuern kann.

_________________
"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: OpenGl3: Nichts zu sehen
BeitragVerfasst: Mo Mär 30, 2015 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Nicht zu fassen. Ich sehe etwas. Ein Dreieck.

Dies ist sehr viel Wert, da weis man wenigsten, das mit dem Context alles in Ordnung ist. :wink:

_________________
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 » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 46 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.050s | 19 Queries | GZIP : On ]