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

Aktuelle Zeit: Fr Jul 18, 2025 08:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Aug 13, 2010 12:08 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hallo ihr,

ich wollte gerade meinen Code etwas optimieren, in dem ich nicht benötigte Vierecke gar nicht erst berechnen (Position berechnen und dann an die GPU übergeben). Das wolte ich per gluUnProject machen. Aber irgendwie liefert er mir unpassende Ergebnis. Sprich die alle zurückgegeben Koordinaten sind unter 1 - außer wenn ich das Fenster extrem breit mache und flach. Dann komme ich für X auf knappe 2.

Sieht jemand den Fehler?
Code:
procedure TSunFlow.CountVisibleItems;
var
  Coord     : TGLVectord3;
  viewport  : TGLVectori4;
  modelview : TGLMatrixd4;
  projection: TGLMatrixd4;
begin
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  glGetIntegerv(GL_VIEWPORT, @viewport);
  gluUnProject(0.0, 0.0, -5.0, modelview, projection, viewport, @Coord[0], @Coord[1], @Coord[2]);
  PostMessage(FEventHandle, WM_SunFlow_CurrentItem, ceil((Coord[0]-1.5)*2), 0);
end;

procedure TSunFlow.ResizeGL;
var
  maxDim: array[0..1] of Integer;
  rect  : TRect;
  width : Integer;
  height: Integer;
begin
  Windows.GetClientRect(FWindowHandle, rect);
  glGetIntegerv(GL_MAX_VIEWPORT_DIMS, @maxDim);
  width   := Max(Min(maxDim[0], rect.Right - rect.Left), 1);
  height  := Max(Min(maxDim[1], rect.Bottom - rect.Top), 1);

  glViewport(0, 0, width, height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, width/height, 1.0, 7.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  CountVisibleItems;
end;


€: Achja, ich will halt die Objektkoordinate haben, die in einer Ecke des Fensters liegt und bei z=-5


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Aug 13, 2010 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nach der Transformation liegen die Z-Koordinaten zwischen -1 und 1. Dabei ist -1 das Near-Plane und 1 das Far-Plane. Insofern versuchs mal mit (0,0,-1).

Zitat:
ich wollte gerade meinen Code etwas optimieren, in dem ich nicht benötigte Vierecke gar nicht erst berechnen

Ich weiß natürlich nicht genau was du da machst, aber du willst jedes Viereck einzeln testen? In einem solchen Fall ist es üblicherweise schneller einfach zu rendern, den die Grafikkarte macht einen solchen Test sowieso, aber natürlich viel schneller als das auf der CPU möglich ist.
Wenn du viele Objekte zeichnest und nur einige davon sichtbar sind, versuche eine Baumstruktur aufzubauen. So kannst du mit wenigen groben Tests auf der CPU viele Objekte vom rendern ausschließen. Im Wiki findet sich dazu sicherlich etwas. Stichworte: QuadTree, OctTree, BSP.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Aug 13, 2010 13:04 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Coolcat hat geschrieben:
Nach der Transformation liegen die Z-Koordinaten zwischen -1 und 1. Dabei ist -1 das Near-Plane und 1 das Far-Plane. Insofern versuchs mal mit (0,0,-1).

Ah ok. Ich dachte das übersetzt er schon automatisch. Lag auch daran :).

Coolcat hat geschrieben:
Ich weiß natürlich nicht genau was du da machst, aber du willst jedes Viereck einzeln testen? In einem solchen Fall ist es üblicherweise schneller einfach zu rendern, den die Grafikkarte macht einen solchen Test sowieso, aber natürlich viel schneller als das auf der CPU möglich ist.
Wenn du viele Objekte zeichnest und nur einige davon sichtbar sind, versuche eine Baumstruktur aufzubauen. So kannst du mit wenigen groben Tests auf der CPU viele Objekte vom rendern ausschließen. Im Wiki findet sich dazu sicherlich etwas. Stichworte: QuadTree, OctTree, BSP.

Der Algorithmus kennt nur die Anzahl der Objekte die er rendern soll. Die Position eines jeden Objektes berechnet er dann in einer Schleife. Da die Objekte unabhängig voneinander sind, brauche ich die nicht sichtbaren ja nicht berechnen.

PS: Der Algo zur Berechnung sieht so aus (wie du siehst, muss ich nur die Schleife einschränken ;) ):
Code:
procedure TSunFlow.DrawGL;
var
  i: integer;
  ox, nx, x, rot, z: TGLfloat;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  if FProgress <> 0.0 then
    FProgress := Power(0.995, FCurrentTimeStamp - FStartTimeStamp);
 
  for i := 0 to FItemCount-1 do
  begin
    ox := i* 0.5 - FOffset;
    nx := (i - FCurrentItem) * 0.5;
    x := FProgress*(ox-nx) + nx;

    z := 0.0;
    if x <= -0.5 then
    begin
      x := x - 1.5;
      rot := FDefaultAngle;
    end
    else if x >= 0.5 then
    begin
      x := x + 1.5;
      rot := -FDefaultAngle;
    end
    else
    begin
      rot := -FDefaultAngle * 2*x;

      z := 1 - abs(2*x);
      x := x*4;
    end;

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    DrawItem(x, z, FItems[i]^.width, FItems[i]^.height, rot, FItems[i]^);
    glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
    DrawItem(x, z, FItems[i]^.width, FItems[i]^.height, rot, FItems[i]^);
  end;

  SwapBuffers(FDC);
end;


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 13 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.008s | 16 Queries | GZIP : On ]