Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Ich habe eine kleine Klasse für den PBuffer geschrieben leider gab es bei der Funktion wglChoosePixelFormatARB einen Fehler. Wie sich rausstelle wurde in der Opengl12 der Variable wglChoosePixelFormatARB nur auf Anforderung die Funktion zugewiesen. Also rief ich die entsprechende procedure auf welche diesen Schritt durchführt, aber ohne erfolg da wglChoosePixelFormatARB immer noch nil war. Also rief ich im Debug Modus die Funktion wglgetProcAddress('wglChoosePixelFormatARB') von "hand" auf. Allerdings mit dem gleichen Resultat nil.
Unterstütz meine Grafikarte etwa keine pBuffer oder mache ich etwas falsch?
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
PBuffer werden eigentlich (inzwischen) auf so ziemlich jeder Grafikkarte unterstützt, und bei NV AFAIK sogar ab der TNT, es sollte also bei dir funzen. Warum du keinen gültigen Funktionszeiger bekommst, ist mir etwas rätselhaft. Ich gehe doch mal davon aus das die OpenGL-Libs geladen sind und du nen aktiven Renderkontext hast, oder?
Ansonsten nutz doch unseren OpenGL1.5-Header, der wglChoosePixelFormatARB problemlos lädt.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Da fehlt doch das Rendern der Szene in den PBuffer, also quasi das wichtigste. Haste da evtl. was bei der Funktionsweise des PBuffers nicht ganz verstanden? Der PBuffer ist quasi ein komplett eigener Renderkontext. Das sieht dann in der Praxis in etwa so aus :
Kontext des PBuffers aktiveren (wglMakeCurrent(PBuffer.DC, PBuffer.RC)
Deine Szene in den PBuffer rendern
Diese Szene in die Textur deines PBuffers kopieren (glCopyTexImage)
Wieder in den normalen Kontext wechseln (wglMakeCurrent(DC, RC))
Dort dann die Textur des PBuffers binden und an Primitive rendern
Ansonsten ist mir noch das aufgefallen : WGL_DOUBLE_BUFFER_ARB, 1. D.h. das du einen PBuffer mit Front- und Backbuffer erstellst, was man normalerweise nicht macht, verbraucht eben mehr Speicher.
Ich glaube das fehlt:
WGL_PIXEL_TYPE_ARB=WGL_TYPE_RGBA_ARB
WGL_ACCELERATION_ARB=WGL_FULL_ACCELERATION_ARB
Vielleicht funktioniert es wenn man statt den einzelnen Farben direkt die Summe angibt:
WGL_COLOR_BITS_ARB=32
Der PBuffer muß für RTT noch folgende Attribute haben
WGL_TEXTURE_FORMAT_ARB=WGL_TEXTURE_RGBA_ARB
WGL_TEXTURE_TARGET_ARB=WGL_TEXTURE_2D_ARB
Das Kopieren mit glCopyTex[Sub]Image entfällt wenn man den PBuffer an eine Texture bindet. Mir ist aufgefallen, daß ein glCopyTexSubImage bei einem PBuffer der mit RTT Attributen erstellt wurde gar nicht mehr funktioniert. Bei NVidia Karten soll es in diesem Fall unerträglich langsam sein. Dürfte eigentlich nicht so sein. Hat jemand anders auch diese Erfahrung gemacht? PBuffer scheinen allgemein sehr anfällig für diese Attributkombinationen zu sein und es scheinen nur bestimmte wirklich zu funktionieren.
Nachtrag: Der Pbuffer ist die scheußlichste Stelle an der ganzen OpenGL API und wird hoffentlich bald(?) überholt. So anfällig und kompliziert entspricht er nicht der restlichen Eleganz der OpenGL Schnittstelle. Man hätte RTT folgendermaßen implementieren sollen:
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Diese Zeile Code
Code:
glEnable(GL_TEXTURE_2D);
war vor
Code:
wglMakeCurrent(pbuffer.dc, PBuffer.rc);
"gerutscht". Ich muss allerdings eine von diesen beiden Zeilen aufrufen, ansonsten gibt es ein ähnliches Bild wie oben nur das statt Gras nur Grau zu sehen war.
Weis einer von euch was der Unterschied zwischen den beiden Funktionen ist? Das steht doch im Gegensatz zu dem was du gesagt LarsMiddendorf oder binde ich etwa in meinen Code oben den PBuffer nicht an eine Textur?
Zitat:
Das Kopieren mit glCopyTex[Sub]Image entfällt wenn man den PBuffer an eine Texture bindet.
@SOS: Die Unit die ich oben gepostet hatte behandelt nur den PBuffer und nicht das Zeichnen(, der Code dazu steht in der BodenUnit).
Danke für eure Hilfe.
Euer
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
glCopyTexImage2D Reserviert Speicher für deine Textur und dimensioniert diese auch, bevor sie dann aus dem Puffer geholt wird.
glCopyTexSubImage2D Kopiert nur den Pufferinhalt in den bereits vorhandenen Speicher, unter Angabe sowohl der Dimension als auch der Startposition. Damit kann man z.B. nur Teile des Puffers in eine Textur kopieren.
Also sollte man am Anfang einmal glCopyTexImage2D aufrufen, damit OpenGL Speicher für die Textur reserviert hat, und danach dann nur noch (solange sich die Größe nicht ändert) glCopyTexSubImage2D, da dort nichts allokiert wird und es daher im Normalfall schneller ist.
Und beim Zeichnen brauche ich dann nur noch glCopyTexSubImage2D aufrufen.
Und wieder Rechenleistung gesparrt, Danke SonofSatan für die Erklärung.
MfG
IFlo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Wenn der Pbuffer mit RTT Attributen erstellt wurde, muß man die Texture gar nicht mehr kopieren und auch keinen Speicher außer den PBuffer dafür belegen. Das ist ja gerade der Sinn von ARB_render_texture. Man muß allerdings trotzdem ein Texture Objekt mit glGenTextures erstellen. Dann wird der Pbuffer als Texture verwendet.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.