[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51127] branches/ge_harmony/source: Combining the two floating point gbuffer textures for the inferred lighting mode 's prepass into one integer texture.
Daniel Stokes
kupomail at gmail.com
Sat Oct 6 21:58:21 CEST 2012
Revision: 51127
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51127
Author: kupoman
Date: 2012-10-06 19:58:21 +0000 (Sat, 06 Oct 2012)
Log Message:
-----------
Combining the two floating point gbuffer textures for the inferred lighting mode's prepass into one integer texture. This should perform better, and gives more room for some other properties.
Also making sure depth testing gets re-enabled after the lighting pass.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2012-10-06 19:58:21 UTC (rev 51127)
@@ -29,19 +29,32 @@
uniform sampler2D prepass1;
uniform sampler2D prepass2;
-uniform vec2 magic;
+// uniform vec2 magic;
+uniform mat4 inv_proj_matrix;
uniform vec2 bounds;
void main()
{
vec3 L;
float attenuation = 1.0;
+
+ vec2 texcoord = gl_FragCoord.xy/bounds.xy;
+ vec4 gbuffer = texture2D(prepass1, texcoord);
- vec3 N = normalize(texture2D(prepass1, gl_FragCoord.xy/bounds.xy).rgb);
+ vec3 N = vec3(gbuffer.rg, 0.0);
+ N = 2 * (N - vec3(0.5, 0.5, 0.0));
+ float z = sqrt(1.0 - pow(length(N.xy), 2.0));
+ N = vec3(2.0*z*N.x, 2.0*z*N.y, 2.0*z*z -1.0);
+ N = normalize(N);
+
vec3 V;
- // V.z = texture2D(prepass1, gl_TexCoord[0].st).a;
- // V.xy = V.zz * magic * varposition.xy;
- V = texture2D(prepass2, gl_FragCoord.xy/bounds.xy).rgb;
+ vec4 proj;
+ proj.z = gbuffer.b;
+ proj.x = texcoord.x * 2 - 1;
+ proj.y = texcoord.y * 2 - 1;
+ proj.w = 1.0;
+ proj = inv_proj_matrix * proj;
+ V.xyz = proj.xyz/proj.w;
if (light.type == SUN || light.type == HEMI)
L = light.vector;
Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl 2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl 2012-10-06 19:58:21 UTC (rev 51127)
@@ -1,9 +1,12 @@
varying vec3 varnormal;
varying vec3 varposition;
+varying vec2 vardepth;
void main()
{
- gl_FragData[0].rgb = varnormal;
- gl_FragData[1].rgb = varposition;
+ vec3 n = normalize(varnormal + vec3(0.0, 0.0, 1.0));
+ n = 0.5 * n + vec3(0.5, 0.5, 0.5);
+ gl_FragData[0].rg = n.xy;
+ gl_FragData[0].b = vardepth.x / vardepth.y;
}
\ No newline at end of file
Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl 2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl 2012-10-06 19:58:21 UTC (rev 51127)
@@ -1,6 +1,7 @@
varying vec3 varposition;
varying vec3 varnormal;
+varying vec2 vardepth;
void main()
{
@@ -8,6 +9,8 @@
varposition = co.xyz;
varnormal = normalize(gl_NormalMatrix * gl_Normal);
- gl_Position = gl_ProjectionMatrix * co;
+ co = gl_ProjectionMatrix * co;
+ vardepth = co.zw;
+ gl_Position = co;
}
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-10-06 19:58:21 UTC (rev 51127)
@@ -176,7 +176,7 @@
if (m_technique == KX_TECH_INFERRED)
{
- glGenTextures(2, m_prepass_target);
+ glGenTextures(1, m_prepass_target);
m_light_shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
init_sphere();
}
@@ -691,10 +691,10 @@
if (m_technique == KX_TECH_INFERRED)
{
// Update prepass targets, but don't attach for now
- for (int i = 0; i < 2; i++)
+ for (int i = 0; i < 1; i++)
{
glBindTexture(GL_TEXTURE_2D, m_prepass_target[i]);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, m_width, m_height, 0, GL_RGB, GL_HALF_FLOAT, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16, m_width, m_height, 0, GL_RGB, GL_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);
@@ -1490,7 +1490,7 @@
if (m_technique != KX_TECH_INFERRED) return;
int bind;
- glPushAttrib(GL_COLOR_BUFFER_BIT);
+ 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};
@@ -1520,12 +1520,17 @@
bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
glUniform1iARB(bind, 1);
- m_magic[0] = -1/m_projmatrix[0][0];
- m_magic[1] = -1/m_projmatrix[1][1];
+ //m_magic[0] = -1/m_projmatrix[0][0];
+ //m_magic[1] = -1/m_projmatrix[1][1];
- bind = GPU_shader_get_uniform(m_light_shader, "magic");
- GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
+ //bind = GPU_shader_get_uniform(m_light_shader, "magic");
+ //GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
+ float inv_proj_matrix[16];
+ m_projmatrix.inverse().getValue(inv_proj_matrix);
+ bind = GPU_shader_get_uniform(m_light_shader, "inv_proj_matrix");
+ GPU_shader_uniform_vector(m_light_shader, bind, 16, 1, inv_proj_matrix);
+
float bounds[2] = {m_width, m_height};
bind = GPU_shader_get_uniform(m_light_shader, "bounds");
GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, bounds);
@@ -1621,7 +1626,7 @@
glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_prepass_target[1], 0);
+ //glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_prepass_target[1], 0);
GLenum targets[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
glDrawBuffersARB(2, targets);
@@ -1642,9 +1647,9 @@
SetDrawingMode(m_saved_drawingmode);
glUseProgramObjectARB(0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
- if (m_target_enabled[1])
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_color_target[1], 0);
- else
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
+ //if (m_target_enabled[1])
+ // glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_color_target[1], 0);
+ //else
+ // glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
glPopAttrib();
}
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list