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

Aktuelle Zeit: Fr Jul 18, 2025 21:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 15, 2007 23:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
Hallo miteinander,

ich arbeite grad an einem c++ projekt, was in OpenGL gerenderte Bilder auf VideoOut ausgibt.
Mein Set-up ist wie folgt:
die graphic karte rendert offscreen die szene, die daten werden in den system RAM kopiert und von da dann zur video karte. Diese gibt ein video signal aus. Es sind also zwei karten, grafik und video in benutzung.
der Dtenfluss:
render scene (offscreen) -> Load into System RAM -> copy to the video card -> output SDI signal

Zusätzlich möchte ich die gerenderte Szene auf dem Bildschirm sehen, quasi als preview. Da meine video ausgabe aber unabhängig von fensterverdeckugn etc. sein soll, geschieht sie offscreen.

Weil mein renderer FBO für Shadowmaps nutzt, möchte ich es benutzen um die ganze szene offscreen zu rendern. Ich habe auch einige tutorials gefunden, wo mit hilfe von fbo offscreen gerendert wird. Allerdings wird dabei in eine Textur gerendert und diese dann auf ein quad gemappt und erneut gerendert. Jetzt bin ich irgendwie ratlos und hab folge fragen:


1. Ist es möglich in den FBO offscreen zu rendern und die Daten dann in den System ram zu kopieren ?

2. Ist es möglich direkt die daten auf der graphic karte zu kopieren in den backbuffer des normalen framebuffers? Da ich die Daten ja im System ram brauche, wie "teuer" ist es diese wieder zurück in die grafikkarte zu laden, verglichen mit der erwähnten textur methode?

3.Wenn dies nicht möglich/zu teuer ist, muss man in eine textur rendern und diese erneut auf einem quad rendern oder wie wird es sinnvollerweise gemacht?

Vielen Dank für alle antworten :)

Chris


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 15, 2007 23:49 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
1) Sobald das FBO gebunden ist, kann man mit glReadPixels wie vom normalen Framebuffer auch in den Speicher zurückkopieren. Das hat allerdings ein Problem: Der Aufruf von glReadPixels kopiert bis der gesamte Speicher kopiert ist, auch wenn die Grafikkarte dass durch ihre DMA-Fähigkeiten im Grunde allein macht und die CPU nur wartet. Deshalb empfiehlt sich der Einsatz von Pixel Buffer Objects um mehrere Teilstücke gleichzeitig und asynchron zur CPU zu kopieren. Für die optimale Readback-Perfomance würde ich dir folgendes Dokument ans Herz legen:
http://developer.nvidia.com/object/fast_texture_transfers.html

2) Auf neueren Grafikkarten gibt es dafür die Extension GL_EXT_framebuffer_blit. Dabei wird nicht einfach ein FBO gebunden, sondern je eins als Read und als Drawbuffer. Der Drawbuffer sollte dabei auf 0 sthen um das Ganze auf den Bildschirm zu kopieren.
Die Daten sollten dabei übrigens in jedem Fall auf der Grafikkarte bleiben. Wann man den Blit im Bezug zu den PBO-Readbacks am Besten ausführt musst du jedoch ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 12:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
Hallo yonibear,

vielen Dank für deine Antwort.

ich habe das Dokument gelesen und auch beim SDK meiner Videokarte eine entsprechende Funktion gefunden. Leider verstehe ich einen schritt dabei nicht
Code:
  1.  
  2. void   * CPBuffer::ReadPixelsAsync ( int width, int height )
  3.  {
  4.    int    nextPBO = filledPBO ^ 1;
  5.    void * res;
  6.  
  7.    if ( ! canAsyncRead ) return ( NULL );
  8.  
  9.    // Initiate the asynchronous transfer into the next PBO.
  10.    glReadBuffer    ( GL_BACK );
  11.    glBindBufferARB ( GL_PIXEL_PACK_BUFFER_EXT, PBOs [nextPBO] );  
  12.    glReadPixels    ( 0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
  13.  
  14.    // Retrieve data from the current PBO.
  15.    glBindBufferARB ( GL_PIXEL_PACK_BUFFER_EXT, PBOs [filledPBO] );
  16.    res             = glMapBufferARB ( GL_PIXEL_PACK_BUFFER_EXT, GL_READ_ONLY_ARB );
  17.                                
  18.    filledPBO       = nextPBO;
  19.    mappedPBO       = 1;
  20.  
  21.    return ( res );
  22.  }
  23.  
  24.  
  25.  


Wofür wird der erste Buffer gebindet und dann glReadPixels mit einem NULL pointer ausgeführt?
Die eigentlichen Daten werden ja über den MapBuffer zurückgegeben??

zu 2)

Leider habe ich bis auf http://msi.unilim.fr/~porquet/glexts/GL ... t.txt.html nichts passendes zu der Blit extension gefunden. Hast du vielleicht ein beispielprogramm oder link? ich kann mir das nicht so richtig vorstellen.

Du sprichst an, beide möglichkeiten ,also blit für transfer in den onscreen buffer und pbo fürs asynchrone lesen, zu kombinieren. Wie bekomme ich die Daten in den PBO, wenn ich sie in den FBO gerendert habe. ISt dazu ein weiterer kopiervorgang nötig ?

Grüße

Chris


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
glReadPixels ließt normal den Framebuffer in einen von dir übergeben Speicherbereich. Die Daten sollen aber in den Speicher des Pixel Buffer Objects gelesen werden. Also brauchst du auch keinen Pointer angeben. Das PBO und der Framebuffer etc haben getrennte Speicherbereiche deswegen auch überhaupt erst der Aufruf von glReadPixels

Schau mal im Kapitel "New State" nach. Dort befindet sich etwas Beispielcode.
http://msi.unilim.fr/~porquet/glexts/GL_EXT_framebuffer_blit.txt.html#label19

[edit] Ob der Code dir etwas nützt kann ich nicht sagen. Habe bisher selber damit noch nichts gemacht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 13:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
Hallo Lossy eX,

mist soweit war ich in dem Dokument nicht gekommen und hab vorher aufgegeben. Hätte wohl weiter lesen sollen, aber danke für den hinweis. Ich werde es mal durcharbeiten und dann reporten :)

Zum Code:

Jetzt bin ich total verwirrt:


Vor dem Aufruf der methode wird im programm der Renderkontext des pbuffers aktuell gemacht. Danach werden die Buffer geswapped und die Methode aufgerufen.

Nun zur methode :

-Der Backbuffer wird als lesebuffer genommen. (Dies bezieht sich auf den DC/RC des pbuffers ?!)
-Der Nächste Buffer wird gebindet (es gibt 2 pbuffer)
-Die pixel werden aus dem Backbuffer in den pbuffer geschrieben ?

danach wird der nächste Buffer gebindet und ein pointer zu dessen Daten erzeugt.

für ein paar klärende worte bin ich sehr dankbar :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 13:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
ich sehe grad, dass die Grafikkarte Quadro FX 3500 die blit extension garnicht unterstützt. Liegt es an fehlender Hardware oder Treiber unterstützung ?

Welche alternativen bleiben dann ? In eine Textur rendern und dann auf ein Quad mappen ??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 14:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Beispielcode: Macht ja nichts. Ich habe/hatte öfter mal mit den Spezifikationen zu tun und somit weiß ich, dass dort unten drunter ab und an mal ein bisschen Code angehangen wurde. Bei komplizierteren Sachen ist das sogar fast immer so. Und du weißt das ja jetzt auch. ;)

Extensions: Auf delphi3d.net gibt es ein Registry wo du dir unter anderem auch Grafikkarten anhand einer Extension anzeigen lassen kannst. Für die blit gibt es dort nur 2 Einträge. Beides die GeForce 8800. Allerdings hat es nicht zu bedeuten, dass es sonst keine Hardware gibt auf denen das unterstützt wird. Und bedenken sollte man dabei auch, dass die blit auch recht neu ist.

Was die Framebuffer angeht halte ich mich mal geschlossen, da ich mich damit nicht gut auskenne und ungerne halbweisheiten verbreite.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 14:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
Danke Lossy!

ich hatte die seite im hinterkopf, aber wusste nichtmehr wie sie heißt und wodrunter ich sie suchen kann. ist es realistisch dass nvidia oder ati die extension in einem späteren treiber release noch einbauen ?
leider habe ich nur die karte zu verfügung, also werd ich es wohl anders machen müssen nur wie ? *aufyonibearwart*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 16:42 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Die Blit-Extensions wird auch auf meiner nVidia 7600 GS unterstützt.
Bist du sicher dass duw irklich die neusten Treiber hast? Die Blit-Extension ist recht neu und daher auch nur in aktuellen Treibern enthalten.
Ich kenne mich mit der Quadro-Reihe nicht aus, aber laut der Hardware Registry sollte die doch in etwa in gleiche Generation einzuordnen sein und zumindest theoretisch diese Extension unterstützen.
Wenn das klappen sollte, frag einfach nochmal nach einem Beispiel dafür.
Ansonsten ist der einzige Weg das besagte texturierte Quad.

Zu den PBOs:
Grundsätzlich werden bei allen Buffer Objects die Pointer betroffenen Funktionen etwas umgedeutet. Sobald ein PBO gebunden ist, lädt ein glReadPixels den Readbuffer in den vom Treiber verwalteten Speicher. Der angegebene Pointer wird aber nicht ignoriert, sondern als Offset interpretiert. In diesem Fall braucht man das aber nicht, daher belibt er auf 0.
Der Witz an der Sache ist nun, dass der Treiber nun nicht garantieren muss dass nach glReadPixels alle Daten in einem bestimmten Speicherbereich liegen, so dass man so lange etwas anderes machen kann.
In diesem Beispiel wird das dazu benutzt, dass mit glReadPixels der Transfer für den nächsten Frame angestoßen wird, aber der eigentliche Zugriff mit glMapBuffer sich auf das letzte Frame bezieht, der mittlerweile abgeschlossen ist.
Das glReadBuffer sichert übrigens nur dass tatsächlich der Backbuffer ausgelesen wird, was aber auch die Defaulteinstellung ist. Wenn während des Zeichnens und des Readbacks ein Framebuffer Object gebunden ist, beziehen sich alle Lese-Operationen übrigens darauf.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
Danke yonibear für deine Antwort.

Ich werde morgen, wenn ich wieder vor ort bin, nachschauen welche treiberversion isntalliert ist und dann ggf. eine aktuellere installieren. Wenn es änderung in dem Extension Unterstützung gibt, sag ich Bescheid.

zum Beispiel:

Ausgangspunkt ist, ich habe Frame n gerendert und in filledPBO kopiert wurde.Jetzt ist Frame n+1 gerendert und ich rufe die Methode auf:

Code:
  1.  
  2. -Binde nextPBO
  3. -Kopiere das Frame (in den nextPBO)
  4. -Binde filledPBO
  5. -Erhalte den Pointer auf den seinen Speicherbereich
  6. -Tausche die Buffer Indizierung
  7.  


Heißt das also, dass Frame n erst aus dem Buffer gelesen wird, wenn Frame n+1 gerendert wurde ? Da die Anwendung sehr zeitkritisch ist sollte das Delay so gering wie möglich sein.

Nochmal Danke & bis bald

Chris


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 19:53 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Falls dir mal wieder ein wichter Link über den Weg läuft, den du nicht vergessen willst: Einfach in unserer Linksammlung eintragen. Dort findest du auch schon so einges zum Thema.

Im Wiki zu finden unter "Link"

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 17, 2007 10:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 15, 2007 16:10
Beiträge: 24
Wohnort: bei Düsseldorf
Hallo zusammen!

Der Report vom Morgen : Im Rechner sitzt eine Quadro FX 3500, der aktuelle Treiber für windows xp ist installiert (91.36) und die Extension wird nicht angezeigt, wenn ich mir sie per OpenGL auflisten lasse.

War wohl nichts mit dieser Möglichkeit.

Wäre nett ,wenn jemand mir mit obigen Code nochmal hilft. :)

@Flash dank dir für den Hinweis, wenn mir was über den Weg läuft werd ich dran denken :)


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


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