[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51856] branches/ge_harmony/source/ gameengine/Rasterizer/RAS_OpenGLRasterizer: Giving each rendering pass its own FBO and making some of the setup a little more general .
Daniel Stokes
kupomail at gmail.com
Sun Nov 4 04:09:52 CET 2012
Revision: 51856
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51856
Author: kupoman
Date: 2012-11-04 03:09:45 +0000 (Sun, 04 Nov 2012)
Log Message:
-----------
Giving each rendering pass its own FBO and making some of the setup a little more general. This should make passing the control of MRTs off to the user a little easier.
Modified Paths:
--------------
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-11-04 03:03:45 UTC (rev 51855)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-11-04 03:09:45 UTC (rev 51856)
@@ -59,6 +59,9 @@
#define M_PI 3.14159265358979323846
#endif
+/* Used for Multiple Render Target control */
+static GLenum DRAW_BUFFERS[4] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT};
+
/**
* 32x32 bit masks for vinterlace stereo mode
*/
@@ -96,7 +99,9 @@
m_height(0),
m_technique(tech),
m_prepass_shader_default(NULL),
- m_light_shader_default(NULL)
+ m_light_shader_default(NULL),
+ m_prepass_count(2),
+ m_render_count(1)
{
m_viewmatrix.setIdentity();
m_viewinvmatrix.setIdentity();
@@ -111,16 +116,6 @@
m_prevafvalue = GPU_get_anisotropic();
- for (int i = 0; i < RAS_MAX_MRT; i++)
- {
- m_color_target[i] = -1;
- }
-
- m_target_enabled[0] = true;
- m_target_enabled[1] = false;
- m_target_enabled[2] = false;
- m_target_enabled[3] = false;
-
// Light Map (Handle this here to sneak in before material conversion)
if (m_technique == KX_TECH_INFERRED)
{
@@ -173,13 +168,12 @@
glShadeModel(GL_SMOOTH);
// FBO
- glGenFramebuffersEXT(1, &m_fbo);
- glGenTextures(1, &m_depth_target);
- glGenTextures(RAS_MAX_MRT, m_color_target);
+ glGenFramebuffersEXT(3, m_fbo);
+ glGenTextures(m_render_count+1, m_render_target);
- if (m_technique == KX_TECH_INFERRED)
- {
- glGenTextures(2, m_prepass_target);
+ if (m_technique == KX_TECH_INFERRED) {
+ glGenTextures(m_prepass_count+1, m_prepass_target);
+
m_light_shader_default = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
m_prepass_shader_default = GPU_shader_get_builtin_shader(GPU_SHADER_PREPASS);
init_sphere();
@@ -380,13 +374,12 @@
if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
- glDeleteTextures(RAS_MAX_MRT, m_color_target);
- glDeleteTextures(1, &m_depth_target);
- glDeleteFramebuffersEXT(1, &m_fbo);
+ glDeleteTextures(m_render_count+1, m_render_target);
+ glDeleteFramebuffersEXT(3, m_fbo);
if (m_technique == KX_TECH_INFERRED)
{
- glDeleteTextures(2, m_prepass_target);
+ glDeleteTextures(m_prepass_count+1, m_prepass_target);
delete m_sphere_vertices;
delete m_sphere_indices;
}
@@ -399,16 +392,11 @@
m_time = time;
m_drawingmode = drawingmode;
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
- m_final_target = m_color_target[0];
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
+ m_final_target = m_render_target[1];
- GLenum targets[RAS_MAX_MRT];
- for (int i = 0; i < RAS_MAX_MRT; i++)
- targets[i] = (m_target_enabled[i]) ? GL_COLOR_ATTACHMENT0_EXT+i : GL_NONE;
+ glDrawBuffersARB(m_render_count, DRAW_BUFFERS);
- glDrawBuffersARB(RAS_MAX_MRT, targets);
-
// Blender camera routine destroys the settings
if (m_drawingmode < KX_SOLID)
{
@@ -443,7 +431,7 @@
void RAS_OpenGLRasterizer::SetDrawingMode(int drawingmode)
{
if (m_drawingmode == KX_SHADOW)
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
m_drawingmode = drawingmode;
@@ -661,66 +649,84 @@
if (m_2DCanvas->GetWindowArea().GetRight() != m_width || m_2DCanvas->GetWindowArea().GetTop() != m_height)
{
- GLenum internal_formats[RAS_MAX_MRT] = {GL_RGB16F, GL_RGB16F, GL_RGB16F, GL_RGB16F};
- GLenum formats[RAS_MAX_MRT] = {GL_RGB, GL_RGB, GL_RGB, GL_RGB};
- GLenum sizes[RAS_MAX_MRT] = {GL_HALF_FLOAT, GL_HALF_FLOAT, GL_HALF_FLOAT, GL_HALF_FLOAT};
-
m_width = m_2DCanvas->GetWindowArea().GetRight();
m_height = m_2DCanvas->GetWindowArea().GetTop();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
//Update depth target
- glBindTexture(GL_TEXTURE_2D, m_depth_target);
+ glBindTexture(GL_TEXTURE_2D, m_render_target[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depth_target, 0);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_render_target[0], 0);
//Update color targets
- for (int i = 0; i < RAS_MAX_MRT; i++)
+ for (int i = 0; i < m_render_count; i++)
{
- if (m_target_enabled[i])
- {
- glBindTexture(GL_TEXTURE_2D, m_color_target[i]);
- glTexImage2D(GL_TEXTURE_2D, 0, internal_formats[i], m_width, m_height, 0, formats[i], sizes[i], NULL);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_color_target[i], 0);
- }
+ glBindTexture(GL_TEXTURE_2D, m_render_target[i+1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_width, m_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_render_target[i+1], 0);
}
+ //Check completeness
+ GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+ printf("Error in setting up FBO\n");
+
if (m_technique == KX_TECH_INFERRED)
{
- // Update prepass targets, but don't attach for now
- for (int i = 0; i < 2; i++)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[1]);
+
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
+
+ // Update prepass targets
+ for (int i = 0; i < m_prepass_count; i++)
{
- glBindTexture(GL_TEXTURE_2D, m_prepass_target[i]);
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[i+1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_prepass_target[i+1], 0);
}
- // Update light target, but don't attach for now
+ //Check completeness
+ status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+ printf("Error in setting up prepass FBO\n");
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[2]);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
+
+ // Update light target
glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(m_light_target));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_HALF_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, GPU_texture_opengl_bindcode(m_light_target), 0);
+
+ //Check completeness
+ status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+ printf("Error in setting up light FBO\n");
}
- //Check completeness
- GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
- if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
- printf("Error in setting up FBO\n");
-
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
@@ -1532,11 +1538,10 @@
int bind;
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
- bind = GPU_texture_opengl_bindcode(m_light_target);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, bind, 0);
- GLenum targets[1] = {GL_COLOR_ATTACHMENT0_EXT};
- glDrawBuffersARB(1, targets);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[2]);
+ glDrawBuffersARB(1, DRAW_BUFFERS);
+
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
@@ -1551,12 +1556,12 @@
GPU_shader_bind(m_light_shader);
glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
bind = GPU_shader_get_uniform(m_light_shader, "prepass1");
glUniform1iARB(bind, 0);
glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[2]);
bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
glUniform1iARB(bind, 1);
@@ -1657,8 +1662,8 @@
{
if (m_technique != KX_TECH_INFERRED) return;
if (!m_light_shader) return;
-
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list