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

Aktuelle Zeit: Fr Jul 18, 2025 15:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Sieht mich das Objekt?
BeitragVerfasst: Sa Jul 29, 2006 19:43 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Hallo,

Ich habe folgende Situation:

Ich sehe an einem Objekt vorbei, es ist also nicht auf dem Bildschirm zu sehen, weil es sich ein stückchen weiter rechts befindet. Wie kann ich feststellen, ob das Objekt mich "sieht", oder ob die Sicht des Objektes durch eine Wand versperrt wird?

-steve


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 30, 2006 07:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Steve,

das ist eigentlich garnicht so schwer.
Du mußt die OpenGL-Szene (am besten nur die Geometrie; in niedrigster Detailstufe und geringer Auflösung ;) ) aus der "Sicht" deines Objektes rendern und mit Hilfe von Occlusion Queries überprüfen ob "du" sichtbar bist.

Falls das "Objekt" keinen speziellen Blickwinkel hat, mußt du dessen Perspektive noch so ausrichten, dass seine Blickrichtung genau auf dich zeigt.



Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 31, 2006 10:43 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Ah, super, danke :D

Das Objekt hat einen speziellen Blickwinkel - das ist kein Problem. Das mit den Occlusion Queries muss ich mir nur noch mal anschauen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 04, 2006 11:21 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Ich habe noch eine kleine Frage zu den Occlusion Queries.

Und zwar ist ein Quad, dass ich auf Sichtbarkeit prüfen will zwar sichtbar, allerdings gibt mir der pixelcounter 0 zurück. Hier ein bisschen code(Die 'Renderpass-Textur' ist nur für mich zur kontrolle gedacht):

Code:
  1.  
  2. procedure Tworld.renderpass;
  3. var
  4.   angle:double;
  5.   vec:TGLVectorD3;
  6.   query,count:gluint;
  7. begin
  8.  
  9.   //Erster Renderpass
  10.   glClearColor(0.0,0.0,0.0,0);
  11.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  12.   glViewport(0, 0, 256, 256);
  13.  
  14.     //Ratten Ansicht
  15.     angle:=rat[0].GetAngleYR;
  16.     glrotatef(-90+angle,1,0,0);
  17.     angle:=rat[0].GetAngleZR;
  18.     glrotatef(180-angle,0,1,0);
  19.     gltranslatef(-rat[0].GetSVec[0],-rat[0].GetSVec[1],-rat[0].GetSVec[2]);
  20.     glBindTexture(GL_TEXTURE_2D, RatsView);
  21.  
  22.       //Startvektor des Quads(player) berechnen
  23.       Vec:=VecSub(player.GetSVec,rat[0].GetSVec);
  24.       Vec:=VecAdd(vec,rat[0].GetSVec);
  25.  
  26.       //PlayerQuad zeichnen
  27.       glcolor3f(1,1,1);
  28.       glbegin(gl_quads);
  29.         glvertex3f(Vec[0],1,Vec[2]);
  30.         glvertex3f(Vec[0]+1,1,Vec[2]);
  31.         glvertex3f(Vec[0]+1,1,Vec[2]+1);
  32.         glvertex3f(Vec[0],1,Vec[2]+1);
  33.       glend;
  34.  
  35.   drawmap;
  36.   drawrats;
  37.  
  38.   //Prüfen ob Quad sichtbar ist
  39.   glGenOcclusionQueriesNV(1,@query);    
  40.   glBeginOcclusionQueryNV(query);            
  41.   glColorMask(FALSE,FALSE,FALSE,FALSE);
  42.   glDepthMask(false);
  43.                              
  44.        glbegin(gl_quads);
  45.         glvertex3f(Vec[0],1,Vec[2]);
  46.         glvertex3f(Vec[0]+1,1,Vec[2]);
  47.         glvertex3f(Vec[0]+1,1,Vec[2]+1);
  48.         glvertex3f(Vec[0],1,Vec[2]+1);
  49.       glend;
  50.  
  51.   glDepthMask(true);                              
  52.   glColorMask(TRUE,TRUE,TRUE,TRUE);                
  53.   glEndOcclusionQueryNV;
  54.  
  55.  
  56.  
  57.  
  58.   //Textur erstellen
  59.   glBindTexture(GL_TEXTURE_2D, RatsView);
  60.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 256, 256, 0);
  61.  
  62.   //Zweiter Renderpass
  63.   glClearColor(0,0.0,0.3,0);
  64.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  65.   glViewport(0, 0, form.Width, form.Height);
  66.  
  67.     glloadidentity;
  68.  
  69.   //Ersten Renderpass aufs Quad kegen
  70.   glcolor3f(1,1,1);
  71.   glBindTexture(GL_TEXTURE_2D,RatsView);
  72.    glbegin(gl_quads);
  73.      gltexcoord2f(0,0);glvertex3f(-1,-1,-3);
  74.      gltexcoord2f(1,0);glvertex3f(1,-1,-3);
  75.      gltexcoord2f(1,1);glvertex3f(1,1,-3);
  76.      gltexcoord2f(0,1);glvertex3f(-1,1,-3);
  77.    glend;
  78.  
  79.  
  80.    gldisable(GL_TEXTURE_2D);
  81.  
  82.     //PLayeransicht
  83.     angle:=player.GetAngleYR;
  84.     glrotatef(-90+angle,1,0,0);
  85.     angle:=player.GetAngleZR;
  86.     glrotatef(180+angle,0,1,0);
  87.     gltranslatef(-player.GetSVec[0],-player.GetSVec[1],-player.GetSVec[2]);
  88.  
  89.  
  90.   //Map zeichnen
  91.   drawmap;
  92.   drawrats;
  93.  
  94.   glGetOcclusionQueryuivNV(query, GL_PIXEL_COUNT_NV,@count);
  95.   if count>0 then
  96.   begin
  97.     player.SetHealth(player.GetHealth -1);
  98.   end;
  99.  
  100.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 04, 2006 13:48 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Du musst natürlich auch GL_PIXEL_COUNT_AVAILABLE_NV abfragen ob das Ergebnis überhaupt schon vorliegt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 04, 2006 14:22 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Ich habs mal geprüft. Das Ergebnis ist verfügbar, aber es werden 0 Pixel gezählt, als ob das Quad nicht sichtbar ist


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 04, 2006 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
hallo,

bei deiner occlusion query verhinderst du zwar das Schreiben in den Tiefenpuffer, hast aber noch depth testing aktiviert ;)

Ab OpenGL 1.5 brauchst du übrigens nicht mehr auf die Extension von Nvidia zurückgreifen, dort gehören occlusion queries zum Standard.


Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 05, 2006 02:06 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Es gibt aber kurioserweise einige ATI-Karten, die zwar GL_NV_occlusion_query unterstützen, dafür aber weder die ARB- noch die Core-Extension. ATI hat sich disbezüglich auch geäußert und angekündigt, daran nichts ändern zu wollen.
ATI scheint echt ein Problem mit seiner Einstellung zu Treibersupport zu haben, denn diese Extensions sind ja eigentlich gleichwertig und würden für die Treiberprogrammierer nur einen minimalen Aufwand bedeuten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 05, 2006 11:11 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Mhh, jetzt wird gezählt..., aber die ganze Zeit (auch wenn das quad durch eine wand verdeckt wird). Nur wenn ich weit genug weg bin hört er auf zu zählen.

Code:
  1.  
  2.   //Prüfen ob Quad sichtbar ist
  3.   glGenQueriesARB(1,@query);      
  4.   glBeginQueryARB(GL_SAMPLES_PASSED_ARB,query);      
  5.   glColorMask(FALSE,FALSE,FALSE,FALSE);                      
  6.   glDepthMask(false);
  7.   gldisable(GL_depth_test);
  8.                                
  9.       glbegin(gl_quads);
  10.         glvertex3f(Vec[0],1,Vec[2]);
  11.         glvertex3f(Vec[0]+1,1,Vec[2]);
  12.         glvertex3f(Vec[0]+1,1,Vec[2]+1);
  13.         glvertex3f(Vec[0],1,Vec[2]+1);
  14.       glend;
  15.  
  16.  
  17.   glenable(GL_depth_test);
  18.   glDepthMask(true);                              
  19.   glColorMask(TRUE,TRUE,TRUE,TRUE);                
  20.   glEndQueryARB(GL_SAMPLES_PASSED_ARB);
  21.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 05, 2006 11:36 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Der DepthTest muß beim Zählen an sein. Sonst werden ja alle Pixel gezählt, ob sie sichtbar sind oder nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 05, 2006 11:43 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Joa, habe ich mir auch schon gedacht, nur zählt er dann gar nicht mehr.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 05, 2006 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
stimmt, lars hat recht, du musst depth testing doch aktiviert lassen.
dann darfst du dein player-quad aber nicht zweimal zeichnen.

du kannst die occlusion query schon beim ersten zeichnen ausführen.

du solltest dein player-quad auch erst zum schluss rendern, (wenn alle anderen Objekte im Tiefenpuffer gelandet sind), sonst kannst du nicht prüfen ob dein quad verdeckt wird.


viele grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 05, 2006 17:03 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Oh man, stimmt. Da hätte ich auch selbst drauf kommen können :oops:

Naja, vielen dank für die Hilfe an alle, jetzt klappts :D


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


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.010s | 15 Queries | GZIP : On ]