soc-2008-mxcurioni: first render layer implementation with frame buffer objects. It does not work yet: I cannot manage to read from the correct buffer yet.

This commit is contained in:
Maxime Curioni
2008-07-05 06:22:15 +00:00
parent 5bee0c9a82
commit 5200f51a87
4 changed files with 98 additions and 47 deletions

View File

@@ -152,6 +152,9 @@ AppGLWidget::AppGLWidget(const char *iName)
// _backBufferFlag = true;
_record = false;
workingBuffer = GL_BACK; //soc
}
AppGLWidget::~AppGLWidget()
@@ -402,15 +405,16 @@ void AppGLWidget::prepareCanvas()
makeCurrent();
glPushAttrib(GL_ALL_ATTRIB_BITS);
if(_frontBufferFlag){
if(_backBufferFlag)
glDrawBuffer(GL_FRONT_AND_BACK);
else
glDrawBuffer(GL_FRONT);
}
else if(_backBufferFlag)
glDrawBuffer(GL_BACK);
// if(_frontBufferFlag){
// if(_backBufferFlag)
// glDrawBuffer(GL_FRONT_AND_BACK);
// else
// glDrawBuffer(GL_FRONT);
// }
// else if(_backBufferFlag)
// glDrawBuffer(GL_BACK);
glDrawBuffer( workingBuffer ); //soc
// Projection Matrix
//==================
glMatrixMode(GL_PROJECTION);
@@ -427,7 +431,7 @@ void AppGLWidget::prepareCanvas()
void AppGLWidget::releaseCanvas()
{
makeCurrent();
glDrawBuffer(GL_BACK);
glDrawBuffer( workingBuffer ); //soc
glPopAttrib();
}

View File

@@ -91,6 +91,7 @@ public:
AppGLWidget_Camera * _camera;
int workingBuffer;
protected:
unsigned int _width, _height;
@@ -342,7 +343,7 @@ public:
{
makeCurrent();
//glReadBuffer(GL_FRONT); //in reality: glReadBuffer and glDrawBuffer are both set to GL_BACK
glReadBuffer(GL_BACK);
//glReadBuffer(GL_BACK);
GLenum glformat;
switch(format)
{
@@ -371,21 +372,21 @@ public:
BACK
} GLBuffer;
void setReadPixelsBuffer(int iBuffer)
{
makeCurrent();
switch(iBuffer)
{
case FRONT:
glReadBuffer(GL_FRONT);
break;
case BACK:
glReadBuffer(GL_BACK);
break;
default:
break;
}
}
// void setReadPixelsBuffer(int iBuffer)
// {
// makeCurrent();
// switch(iBuffer)
// {
// case FRONT:
// glReadBuffer(GL_FRONT);
// break;
// case BACK:
// glReadBuffer(GL_BACK);
// break;
// default:
// break;
// }
// }
BBox<Vec3r> scene3DBBox() const { return _ModelRootNode->bbox(); }

View File

@@ -105,7 +105,14 @@ extern "C" {
FRS_scene_3ds_export(re);
}
void FRS_render(Render* re) {
void FRS_render(Render* re, int render_in_layer) {
if(render_in_layer) {
view->workingBuffer = GL_COLOR_ATTACHMENT0_EXT;
} else {
view->workingBuffer = GL_BACK;
}
// add style module
string style_module = pathconfig->getProjectDir() +
Config::DIR_SEP + "style_modules" +
@@ -121,23 +128,67 @@ extern "C" {
// render final result
view->draw();
// copy result into render window
RenderResult rres;
RE_GetResultImage(re, &rres);
view->readPixels(0, 0, re->winx, re->winy, AppGLWidget::RGBA, rres.rectf );
re->result->renlay = render_get_active_layer(re, re->result);
re->display_draw(re->result, NULL);
controller->CloseFile();
}
void FRS_execute(Render* re, bool render_in_layer) {
void FRS_execute(Render* re, int render_in_layer) {
//if(render_in_layer)
// set-up offscreen rendering
GLuint framebuffer, renderbuffer;
GLenum status;
RenderLayer *rl;
FRS_render(re);
if(render_in_layer) {
cout << "Freestyle as a render layer - SETUP" << endl;
// set up frame buffer
glGenFramebuffersEXT(1, &framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
// set up render buffer
glGenRenderbuffersEXT(1, &renderbuffer);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbuffer);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, re->winx, re->winy);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, renderbuffer);
// status verification
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT){
cout << "Framebuffer setup error" << endl;
return;
}
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
} else {
glDrawBuffer(GL_BACK);
}
FRS_render(re, render_in_layer);
if(render_in_layer) {
for(rl = (RenderLayer *)re->result->layers.first; rl; rl= rl->next) {
if(rl->layflag & SCE_LAY_FRS) {
cout << "Freestyle as a render layer - RESULT" << endl;
// transfer render to layer
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, re->winx, re->winy, GL_RGBA, GL_FLOAT, rl->rectf );
// bind window
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glDeleteRenderbuffersEXT(1, &renderbuffer);
glDeleteFramebuffersEXT(1, &framebuffer);
}
}
} else {
// copy result into render window
RenderResult rres;
RE_GetResultImage(re, &rres);
view->readPixels(0, 0, re->winx, re->winy, AppGLWidget::RGBA, rres.rectf );
re->result->renlay = render_get_active_layer(re, re->result);
re->display_draw(re->result, NULL);
}
controller->CloseFile();
}
#ifdef __cplusplus

View File

@@ -1634,13 +1634,8 @@ static void do_render_3d(Render *re)
/* Freestyle */
if( re->r.mode & R_EDGE_FRS ) {
for(rl = re->result->layers.first; rl; rl= rl->next) {
if(rl->layflag & SCE_LAY_FRS) {
printf("Freestyle as a render layer\n");
FRS_prepare(re);
FRS_execute(re,1);
}
}
FRS_prepare(re);
FRS_execute(re,1);
}
/* do left-over 3d post effects (flares) */