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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) */
|
||||
|
||||
Reference in New Issue
Block a user