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

Aktuelle Zeit: Di Jul 08, 2025 21:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Terrain Rendern
BeitragVerfasst: Mo Okt 10, 2011 11:45 
Offline
DGL Member

Registriert: Mo Okt 10, 2011 10:17
Beiträge: 5
Hallo erstmal,
ich habe folgendes Problem:
Ich habe mir die (sehr guten) Tutorials hier zum Thema "Terrain Rendern mit OpenGl" durchgelesen und wollte mir jetzt ein eigenes Programm schreiben.
Dieses sieht folgendermaßen aus:
http://imageshack.us/photo/my-images/854/terrainrendering.jpg/

Die Perlin-Noise-Map-Generierung funktioniert auch tadellos, aber wenn er das Terrain rendern will, kommt folgender Fehler:
http://imageshack.us/photo/my-images/513/errorln.jpg/

Und ich habe keine Ahnung wieso dieser Fehler auftritt.
Die Prozeduren, in denen der Fehler meiner Meinung nach auftreten kann sind diese hier:
Code:
  1. procedure TF_TerrainRendering.SetupGL;
  2. const light_position : array[0..3] of TGLfloat = (-1.0, 1.0, 1.0, 0.0);
  3.       mat_specular   : array[0..3] of TGLfloat = (0.1, 0.1, 0.1, 1.0);
  4.       mat_shininess  : array[0..0] of TGLfloat = (0.0);
  5.       mat_ambient    : array[0..3] of TGLfloat = (0.7, 0.7, 0.7, 0.0);
  6.       mat_diffuse    : array[0..3] of TGLfloat = (0.8, 0.8, 0.8, 0.0);
  7. begin
  8. glClearColor(0.1, 0.1, 0.1, 0.1);                                              
  9. glEnable(GL_DEPTH_TEST);
  10. glEnable(gl_Cull_Face);
  11. glCullface(GL_Back);
  12. glEnable(GL_TEXTURE_2D);
  13. glShadeModel(GL_SMOOTH);
  14. glMaterialfv(GL_FRONT, GL_SPECULAR, @mat_specular[0]);
  15. glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  16. glMaterialfv(GL_FRONT, GL_AMBIENT, @mat_ambient[0]);
  17. glMaterialfv(GL_FRONT, GL_DIFFUSE, @mat_diffuse[0]);
  18. glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  19. glEnable(GL_LIGHTING);
  20. glEnable(GL_LIGHT0);
  21. end;
  22.  
  23. procedure TF_TerrainRendering.IdleHandler(Sender: TObject; var Done: Boolean);
  24. begin
  25. Render;
  26. Done:= false;
  27. end;
  28.  
  29. procedure TF_TerrainRendering.Render;
  30. begin
  31. Dreiecke := 0;
  32. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  33. glMatrixMode(GL_PROJECTION);
  34. glLoadIdentity;
  35. gluPerspective(45.0, 1, NearClipping, FarClipping);
  36. glMatrixMode(GL_MODELVIEW);
  37. glLoadIdentity;
  38. glRotatef(XRotation, 1, 0, 0);
  39. glRotatef(YRotation, 0, 1, 0);
  40. glPushAttrib(GL_LIGHTING);
  41. glPopAttrib();
  42. glClear(GL_DEPTH_BUFFER_BIT);
  43. glTranslatef(-256, -200, -256);
  44. if IsLoaded and IsHeightmap then u_Rendering.ZeichneHeightmap(Aufloesung, Dreiecke)
  45.  else if (not IsLoaded) and IsHeightmap then
  46.          begin
  47.          u_Rendering.LadeHeightmap(Aufloesung);
  48.          IsLoaded := true;
  49.          end;
  50. SwapBuffers(DC);
  51. end;
  52.  
  53. procedure TF_TerrainRendering.FormCreate(Sender: TObject);
  54. begin
  55. YRotation := 0;
  56. XRotation := 0;
  57. IsLoaded := false;
  58. IsHeightmap := false;
  59. Aufloesung := TrB_MapResolution.Position;
  60. NearClipping := TrB_NearCLipping.Position;
  61. FarClipping := TrB_FarClipping.Position;
  62. u_PerlinNoise.Abstand := TrB_Intervall.Position;
  63. DC:= GetDC(Pnl_Terrain.Handle);
  64. if not InitOpenGL then Application.Terminate;
  65. RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
  66. ActivateRenderingContext(DC, RC);
  67. SetupGL;
  68. Application.OnIdle := IdleHandler;
  69. end;
  70. procedure TF_TerrainRendering.Btn_GenHeightmapClick(Sender: TObject);
  71. begin
  72. IsLoaded := false;
  73. IsHeightmap := false;
  74. u_PerlinNoise.Blur(u_PerlinNoise.Laenge, u_PerlinNoise.Abstand);                // Heightmap aufbauen
  75. Img_Heightmap.Picture.Bitmap := u_PerlinNoise.Heightmap;                        // Heightmap zeichnen
  76. Btn_SaveHeightmap.Enabled := true;
  77. IsHeightmap := true;
  78. end;


Da der Code ein bisschen zu lang ist um ihn hier zu posten, hänge ich das ganze Projekt hier an.
Ich hoffe es kann mir jemand helfen.

mfg
Hering

Projekt: http://www.megaupload.com/?d=MGI5FJWN


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain Rendern
BeitragVerfasst: Mo Okt 10, 2011 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Der Fehler "Zugriffsverletzung" bedeutet das dein Programm auf Speicher zugreift der nicht zum Programm gehört. In aller Regel wurde irgendetwas nicht oder nicht richtig initialisiert. Am besten lässt du dein Programm mal im Debugger laufen, dann hast du schnell die exakte Stelle an der das Programm abstürzt. Ein Debugger ist in Delphi (und bestimmt auch in Lazarus) eingebaut.

P.S. Willkommen im Forum :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain Rendern
BeitragVerfasst: Mo Okt 10, 2011 22:16 
Offline
DGL Member

Registriert: Mo Okt 10, 2011 10:17
Beiträge: 5
Hallo,
Danke für das Willkommen-Heißen (und natürlich für den Hinweis) :)

Ich weiß nicht ob ich das richtig gemacht habe mit dem Debuggen(hab damit gar keine Erfahrung, ich musste bis jetzt lediglich Haltepunkte setzen können..)
Daher kommt mir auch die Ausgabe des Debuggers merkwürdig vor: E2156 Ausdruck zu komplex
Und zwar in dem unten angegebenen Codeblock bei der if Anweisung
Code:
  1. if IsLoaded and IsHeightmap then u_Rendering.ZeichneHeightmap(Aufloesung, Dreiecke)
  2.  else if (not IsLoaded) and IsHeightmap then
  3.          begin
  4.          u_Rendering.LadeHeightmap(Aufloesung);
  5.          IsLoaded := true;
  6.          end;


Das kann ja wohl nicht alles sein oder?

mfg
Hering

//EDIT
Wenn ich das Programm oft genug ausführe, läuft es sogar ohne Fehler^^
Aber ich habe nichts geändert, nur stur F9 gedrückt
mfg
Hering


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain Rendern
BeitragVerfasst: Di Okt 11, 2011 11:26 
Offline
DGL Member

Registriert: Mo Okt 10, 2011 10:17
Beiträge: 5
Hallo,

Okay der Fehler liegt anscheinend wirklich irgendwo hier versteckt:
Code:
  1. procedure TF_TerrainRendering.IdleHandler(Sender: TObject; var Done: Boolean);
  2. begin
  3. if IsHeightmap = true then
  4.    begin
  5.    if IsLoaded = true then Render
  6.     else
  7.       begin
  8.       u_Rendering.LadeHeightmap(Aufloesung);
  9.       IsLoaded := true;
  10.       end;
  11.    end;
  12. Done:= false;
  13. end;


Die Prozedur für Render:
Code:
  1. procedure TF_TerrainRendering.Render;
  2. begin
  3. Dreiecke := 0;
  4. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5. glMatrixMode(GL_PROJECTION);
  6. glLoadIdentity;
  7. gluPerspective(45.0, 1, NearClipping, FarClipping);
  8. glMatrixMode(GL_MODELVIEW);
  9. glLoadIdentity;
  10. glRotatef(XRotation, 1, 0, 0);
  11. glRotatef(YRotation, 0, 1, 0);
  12. glPushAttrib(GL_LIGHTING);
  13. glPopAttrib();
  14. glClear(GL_DEPTH_BUFFER_BIT);
  15. glTranslatef(-256, -200, -256);
  16. u_Rendering.ZeichneHeightmap(Aufloesung, Dreiecke);
  17. SwapBuffers(DC);
  18. end;


Die Prozedur für ZeichneHeightmap:
Code:
  1. procedure ZeichneHeightmap(Aufloesung : SmallInt; Dreiecke : LongInt);
  2. const VertPos : Array[0..3] of Array[0..1] of Byte = ((0,0),(0,1),(1,1),(1,0));
  3. var X, Z, I   : LongInt;
  4.     Vertieces : Array[0..3] of TVertex;
  5.  
  6.     procedure ZeichneDreiecke(V1, V2, V3 : Integer);
  7.     var Normale : TVertex;
  8.     begin
  9.     Inc(Dreiecke);
  10.     Normale := VectorCrossProduct(                                              //Flächennormale berechnen
  11.                      VectorSubtract(Vertieces[V1], Vertieces[V2]),
  12.                VectorSubtract(Vertieces[V2], Vertieces[V3]));
  13.     NormalizeVector(Normale);
  14.     glNormal3fv(@Normale[0]);                                                   //Dreieck zeichnen
  15.     glBegin(GL_TRIANGLES);
  16.     glVertex3fv(@Vertieces[V1][0]);
  17.     glVertex3fv(@Vertieces[V2][0]);
  18.     glVertex3fv(@Vertieces[V3][0]);
  19.     glEnd()
  20.     end;
  21.  
  22. begin
  23. for X := 0 to Aufloesung-1 do
  24.     for Z := 0 to Aufloesung-1 do
  25.         begin
  26.         for I := 0 to 3 do                                                      //Alle Vertieces erzeugen
  27.             begin
  28.             Vertieces[I][0] := (X + VertPos[I][0])/Aufloesung*Mapgroesse;
  29.             Vertieces[I][2] := (Z + VertPos[I][1])/Aufloesung*Mapgroesse;
  30.             Vertieces[I][1] := MapDaten[X + VertPos[I][0],Z + VertPos[I][1]];
  31.             end;
  32.         ZeichneDreiecke(0,1,3);
  33.         ZeichneDreiecke(1,2,3);
  34.         end;
  35. end;


Und die Prozedur für LadeHeightmap:
Code:
  1. procedure LadeHeightmap(Aufloesung : SmallInt);
  2. var Bmp  : TBitMap;
  3.     X, Z : LongInt;
  4. begin
  5. SetLength(MapDaten, Aufloesung, Aufloesung);                                    //type TMapDaten = Array of Array of SmallInt;
  6. Bmp := TBitMap.Create;
  7. try
  8.   Bmp := u_PerlinNoise.Heightmap;
  9.   for X := Low(MapDaten) to High(MapDaten) do                                   //Bitmap in MapDaten laden...
  10.       for Z := Low(MapDaten) to High(MapDaten) do
  11.           MapDaten[X,Z] := Trunc(Bmp.Canvas.Pixels
  12.                                  [Trunc(X/Aufloesung*Bmp.Width),
  13.                                  Trunc(Z/Aufloesung*Bmp.Height)]
  14.                                  / clWhite * 255);
  15.  except
  16.    MessageDlg('Fehler beim Laden der Heightmap', mtError, [mbOk], 0);
  17.  end;
  18. Bmp.Free;
  19. end;


Kann mir vllt. jemand noch einen Tipp geben woran es liegen könnte?

mfg
Hering



//Edit
Okay, manchmal sieht man den Wald vor lauter Bäumen nicht.
Der Fehler lag in der Zeile
Code:
  1. SetLength(MapDaten, Aufloesung, Aufloesung);

in der Prozedur LadeHeightmap. Da ich ja beim Laden von 0 bis Aufloesung gehe, muss ich bei SetLength() als Größe Aufloesung+1 angeben...
Hoffe mal das waren erstmal alle Fehler.

mfg
Hering


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.009s | 16 Queries | GZIP : On ]