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

Aktuelle Zeit: Sa Jul 19, 2025 16:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: FrameBuffer in Textur kopieren
BeitragVerfasst: Di Nov 27, 2007 19:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Meine Frage siehe Topic.
Bei glCopyTexImage2D habe ich ja das Problem, dass die Textur Viewport-größe haben muss, wenn ich das gesamte Framebufferbild in die Textur möchte, weil der 1:1 die Pixel kopiert.
Ich habe als Ausgangslage den Frambuffer in einer Größe die nicht 2^n ist, und möchte das ganze Bild nun entsprechend runtergerechnet in eine 256er-Textur haben. Wie geht das? UNd wirklich kopiert, ohne die ganez Szene ein zweites mal in die Textur rendern zu müssen

MfG Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Zuletzt geändert von Pellaeon am So Dez 02, 2007 12:36, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 27, 2007 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Sowas wie StretchDraw (zum Skalieren beim Kopieren) gibts unter OpenGL afaik nicht. Dir bleibt nichts anderes übrig, als die Textur des Framebuffers nochmal auf ein kleineres Quad zu zeichnen... Aber wofür brauchst du das überhaupt? Du könntest doch direkt die Textur des Framebuffers benutzen und die dann auf ein Quad rendern... (du meinst doch Framebuffer á lá gl_framebuffer_object_ext, oder?)

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 27, 2007 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Ich brauchs für die Refraction Map bei nem Wassershader. In diesem Fall kann ich die Szene ohn Wasser ausm Frambuffer direkt auch als Textur nutzen, da die Bilder identisch sind. Ich brauchs aber halt als Textur für den Lookup im Shader. In nem anderen Projekt mit DX hatte ich da 20-30 fps mehr durch das Kopieren, weil ich mir dann den Refraction-Renderpass spare (abgeguggt aus GPU Gems 2^^ gibts nen Artikel von nem CryTek-Mitarbeiter über das Wasser in FarCry, dort machen die es genau so).

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 28, 2007 17:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Code:
  1. void CGraphic::drawScene()
  2. {
  3.     glCallList(m_axisID);
  4.     m_area.draw();
  5.    
  6.     int vp[4];
  7.     glGetIntegerv(GL_VIEWPORT,vp);
  8.  
  9.     glBindTexture(GL_TEXTURE_2D,m_texID);
  10.     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0,vp[2],vp[3], 0);
  11.  
  12.     //
  13.     glEnable(GL_TEXTURE_2D);
  14.     glBegin(GL_QUADS);
  15.       glTexCoord2i(0,0);
  16.       glVertex3f(30,0,0);
  17.       glTexCoord2i(1,0);
  18.       glVertex3f(50,0,0);
  19.       glTexCoord2i(1,1);
  20.       glVertex3f(50,20,0);
  21.       glTexCoord2i(0,1);
  22.       glVertex3f(20,20,0);
  23.         glEnd();     
  24.  
  25.     glDisable(GL_TEXTURE_2D);  
  26. }


Ich teste gerade ein bisschen herum. Mit dieser Variante erstelle ich mir ja eine Textur, welche so groß ist wie der Viewport. Auf meiner nVidia Karte läuft das. Bei nem Kumpel seiner ATI bringt das Fehldarstellungen bei der Textur ?!? (aktuelle Treiber sind installiert, X1800XT)
Hat jemand noch solche Probleme?

MfG Pellaeon

P.S. Falls jemanden was zur urpsrünglichen Frage einfällt, also wie ich den Framebuffer in eine kleinere Texture bekomme, immer her damit :)

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 28, 2007 19:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Redest du jetzt von Framebuffer Objects oder von einem "nativen" Framebuffer?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 28, 2007 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was verstehst du denn unter Fehldarstellung. Wenn Möglich bei so etwas immer mit Bild. Häufig kann man da schon sehen was schief geht.

Aber ich stelle mal eine Vermutung in den Raum. Solche Operationen arbeiten teilweise mit DMA. Und da könnte ich mir vorstellen, dass er noch Speicher kopiert wärend du schon das Quad zeichnest. Speziell, wenn die Befehle in echt auch direkt so sind wie in dem Code. Von daher versuch mal etwas zu machen die Karte den Treiber zwingt es seriell auszuführen. Also ein glBind mit 0 und dann wieder Textur binden. Ist aber nur eine sehr wage Vermutung. Aber die haben bekannt nichts zu verliehren. ;)

[edit] Ach ja. Könnte aber auch sein, dass er sich stumpf an den NPOT stört. ATI ist da nicht so der bringer. Kann ich aber selber gleich (nach meinem essen) mal testen.

PS: Lord Horazont: glCopyTexImage2D ist nen Stink normaler Render To Texture. Also FrameBuffer ohne Object.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 02, 2007 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Lossy eX hat geschrieben:
Was verstehst du denn unter Fehldarstellung. Wenn Möglich bei so etwas immer mit Bild. Häufig kann man da schon sehen was schief geht.


OK im Anhang sind zwei Bilder: das richtige und das falsche.
xy-Ebene ist der Boden. z geht nach oben, Die Freiformfläche ist 20x20 groß in der xy-Ebene. (x-Richtung ist die rote Linie)
Daneben liegt die Textur flach auf dem Boden bei [30;50] x [0;20].

Ich render einfach die Fläche, schiebe das Ergebnis in die Textur und zeichne dann das Quad mit der Textur (Code siehe oben)
Hier ist noch der Code zum Fläche rendern:

Code:
  1. void CArea::draw() const
  2. {
  3.     glColor3f(1,1,1);
  4.     glVertexPointer(3,GL_FLOAT,0,&m_vertices[0]);
  5.     glEnableClientState(GL_VERTEX_ARRAY);
  6.     glNormalPointer(GL_FLOAT,0,&m_normals[0]);
  7.     glEnableClientState(GL_NORMAL_ARRAY);
  8.  
  9.     glDrawElements(GL_TRIANGLE_STRIP,(int)m_indices.size(),GL_UNSIGNED_SHORT ,&m_indices[0]);  
  10.  
  11.     glDisableClientState(GL_VERTEX_ARRAY);
  12.     glDisableClientState(GL_NORMAL_ARRAY);
  13. }


Lossy eX hat geschrieben:
Aber ich stelle mal eine Vermutung in den Raum. Solche Operationen arbeiten teilweise mit DMA. Und da könnte ich mir vorstellen, dass er noch Speicher kopiert wärend du schon das Quad zeichnest. Speziell, wenn die Befehle in echt auch direkt so sind wie in dem Code. Von daher versuch mal etwas zu machen die Karte den Treiber zwingt es seriell auszuführen. Also ein glBind mit 0 und dann wieder Textur binden. Ist aber nur eine sehr wage Vermutung. Aber die haben bekannt nichts zu verliehren. ;)


Das hat auch nix gebracht. Auf einer ATI-Karte ist es saulahm (0-1 fps) (in dem Screen not fail is meine 6600 go da hab ich ca. 640 fps)
Auf der anderen ATI-Karte halt die Fehldarstellung (siehe Anhang)

Lossy eX hat geschrieben:
[edit] Ach ja. Könnte aber auch sein, dass er sich stumpf an den NPOT stört. ATI ist da nicht so der bringer. Kann ich aber selber gleich (nach meinem essen) mal testen.


Daran scheint es nicht zu liegen. In nem anderen Programm hat mein Kumpel mal schnell ne NPOT-Textur benutzt. Das lief ohne Probleme.

Lossy eX hat geschrieben:
PS: Lord Horazont: glCopyTexImage2D ist nen Stink normaler Render To Texture. Also FrameBuffer ohne Object.


Ich würde es etwas genauer formulieren: glCopyTexImage2D definiert eine Textur, und nimmt zum Initialisieren halt nicht den "normalen" Hauptspeicher, sondern den Speicher des Framebuffers. Daher findet (leider) auch kein blitten statt (Ausgangsproblem^^)


MfG Pellaeon


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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 | 15 Queries | GZIP : On ]