[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53672] branches/ge_harmony/source: Using a different method for reconstructing position information in the light shader (view ray).

Daniel Stokes kupomail at gmail.com
Wed Jan 9 04:43:38 CET 2013


Revision: 53672
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53672
Author:   kupoman
Date:     2013-01-09 03:43:30 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
Using a different method for reconstructing position information in the light shader (view ray). This fixes the offset bug, but does not work with orthographic projection.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl
    branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    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/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-01-09 03:43:30 UTC (rev 53672)
@@ -1422,7 +1422,7 @@
 			if (!GG.shaders.light) {
 				char *frag = MEM_mallocN(strlen(datatoc_gpu_shader_light_frag_glsl) + strlen(datatoc_gpu_shader_material_glsl) + 1, "Light fragment shader");
 				sprintf(frag, "%s%s", datatoc_gpu_shader_material_glsl, datatoc_gpu_shader_light_frag_glsl);
-				GG.shaders.light = GPU_shader_create(NULL, frag, NULL, NULL, 0, 0);
+				GG.shaders.light = GPU_shader_create(datatoc_gpu_shader_light_vert_glsl, frag, NULL, NULL, 0, 0);
 				MEM_freeN(frag);
 			}
 			retval = GG.shaders.light;

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-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2013-01-09 03:43:30 UTC (rev 53672)
@@ -38,7 +38,7 @@
 	float spotblend;
 };
 
-//varying vec3 varposition;
+varying vec3 varposition;
 
 uniform Light light;
 
@@ -46,8 +46,8 @@
 uniform sampler2D prepass2;
 uniform sampler2D depth_texture;
 
-// uniform vec2 magic;
-uniform mat4 inv_proj_matrix;
+uniform vec2 magic;
+// uniform mat4 inv_proj_matrix;
 uniform vec2 bounds;
 
 void main()
@@ -58,7 +58,6 @@
 	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 = gbuffer.rgb * 2.0 - vec3(1.0, 1.0, 1.0);
@@ -68,14 +67,20 @@
 	// 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.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;
+	float depth = texture2D(depth_texture, texcoord).r;
+	vec3 viewray = vec3(varposition.xy/varposition.z, 1.0);
+	depth = magic.y / (depth - magic.x);
+	vec3 V = viewray * -depth;
+	
+	// vec3 V;
+	// vec4 proj;
+	// 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;
+
 	vec3 view = (gl_ProjectionMatrix[3][3] == 0.0)? normalize(-V): vec3(0.0, 0.0, -1.0);
 	
 	// Light position/orientation and attenuation
@@ -106,7 +111,7 @@
 	}
 	
 	attenuation = (attenuation < 0.001) ? 0.0 : attenuation;
-	int matid = int(gbuffer.a*65535);
+	int matid = int(gbuffer.a)*65535;
 	int diff_shader = matid / 16;
 	int spec_shader = matid - (diff_shader*16);
 	

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl	2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl	2013-01-09 03:43:30 UTC (rev 53672)
@@ -1,8 +1,10 @@
 
-//varying vec3 varposition;
+varying vec3 varposition;
 
 void main()
 {
-	gl_Position = ftransform();
+	vec4 co = gl_ModelViewMatrix * gl_Vertex;
+	varposition = co.xyz;
+	gl_Position = gl_ProjectionMatrix*co;
 }
 

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2013-01-09 03:43:30 UTC (rev 53672)
@@ -1314,7 +1314,7 @@
 	}
 
 	// light pass
-	if (m_rasterizer->BeginLightPass()) {
+	if (m_rasterizer->BeginLightPass(cam->GetCameraData())) {
 		CListValue *lightlist = scene->GetLightList();
 		for (int i=0; i<lightlist->GetCount(); i++)
 			m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-01-09 03:43:30 UTC (rev 53672)
@@ -430,7 +430,7 @@
 	virtual class	RAS_IFilterManager* CreateFilterManager()=0;
 
 	virtual void	SetLightShader(struct Shader** shader, int count)=0;
-	virtual int		BeginLightPass()=0;
+	virtual int		BeginLightPass(class RAS_CameraData* camera)=0;
 	virtual void	RenderLight(RAS_LightObject *light)=0;
 	virtual void	EndLightPass()=0;
 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2013-01-09 03:43:30 UTC (rev 53672)
@@ -14,6 +14,7 @@
 
 #include "RAS_MaterialBucket.h"
 #include "RAS_TexVert.h"
+#include "RAS_CameraData.h"
 #include "MT_assert.h"
 
 //#if defined(DEBUG)

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-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-01-09 03:43:30 UTC (rev 53672)
@@ -41,6 +41,7 @@
 #include "RAS_Rect.h"
 #include "RAS_TexVert.h"
 #include "RAS_MeshObject.h"
+#include "RAS_CameraData.h"
 #include "MT_CmMatrix4x4.h"
 #include "RAS_IRenderTools.h" // rendering text
 
@@ -1119,7 +1120,7 @@
 		
 	glGetDoublev(GL_PROJECTION_MATRIX, mat);
 	result.setValue(mat);
-
+	m_projmatrix = result;
 	return result;
 }
 
@@ -1392,7 +1393,7 @@
 	set_shader_internal(&m_prepass_shader, m_prepass_shader_default, shaders, count);
 }
 
-int RAS_OpenGLRasterizer::BeginLightPass()
+int RAS_OpenGLRasterizer::BeginLightPass(RAS_CameraData* camera)
 {
 	if (!m_light_shader) return 0;
 
@@ -1425,17 +1426,22 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
 	glUniform1iARB(bind, 1);
 
+	glActiveTexture(GL_TEXTURE3);
+	glBindTexture(GL_TEXTURE_2D, m_prepass_target[3]);
+	bind = GPU_shader_get_uniform(m_light_shader, "prepass3");
+	glUniform1iARB(bind, 3);
+
 	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];
+	float magic[2];
+	magic[0] = camera->m_clipend / (camera->m_clipend - camera->m_clipstart);
+	magic[1] = (-camera->m_clipend * camera->m_clipstart) / (camera->m_clipend - camera->m_clipstart);
+	bind = GPU_shader_get_uniform(m_light_shader, "magic");
+	GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, 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");
@@ -1500,10 +1506,7 @@
 	if (light->m_type == RAS_LightObject::LIGHT_NORMAL) {
 		glMatrixMode(GL_MODELVIEW);
 		glPushMatrix();
-
-		glLoadIdentity();
-
-		glTranslatef(fpos[0], fpos[1], fpos[2]);
+		glMultMatrixf((GLfloat*)light->m_obmat);
 		glScalef(light->m_distance, light->m_distance, light->m_distance);
 
 		glEnableClientState(GL_VERTEX_ARRAY);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-01-09 03:43:30 UTC (rev 53672)
@@ -104,8 +104,6 @@
 
 	short			m_prevafvalue;
 
-	float			m_magic[2];
-
 	//motion blur
 	int	m_motionblur;
 	float	m_motionblurvalue;
@@ -363,7 +361,7 @@
 
 	/* Light Pass */
 	virtual void	SetLightShader(struct Shader** shader, int count);
-	virtual int		BeginLightPass();
+	virtual int		BeginLightPass(class RAS_CameraData* camera);
 	virtual void	RenderLight(RAS_LightObject *light);
 	virtual void	EndLightPass();
 




More information about the Bf-blender-cvs mailing list