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

Aktuelle Zeit: Mo Jul 07, 2025 08:15

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: LOD für Heightmaps?
BeitragVerfasst: Do Dez 28, 2006 13:40 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Hallo,

Ich hab mir vor kurzem das Tutorial "Continuous Level of Detail für Heightmaps (Tutorial_Terrain3)" im Wiki von Nico angesehen und, wie es nicht anders zu erwarten war, steh ich jetzt auf der Leitung, nicht zuletzt Dank der verwirrenden Rekursionen. Kann mir vielleicht mal einer von euch zeigen, wie man den LOD beim Rendern der Heightmap verwendet? Unten wäre meine Renderprozedur für die Heightmap.


Code:
  1.  
  2. procedure THeightmap.Render;
  3. var
  4.    i,k:Integer;
  5.    p1y,p2y,p3y,p4y:Real;
  6.    d1,d2: Boolean;
  7.    w,av: Single;
  8.    SingleTex:Boolean;
  9.    minI,minK,maxI,maxK:Integer;
  10. begin
  11. minI:=trunc((Player.Z-Player.ViewDist)/Heightmap.Fac);
  12. minK:=trunc((Player.X-Player.ViewDist)/Heightmap.Fac);
  13. maxI:=trunc((Player.Z+Player.ViewDist)/Heightmap.Fac);
  14. maxK:=trunc((Player.X+Player.ViewDist)/Heightmap.Fac);
  15. if minI<0 then minI:=0;
  16. if minK<0 then minK:=0;
  17.  if maxI>Height-2 then maxI:=Height-2;
  18. if maxK>Width-2 then maxK:=Width-2;
  19.  
  20. glTex(HeighmapTexture);
  21.  glEnable(GL_CULL_FACE);
  22.   glBegin(GL_TRIANGLES);
  23.    for i:=minI to maxI do
  24.     for k:=minK to maxK do
  25.     begin
  26.      d1:=false;
  27.      d2:=false;
  28.      p1y:=Pos[k,i];
  29.      p2y:=Pos[k+1,i];
  30.      p3y:=Pos[k,i+1];
  31.      p4y:=Pos[k+1,i+1];
  32.      av:=(p1y+p4y)/2;
  33.      if FrustumCulling then
  34.       begin
  35.        if(abs(av-p1y)>abs(av-p4y))and(abs(av-p1y)>abs(av-p2y))then w:=abs(av-p1y)
  36.        else if(abs(av-p4y)>abs(av-p2y))then w:=abs(av-p4y) else w:=abs(av-p2y);
  37.        if Frustum.IsSphereWithin((k+0.5)*Fac,(p1y+p4y)/2,(i+0.5)*Fac,w+5)then d1:=true;
  38.        if(abs(av-p1y)>abs(av-p4y))and(abs(av-p1y)>abs(av-p3y))then w:=abs(av-p1y)
  39.        else if(abs(av-p4y)>abs(av-p3y))then w:=abs(av-p4y) else w:=abs(av-p3y);
  40.        if Frustum.IsSphereWithin((k+0.5)*Fac,(p1y+p4y)/2,(i+0.5)*Fac,w+5)then d2:=true;
  41.       end
  42.      else
  43.       begin
  44.        d1:=true;
  45.        d2:=true;
  46.       end;
  47.      if d1 then
  48.       begin
  49.          glMultiTexCoord2f(GL_TEXTURE0,(k+1)/Height,(i+1)/Width);
  50.          glMultiTexCoord2f(GL_TEXTURE2,1,0);
  51.          glVertex3f(k*Fac,p1y-1,i*Fac);
  52.          glMultiTexCoord2f(GL_TEXTURE0,(k+2)/Height,(i+2)/Width);
  53.          glMultiTexCoord2f(GL_TEXTURE2,0,1);
  54.          glVertex3f((k+1)*Fac,p4y-1,(i+1)*Fac);
  55.          glMultiTexCoord2f(GL_TEXTURE0,(k+2)/Height,(i+1)/Width);
  56.          glMultiTexCoord2f(GL_TEXTURE2,1,1);
  57.          glVertex3f((k+1)*Fac,p2y-1,i*Fac);
  58.       end;
  59.      if d2 then
  60.       begin
  61.          glMultiTexCoord2f(GL_TEXTURE0,(k+1)/Height,(i+1)/Width);
  62.          glMultiTexCoord2f(GL_TEXTURE2,1,0);
  63.          glVertex3f(k*Fac,p1y-1,i*Fac);
  64.          glMultiTexCoord2f(GL_TEXTURE0,(k+1)/Height,(i+2)/Width);
  65.          glMultiTexCoord2f(GL_TEXTURE2,0,0);
  66.          glVertex3f(k*Fac,p3y-1,(i+1)*Fac);
  67.          glMultiTexCoord2f(GL_TEXTURE0,(k+2)/Height,(i+2)/Width);
  68.          glMultiTexCoord2f(GL_TEXTURE2,0,1);
  69.          glVertex3f((k+1)*Fac,p4y-1,(i+1)*Fac);
  70.       end;
  71.     end;
  72.   glEnd;
  73. glDisable(GL_CULL_FACE);
  74. end;
  75.  


-Pos enthält die Höhendaten der Heightmap
-HeighmapTexture ist die Textur, die über die ganze HM gelegt ist
-eine Detail-Textur wird mittels MultiTexturing über je zwei Triangles gelegt
-d1/d2 sind Booleans zum abfragen, ob die Triangles bei Pos[k,i] gezeichnet werden sollen,
zur Überprüfung wird FrustumCulling verwendet.


Ich wäre für jede Hilfe und jeden Beitrag dankbar.
Wenn irgendwas unklar ist bitte einfach nachfragen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: LOD für Heightmaps?
BeitragVerfasst: Do Dez 28, 2006 14:21 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Josua hat geschrieben:
Ich hab mir vor kurzem das Tutorial "Continuous Level of Detail für Heightmaps (Tutorial_Terrain3)" im Wiki von Nico angesehen und, wie es nicht anders zu erwarten war, steh ich jetzt auf der Leitung, nicht zuletzt Dank der verwirrenden Rekursionen.

Also eigentlich machts rekursion, wenn richtig angewendet, normalerweise eher einfach statt kompliziert... Allerdings scheint dein Code iterativ zu sein und ich bin deshalb am staunen wie du das genau machen möchtest. Aber schau doch mal hier: http://www.delphigl.com/do_download.php?f=3054 . Vielleicht hilft Dir der alte Code etwas weiter. (Zu Finden unter Files/VCL-Sources)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 14:43 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Ich glaub das ist noch unklar:

Der Code den ich oben gezeigt habe ist der ursprüngliche Code ohne LOD/Quadtree.
Dabei wird einfach bei jedem Pixel der Heightmap innerhalb einer bestimmten Entfernung zur Kamera überprüft, ob er bzw die Triangles an seiner Stelle im Frustum liegen, und darauf mit einer Basistextur und einer Detailtextur gerendert.
Soweit liegen also bis auf FrustumCulling und BackfaceCulling keine performanceverbessernden Techniken wie Octree oder eben LOD vor, da ich nicht wirklich weiß, wie man die bei diesem Ansatz noch unterbringen kann.

Und danch hab ich gefragt, wie (oder ob) man in diese Prozedur noch deinen LOD-Algorhytmus unterbringen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 15:29 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Sicherlich geht das.. Das Frustrum Culling lässt man einfach auf die Ocrees-Knoten los - man wird ein bischen die maxima und minimalwerte des terrains darin vorberechnen müssen. du machst das frustum culling hier sowieso dreieckweise. das würde ich nicht tun, es sei denn du rechnest mit Computern, die noch 3D Karten aus der Hochzeit der 3DFX Ära haben. Der Algorithmus in dem Tutorial ist allderdings ähnlich alt...
Die Berechnung der Koordinaten für normale Textur und Detail-Textur kann direkt übernommen werden.


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 1 Gast


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.008s | 14 Queries | GZIP : On ]