[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53616] branches/ge_harmony/source: Now using the hardware depth buffer to reconstruct position ( gives an extra 8 bits of precision), and using the extra g buffer channel to store the third normal channel ( this improves performance of the light shader).
Daniel Stokes
kupomail at gmail.com
Sun Jan 6 22:23:36 CET 2013
Revision: 53616
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53616
Author: kupoman
Date: 2013-01-06 21:23:34 +0000 (Sun, 06 Jan 2013)
Log Message:
-----------
Now using the hardware depth buffer to reconstruct position (gives an extra 8 bits of precision), and using the extra g buffer channel to store the third normal channel (this improves performance of the light shader).
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 2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2013-01-06 21:23:34 UTC (rev 53616)
@@ -44,6 +44,7 @@
uniform sampler2D prepass1;
uniform sampler2D prepass2;
+uniform sampler2D depth_texture;
// uniform vec2 magic;
uniform mat4 inv_proj_matrix;
@@ -57,18 +58,21 @@
vec2 texcoord = gl_FragCoord.xy/bounds.xy;
vec4 gbuffer = texture2D(prepass1, texcoord);
vec4 mbuffer = texture2D(prepass2, texcoord);
+ float depth = texture2D(depth_texture, texcoord).r;
+ // float depth = gbuffer.b;
- 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 N = gbuffer.rgb * 2.0 - vec3(1.0, 1.0, 1.0);
+ // 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;
vec4 proj;
- proj.z = gbuffer.b;
- proj.x = texcoord.x * 2 - 1;
- proj.y = texcoord.y * 2 - 1;
+ proj.xy = texcoord;
+ proj.z = depth;
+ proj.xyz = proj.xyz * 2.0 - vec3(1.0, 1.0, 1.0);
proj.w = 1.0;
proj = inv_proj_matrix * proj;
V.xyz = proj.xyz/proj.w;
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 2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl 2013-01-06 21:23:34 UTC (rev 53616)
@@ -1,7 +1,7 @@
varying vec3 varnormal;
varying vec3 varposition;
-varying vec2 vardepth;
+// varying vec2 vardepth;
uniform float mat_id;
uniform float diff_param1;
@@ -12,10 +12,11 @@
void main()
{
- 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;
+ // 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;
+ gl_FragData[0].rgb = varnormal * 0.5 + vec3(0.5, 0.5, 0.5);
gl_FragData[0].a = mat_id;
gl_FragData[1].r = diff_param1;
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 2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl 2013-01-06 21:23:34 UTC (rev 53616)
@@ -1,7 +1,7 @@
varying vec3 varposition;
varying vec3 varnormal;
-varying vec2 vardepth;
+// varying vec2 vardepth;
void main()
{
@@ -10,7 +10,7 @@
varposition = co.xyz;
varnormal = normalize(gl_NormalMatrix * gl_Normal);
co = gl_ProjectionMatrix * co;
- vardepth = co.zw;
+ // 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 2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-01-06 21:23:34 UTC (rev 53616)
@@ -780,12 +780,14 @@
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);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, m_width, m_height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE , GL_INTENSITY);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
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);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, m_prepass_target[0], 0);
// Update prepass targets
for (int i = 0; i < m_prepass_count; i++)
@@ -806,7 +808,7 @@
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);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, m_prepass_target[0], 0);
// Update light target
glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(m_light_target));
@@ -1401,10 +1403,10 @@
glDrawBuffersARB(1, DRAW_BUFFERS);
glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
- glPolygonMode(GL_FRONT, GL_FILL);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
@@ -1423,6 +1425,11 @@
bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
glUniform1iARB(bind, 1);
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
+ bind = GPU_shader_get_uniform(m_light_shader, "depth_texture");
+ glUniform1iARB(bind, 2);
+
//m_magic[0] = -1/m_projmatrix[0][0];
//m_magic[1] = -1/m_projmatrix[1][1];
@@ -1544,6 +1551,7 @@
if (!m_light_shader) return;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
+ glDepthMask(GL_TRUE);
glPopAttrib();
}
More information about the Bf-blender-cvs
mailing list