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

Aktuelle Zeit: Sa Mai 18, 2024 08:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 39 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Sa Nov 30, 2013 00:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
hast du xfire? oder icq??

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Sa Nov 30, 2013 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Verstehe ich das richtig, sobald die Dreiecke farbig sein sollen, dann braucht es einen Shader ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Sa Nov 30, 2013 14:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Ja, weil die Farbe ja erst vom Fragmentshader festgelegt wird.

_________________
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: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Sa Nov 30, 2013 22:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe folgende Zeilen in FormCreate eingefügt:

glCreateShader(GL_VERTEX_SHADER);
glCreateShader(GL_FRAGMENT_SHADER);

Aber leider kommen immer noch keine Farben.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Sa Nov 30, 2013 23:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Shader sind Programme, die du in GLSL programmieren musst. Du musst OpenGL den Shader-Quellcode übergeben, ihn kompilieren und linken. Wie das geht, ist im Tutorial glsl erklärt (bitte auch lesen!). Die Funktion glCreateShader ist auch beteiligt, aber nur ein Shader-Objekt zu erzeugen, ohne etwas damit zu machen, reicht natürlich nicht.

Sinnvollerweise lädt man den Shadercode aus einer Textdatei. Dies tut vermutlich die Funktion "LoadShaders", die du neulich schon angesprochen hast.

Hier ist mal ein Minimal-Beispiel, wie GLSL-Shader aussehen können:
(Vertexshader)
Code:
  1. #version 330
  2. // Input vom VBO:
  3. in vec3 inPos;
  4. in vec4 inColor;
  5.  
  6. // Ausgabe an den Fragmentshader:
  7. out vec4 Color;
  8.  
  9. void main(void)
  10. {
  11.   gl_Position = vec4(inPos, 1.0);
  12.   Color = inColor;
  13. }

(Fragmentshader)
Code:
  1. #version 330
  2. in vec4 Color;     // interpolierte Farbe vom Vertexshader
  3. out vec4 outColor; // ausgegebene Farbe
  4.  
  5. void main(void)
  6. {
  7.   outColor = Color;
  8. }


Der Code ist nicht getestet, aufgrund der Trivialität glaube ich aber nicht, dass sich dort ein Fehler eingeschlichen hat. Aber OpenGL wird dir schon sagen, wenn sich der Code nicht kompilieren oder linken lässt. Nachdem du das Tutorial gelesen hast, möchte ich nochmal auf die Punkte hinweisen, die sich seit dem Tutorial an GLSL geändert haben.

_________________
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: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Dez 01, 2013 19:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Endlich einen Schritt weiter gekommen. :D

Jetzt kommt ein farbiges Dreieck, welches das ganze Fenster ausfüllt und sich nicht mehr dreht .

Erst wen ich diesen Befehl glUseProgram(programID); entferne, dann kommen wieder 2 Dreiecke, welche kleiner sind, aber dafür sind sie wieder weiss.
Warscheinlich liegt das daran, das ich noch alte Befehle im Programm habe.

Die Fehlerauswertung, des Shader funktioniert auch nicht richtig, InfoLogLength ist 11 anstelle 0 und es kommt No error.. Dies ist jetzt nicht so wichtig.

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, Windows;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     Timer1: TTimer;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure FormPaint(Sender: TObject);
  17.     procedure FormResize(Sender: TObject);
  18.     procedure Timer1Timer(Sender: TObject);
  19.   private   { private declarations }
  20.   public        { public declarations }
  21.     DC: HDC;  //Handle auf Zeichenfläche
  22.     RC: HGLRC;//Rendering Context  end;
  23.     ProgramID: GLuint;
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.lfm}
  32.  
  33. { TForm1 }
  34.  
  35. const
  36.   NearClipping = 1;
  37.   FarClipping = 1000;
  38.  
  39.   Winkel: integer = 10;
  40.  
  41.   g_vertex_buffer_data: array[0..17] of GLfloat =
  42.     (-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0,
  43.     2.0, -1.0, 0.0, 4.0, -1.0, 0.0, 3.0, 1.0, 0.0);
  44.  
  45.   g_color_buffer_data: array[0..17] of GLfloat =
  46.     (1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0,
  47.     1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0);
  48.  
  49. var
  50.   vertexbuffer, colorbuffer: GLuint;
  51.   VertexArrayID: GLuint;
  52.  
  53. function Initshader: GLuint;
  54. var
  55.   sl: TStringList;
  56.   str: string;
  57.   strlen: integer;
  58.  
  59.   ProgramObject: GLhandle;
  60.   VertexShaderObject: GLhandle;
  61.   FragmentShaderObject: GLhandle;
  62.  
  63.   Result2, InfoLogLength: integer;
  64.  
  65. begin
  66.   sl := TStringList.Create;
  67.   ProgramObject := glCreateProgram();
  68.  
  69.   VertexShaderObject := glCreateShader(GL_VERTEX_SHADER);
  70.   sl.LoadFromFile('Vertexshader.txt');
  71.   str := sl.Text;
  72.   writeln(str);
  73.   strlen := Length(sl.Text);
  74.   glShaderSource(VertexShaderObject, 1, @str, @strlen);
  75.   glCompileShader(VertexShaderObject);
  76.   glAttachShader(ProgramObject, VertexShaderObject);
  77.  
  78.   // Check  Shader
  79.   glGetShaderiv(VertexShaderObject, GL_COMPILE_STATUS, @Result2);
  80.   glGetShaderiv(VertexShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  81.   if (InfoLogLength > 0) then
  82.   begin
  83.     glGetShaderInfoLog(VertexShaderObject, InfoLogLength, InfoLogLength, PChar(str));
  84.     Writeln('Fehler:', InfoLogLength, str, '---');
  85.   end;
  86.   glDeleteShader(VertexShaderObject);
  87.  
  88.   FragmentShaderObject := glCreateShader(GL_FRAGMENT_SHADER);
  89.   sl.LoadFromFile('Fragmentshader.txt');
  90.   str := sl.Text;
  91.   writeln(str);
  92.   strlen := Length(sl.Text);
  93.   glShaderSource(FragmentShaderObject, 1, @str, nil);
  94.   glCompileShader(FragmentShaderObject);
  95.   glAttachShader(ProgramObject, FragmentShaderObject);
  96.  
  97.   // Check  Shader
  98.   glGetShaderiv(FragmentShaderObject, GL_COMPILE_STATUS, @Result2);
  99.   glGetShaderiv(FragmentShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  100.   if (InfoLogLength > 0) then
  101.   begin
  102.     glGetShaderInfoLog(FragmentShaderObject, InfoLogLength, InfoLogLength, PChar(str));
  103.     Writeln('Fehler:', InfoLogLength, str, '---');
  104.   end;
  105.  
  106.   glDeleteShader(FragmentShaderObject);
  107.  
  108.   glLinkProgram(ProgramObject);
  109.  
  110.   Result := ProgramObject;
  111.   sl.Free;
  112. end;
  113.  
  114. procedure TForm1.FormCreate(Sender: TObject);
  115. begin
  116.   DC := GetDC(Handle);
  117.   if not InitOpenGL then
  118.     Application.Terminate;
  119.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  120.   ActivateRenderingContext(DC, RC);
  121.  
  122.   glClearColor(0.8, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  123.  
  124.   glEnable(GL_DEPTH_TEST);
  125.   // Accept fragment if it closer to the camera than the former one
  126.   glDepthFunc(GL_LESS);
  127.  
  128.   glGenVertexArrays(1, @VertexArrayID);
  129.   glBindVertexArray(VertexArrayID);
  130.  
  131.   ProgramID := InitShader;
  132.  
  133.   glGenBuffers(1, @vertexbuffer);
  134.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  135.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data),
  136.     @g_vertex_buffer_data, GL_STATIC_DRAW);
  137.  
  138.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, Pointer(0));
  139.  
  140.   glGenBuffers(1, @colorbuffer);
  141.   glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  142.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data),
  143.     @g_color_buffer_data, GL_STATIC_DRAW);
  144.  
  145.   glVertexAttribPointer(1, 3, GL_FLOAT, False, 0, Pointer(0));
  146.  
  147.   // Use our shader
  148.   glUseProgram(programID);
  149. end;
  150.  
  151. procedure TForm1.FormDestroy(Sender: TObject);
  152. begin
  153.   glDeleteBuffers(1, @vertexbuffer);
  154.   glDeleteBuffers(1, @colorbuffer);
  155.   DeactivateRenderingContext;
  156.   DestroyRenderingContext(RC);
  157.   ReleaseDC(Handle, DC);
  158. end;
  159.  
  160. procedure TForm1.FormPaint(Sender: TObject);
  161. begin
  162.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  163.  
  164.   glMatrixMode(GL_MODELVIEW);
  165.   glLoadIdentity;
  166.  
  167.   glTranslatef(0, 0, -5);
  168.   glRotatef(Winkel, 0, 1, 0);
  169.  
  170.   glEnableVertexAttribArray(0);
  171.   glEnableVertexAttribArray(1); z
  172.   glDrawArrays(GL_TRIANGLES, 0, 3 * 2 * 2);
  173.   glDisableVertexAttribArray(1);
  174.   glDisableVertexAttribArray(0);
  175.  
  176.   SwapBuffers(DC);
  177. end;
  178.  
  179. procedure TForm1.FormResize(Sender: TObject);
  180. begin
  181.   glViewport(0, 0, ClientWidth, ClientHeight);
  182.   glMatrixMode(GL_PROJECTION);
  183.   glLoadIdentity;
  184.   gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
  185.  
  186.   glMatrixMode(GL_MODELVIEW);
  187.   glLoadIdentity;
  188. end;
  189.  
  190. procedure TForm1.Timer1Timer(Sender: TObject);
  191. begin
  192.   Inc(Winkel);
  193.   if Winkel = 360 then
  194.     winkel := 0;
  195.   FormPaint(Sender);
  196. end;
  197.  
  198. end.

_________________
OpenGL


Zuletzt geändert von mathias am So Dez 08, 2013 17:43, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Dez 01, 2013 19:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
glGetShaderiv mit dem Parameter GL_INFO_LOG_LENGTH gibt nunmal keinen Fehlercode aus, sondern die Länge des InfoLogs. Dort darf auch was drin stehen, wenn es keinen Fehler zu melden gibt. Eben sowas wie "No errors.", was 11 Zeichen sind, wenn man das abschließende '\0' mitzählt. Oder auch Warnungen.

Wenn du möchtest, dass sich die Dreiecke drehen, musst du den Vertexshader so programmieren, dass er die Vertices entsprechend rotiert. Zum Beispiel kannst du alle Vertices mit einer Matrix transformieren, wie es auch die Fixed-Function-Pipeline tut. Beispiel:
Code:
  1. #version 330
  2. uniform mat4 u_Matrix;
  3.  
  4. // Input vom VBO:
  5. in vec3 inPos;
  6. in vec4 inColor;
  7.  
  8. // Ausgabe an den Fragmentshader:
  9. out vec4 Color;
  10.  
  11. void main(void)
  12. {
  13.   gl_Position = u_Matrix * vec4(inPos, 1.0);
  14.   Color = inColor;
  15. }

Die Werte der Matrix musst du dann auf der CPU berechnen und per glUniformMatrix4fv an den Shader übergeben (während dieser gebunden ist). Wie man eine entsprechende Rotationsmatrix berechnet, steht im Wiki-Artikel zu glRotate. Genau so ist es mit den Matrizen für das Viewfrustum usw. Wer das nicht alles per Hand implementieren will, kann auch auf fremde Mathe-Libraries zurückgreifen (für Pascal kenne ich allerdings keine).

_________________
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: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Dez 01, 2013 19:55 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Es ist nirgens garantiert, dass der InfoLog der Länge 0 ist, wenn kein Fehler auftritt.
Du müsstest den Compilestatus mit "GL_COMPILE_STATUS" abfragen. Wenn der Shader erfolgreich kompiliert wurde, wird "GL_TRUE" zurückgegeben, sonst "GL_FALSE". Wegen teilweise sinnvollen Warnungen, würde ich den Log allerdings erstmal nicht verstecken.

Ich würde dir außerdem empfehlen, nochmal eine solche Fehlerprüfung nach dem Linken durchzuführen. Auch da kann einiges schiefgehen. Zum Beispiel wenn der Output vom Vertexshader nicht zu dem Input des Fragmentshader passt. Das geht dann ganz analog zu der bereits existierenden Prüfung mit "glGetProgramiv" und dem Parametern "GL_INFO_LOG_LENGTH" für die Log-Länge sowie "GL_LINK_STATUS" um herauszufinden, ob das linken überhaupt geklappt hat. Den Text des Infologs selber bekommt man mit "glGetProgramInfoLog" ebenfalls genauso wie schon beim Shader.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Dez 01, 2013 23:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Die Fehlerabfrage selbst würde funktionieren, nun habe ich ein Problem mit PChar/PGLChar. Anstelles der Fehlerbeschreiben kommt ein vermüllter String raus. Die Zeilen mit Write(str), für die Shaderquelltextausgabe gibt es nicht mehr. Ich habe bewusst einen Syntaxfehler in die Shader-Datei eingebaut.

Fehlerausgabe:
Code:
  1. Fehler:ERROR: 0:1: 'b' : syntax error syntax error
  2.  
  3.  erte Farbe vom Vertexshader
  4. out vec4 outColor; // ausgegebene Farbe
  5.  
  6. void main(void)
  7. {
  8.   outColor = Color;
  9. }


Quelltext:
Code:
  1. var
  2.   PC: PGLChar;

Code:
  1.   glGetShaderiv(FragmentShaderObject, GL_LINK_STATUS, @ErrorStatus);
  2.   if ErrorStatus = GL_FALSE then
  3.   begin
  4.     glGetShaderiv(FragmentShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  5.     glGetShaderInfoLog(FragmentShaderObject, InfoLogLength, InfoLogLength, PC);
  6.     Writeln('Fehler:', PC);
  7.   end;
  8.  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Dez 01, 2013 23:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
mathias hat geschrieben:
Code:
  1. glGetShaderiv(FragmentShaderObject, GL_LINK_STATUS, @ErrorStatus);
Diese Zeile ist fehlerhaft. Du kannst vom (Fragment)ShaderObject keinen Linker-Status abfragen. Wenn du wissen möchtest, ob ein Programm erfolgreich gelinkt wurde, muss du das ProgramObject danach fragen. Dann aber nicht mit glGetShaderiv, sondern mit glGetProgramiv.

Also z.B.:
Code:
  1. glGetProgramiv(ProgramObject, GL_LINK_STATUS, @ErrorStatus);

Linker-Fehlermeldungen in Textform bekommst du analog mit glGetProgramInfoLog.

_________________
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: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Mo Dez 02, 2013 22:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ist die Shaderroutine so richtig, oder würdet ihr da noch was ändern ?
Writeln habe ich durch MessageBox ersetzt.
Code:
  1. function Initshader: GLuint;
  2. var
  3.   StringList: TStringList;
  4.   Str: string;
  5.   strlen: integer;
  6.   PC: PGLChar;
  7.  
  8.   ProgramObject: GLhandle;
  9.   VertexShaderObject: GLhandle;
  10.   FragmentShaderObject: GLhandle;
  11.  
  12.   ErrorStatus, InfoLogLength: integer;
  13.  
  14. begin
  15.   StringList := TStringList.Create;
  16.   ProgramObject := glCreateProgram();
  17.  
  18.   VertexShaderObject := glCreateShader(GL_VERTEX_SHADER);
  19.   StringList.LoadFromFile('Vertexshader.txt');
  20.   Str := StringList.Text;
  21.   strlen := Length(StringList.Text);
  22.   glShaderSource(VertexShaderObject, 1, @Str, @strlen);
  23.   glCompileShader(VertexShaderObject);
  24.   glAttachShader(ProgramObject, VertexShaderObject);
  25.  
  26.   // Check  Shader
  27.   glGetShaderiv(VertexShaderObject, GL_COMPILE_STATUS, @ErrorStatus);
  28.   if ErrorStatus = GL_FALSE then
  29.   begin
  30.     glGetShaderiv(VertexShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  31.     glGetShaderInfoLog(VertexShaderObject, InfoLogLength, InfoLogLength, PC);
  32.     Application.MessageBox(PC, 'OpenGL Fehler', 0);
  33.   end;
  34.  
  35.   glDeleteShader(VertexShaderObject);
  36.  
  37.   FragmentShaderObject := glCreateShader(GL_FRAGMENT_SHADER);
  38.   StringList.LoadFromFile('Fragmentshader.txt');
  39.   Str := StringList.Text;
  40.   strlen := Length(StringList.Text);
  41.   glShaderSource(FragmentShaderObject, 1, @Str, nil);
  42.   glCompileShader(FragmentShaderObject);
  43.   glAttachShader(ProgramObject, FragmentShaderObject);
  44.  
  45.   // Check  Shader
  46.   glGetShaderiv(FragmentShaderObject, GL_COMPILE_STATUS, @ErrorStatus);
  47.   if ErrorStatus = GL_FALSE then
  48.   begin
  49.     glGetShaderiv(FragmentShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  50.     glGetShaderInfoLog(FragmentShaderObject, InfoLogLength, InfoLogLength, PChar(Str));
  51.     Application.MessageBox(PC, 'OpenGL Fehler', 0);
  52.   end;
  53.  
  54.   glDeleteShader(FragmentShaderObject);
  55.  
  56.   glLinkProgram(ProgramObject);
  57.  
  58.   // Check  Link
  59.   glGetProgramiv(ProgramObject, GL_LINK_STATUS, @ErrorStatus);
  60.   if ErrorStatus = GL_FALSE then
  61.   begin
  62.     glGetProgramiv(ProgramObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  63.     glGetProgramInfoLog(ProgramObject, InfoLogLength, InfoLogLength, PC);
  64.     Application.MessageBox(PC, 'OpenGL Fehler', 0);
  65.   end;
  66.  
  67.   Result := ProgramObject;
  68.   StringList.Free;
  69. end;  

_________________
OpenGL


Zuletzt geändert von mathias am So Dez 08, 2013 17:42, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Mo Dez 02, 2013 22:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Wenn du dir die Fehlermeldungen mit glGetShaderInfoLog oder glGetProgramInfoLog abholst, musst du den Funktionen auch Speicherplatz bereitstellen, in den sie ihre Meldungen schreiben können. Momentan übergibst du nur einen Pointer ins Nichts (PC). Stattdessen solltest du PC auf einen Speicherblock zeigen lassen, der so groß ist wie InfoLogLength. Und am Ende nicht vergessen, den Speicherplatz wieder freizugeben! :)

Wie das in Pascal genau geht, kann ich dir leider nicht aus dem Kopf sagen.

_________________
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: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Di Dez 03, 2013 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Der bevorzugte Weg ist:
Code:
  1.  
  2. var Msg: AnsiString;
  3. begin
  4.   // …
  5.   if ErrorStatus = GL_FALSE then
  6.   begin
  7.     glGetShaderiv(FragmentShaderObject, GL_INFO_LOG_LENGTH, @InfoLogLength);
  8.     SetLength(Msg, InfoLogLength);
  9.     glGetShaderInfoLog(FragmentShaderObject, InfoLogLength, InfoLogLength, @Msg[1]);
  10.     Application.MessageBox(PC, 'OpenGL Fehler', 0);
  11.   end;
  12.   // …
  13. end;


:)

_________________
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  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Dez 08, 2013 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Danke, hat geklappt, ich habe noch PC durch PChar(Msg) in der Zeile ...MessageBox(PC,... ersetzt.

Was ich unterdessen festgestellt habe, das man durch das neue OpenGL fast keine Untersützung mehr hat, z.B. glRotate und glTranslate. Ich musste da selbst was schreiben.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: So Jan 05, 2014 19:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Was mit aufgefallen ist, mit dem alten OpenGL konnte man wild losprogrammieren. Da hatte es noch keine Shader, VBOs, etc. Der Einstieg war dadurch viel einfacher, man konnte glBegin, ein paar Vertexpunkte, glEnd eingeben und schon hatte man ein Polygon.
Das neue OpenGL hat natürlich auch viele Vorteil, es ist sehr flexibel und natürlich auch schneller, da man nur noch die Vertex-Punkte übergeben muss.
Wen ich mir diesen alten Programm Ausschnitt angucke, das kann ja nicht schnell sein. Bei jedem Rendern wurde neu berechnet.
Code:
  1. procedure Stutzen(h1, h2, r : Single; Sektoren : Integer);
  2. var
  3.   i : Integer;
  4.   h, c1, c2 : Single;
  5. begin
  6.   for i := 0 to Sektoren - 1 do begin
  7.     if i > 17 then begin
  8.       c1 := 36 - i;
  9.       c2 := 36 - i - 1;
  10.     end else begin
  11.       c1 := i;
  12.       c2 := i + 1;
  13.     end;
  14.     c1 := 1 - c1 / 35 - 0.3;
  15.     c2 := 1 - c2 / 35 - 0.3;
  16.     glBegin(GL_QUADS);
  17.       glColor3f(c1, c1, c1);
  18.       h := Sqrt(Sqr(h2) - Sqr(KreisTab[i].x * r));
  19.       with KreisTab[i] do glVertex3f(x * r, h1, y * r);
  20.       with KreisTab[i] do glVertex3f(x * r, h,  y * r);
  21.       glColor3f(c2, c2, c2);
  22.       h := Sqrt(Sqr(h2) - Sqr(KreisTab[i + 1].x * r));
  23.       with KreisTab[i + 1] do glVertex3f(x * r, h,  y * r);
  24.       with KreisTab[i + 1] do glVertex3f(x * r, h1, y * r);
  25.     glEnd;
  26.   end;
  27. end;

Zu den Shadern, ich mag mich erinnern, als die ersten Grafikkarten auf dem Märt kahmen, bei denen man den Shader frei programmieren konnte. Da dachte man dies brauchen nur profesionelle Spieleprogrammierer und jetzt wendet man dies selbst an. :shock:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 39 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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.012s | 15 Queries | GZIP : On ]