PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [OpenGL] Off-Screen-Frame-Buffer Problem


pajofego
2007-06-16, 09:24:16
Guten Morgen miteinander,

ich versuche derzeit ein OpenGL Progrämmchen auf mein Laptop zum Laufen zu bringen. Auf dem Desktoprechner mit einer Geforce 6800 GT klappt's wunderbar. Nur auf meinem Laptop mit Intels interner Grafikkarte Media 650 steigt es an folgender Zeile mit einer unbehandelten Ausnahme aus:

glGenFramebuffersEXT(1, &fb);

Hättet ihr einen Vorschlag für mich, wie ich herausfinde woran es liegt? (Hardwareproblem? Unterstützt nicht?) Geht's auch anders?

Danke,

viele Grüße
pajofego

Xmas
2007-06-16, 15:44:05
Zuerst einmal solltest du überprüfen ob GL_EXT_framebuffer_object überhaupt unterstützt wird. Ansonsten wird glGenFramebuffersEXT wohl ein NULL-Pointer sein.

pajofego
2007-06-17, 17:25:49
Hi,

danke schon mal für den Hinweis.

Jetzt komme ich doch nicht drumherum zu fragen wie genaus das geht:

Habe folgendes probiert:

Aus der OpenGL 2.1 Reference habe ich folgenden Befehl gefunden:

GLboolean extensionExists = gluCheckExtension("EXT_framebuffer_object", "GL_EXT_framebuffer_object");

Der Compiler meldet aber, dass er den Bezeichner gluCheckExtension nicht kennt!

Danach hatte ich folgendes probiert:


GLenum status;
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE_EXT:
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
/* choose different formats */
break;
default:
/* programming error; will fail on all hardware */
assert(0);
}

Das klappt aber genauso wenig, da er ebenfall bei glCheckFramebuffersStatusEXT eine Ausnahmebehandlung rausschmeisst.

Jetzt meine einfache Frage: Wie überprüfe ich am Beste ob GL_EXT_framebuffer_object unterstützt wird? Danke, Gruß

pajofego

Simon
2007-06-17, 17:45:04
Hi,

Aus der OpenGL 2.1 Reference habe ich folgenden Befehl gefunden:

GLboolean extensionExists = gluCheckExtension("EXT_framebuffer_object", "GL_EXT_framebuffer_object");

Der Compiler meldet aber, dass er den Bezeichner gluCheckExtension nicht kennt!
Deine GLU-Version ist zu alt.

Nimm alternativ GLee (http://elf-stone.com/glee.php)

Mit Glee:


// Fenster bzw Context erzeugen

GLeeInit();

if(!GLEE_EXT_framebuffer_object)
{
Error("FBO Extension not supported");
}

// dann benutzen





Danach hatte ich folgendes probiert:


GLenum status;
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE_EXT:
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
/* choose different formats */
break;
default:
/* programming error; will fail on all hardware */
assert(0);
}

Das klappt aber genauso wenig, da er ebenfall bei glCheckFramebuffersStatusEXT eine Ausnahmebehandlung rausschmeisst.
Wo initialisierst du denn den Funktionszeiger?

Xmas
2007-06-17, 18:01:43
Wie initialisierst du glGenFramebuffersEXT bzw. glCheckFramebufferStatusEXT überhaupt, dass es auf deinem Desktop-Rechner funktioniert? Mit wglGetProcAddress oder einer Hilfslibrary wie Glee oder Glew? Bei letzteren gibt es einfach eine globale Variable GLEW/GLEE_EXT_framebuffer_object, die du nach der Initialisierung abfragen kannst. Diese Libs sind sowieso der einfachste Weg, Extensions zu benutzen.

pajofego
2007-06-18, 23:38:19
Ich benutze die GLEW library. Der Hinweis mit GLEW/GLEE_EXT_framebuffer_object sowie der Beispielcode haben zunächst meine Zweifel beseitigt.

Zu eurer Frage wie ich glCheckFramebufferStatusEXT bzw. glGenFramebuffersEXT initialisiere.


int err = glewInit();
if (GLEW_OK != err) {
printf((char*)glewGetErrorString(err));
exit(ERROR_GLEW)
};


Ist das hier damit gemeint?

Zum Thema Unterstützung von GL_EXT_framebuffer_object:


if(!GLEW_EXT_framebuffer_object)
{
printf("FBO Extension not supported");
}


Wird leider nicht unterstützt. D.h. wohl ich kann das ganze auf dem Laptop knicken?!

Danke,
Gruß
pajofego

Asmodeus
2007-06-19, 10:38:04
...

Wird leider nicht unterstützt. D.h. wohl ich kann das ganze auf dem Laptop knicken?!

Danke,
Gruß
pajofego

Es bestünde noch die Möglichkeit, die Funktionalität des Offscreen-Renderings mittels PBuffer zu realisieren. Dafür muss die Extension WGL_ARB_pbuffer unterstützt werden.

Gruß, Carsten.

Simon
2007-06-19, 11:30:41
Es bestünde noch die Möglichkeit, die Funktionalität des Offscreen-Renderings mittels PBuffer zu realisieren. Dafür muss die Extension WGL_ARB_pbuffer unterstützt werden.
Dann aber gleich was fertiges (http://sourceforge.net/project/showfiles.php?group_id=104004&package_id=115053&release_id=248554) nehmen. Das funktioniert auch mit einem X-Server und nicht nur Windows ;) =)

pajofego
2007-06-19, 22:17:45
ah...stimmt Mark Harris Bibliothek. Da dämmerts bei mir wieder.

Hab's mal jetzt ausprobiert. Mir fehlt wohl hardwareseitig ein paar Extensions. Mit WGL_ARB_render_texture existiert nicht auf meiner Kiste. :mad:

Muss ich jetzt zwangsläufig davon ausgehen, dass ich render to texture via OpenGL auf dem Laptop nicht darstellen kann?

Danke,
Gruß
pajofego

Simon
2007-06-19, 23:20:32
Doch, du kannst den ganz klassischen Weg über glReadPixels() gehen.

Edit: Ops, muss natürlich glCopyTexSubImage2D() sein :D