[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50032] branches/ge_harmony/source: Rendering point lights as spheres instead of full screen quads for performance improvements .

Daniel Stokes kupomail at gmail.com
Mon Aug 20 01:55:38 CEST 2012


Revision: 50032
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50032
Author:   kupoman
Date:     2012-08-19 23:55:37 +0000 (Sun, 19 Aug 2012)
Log Message:
-----------
Rendering point lights as spheres instead of full screen quads for performance improvements. This also means all point lights are now treated as having the sphere option enabled.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.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/shaders/gpu_shader_light_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-19 23:55:37 UTC (rev 50032)
@@ -1,3 +1,5 @@
+#version 120
+
 #define SPOT	0
 #define SUN		1
 #define HEMI	2
@@ -28,18 +30,18 @@
 uniform sampler2D prepass2;
 
 uniform vec2 magic;
+uniform vec2 bounds;
 
 void main()
 {
-
 	vec3 L;
 	float attenuation = 1.0;
 
-	vec3 N = normalize(texture2D(prepass1, gl_TexCoord[0].st).rgb);
+	vec3 N = normalize(texture2D(prepass1, gl_FragCoord.xy/bounds.xy).rgb);
 	vec3 V;
 	// V.z = texture2D(prepass1, gl_TexCoord[0].st).a;
 	// V.xy = V.zz * magic * varposition.xy;
-	V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
+	V = texture2D(prepass2, gl_FragCoord.xy/bounds.xy).rgb;
 	
 	if (light.type == SUN || light.type == HEMI)
 		L = light.vector;
@@ -56,6 +58,8 @@
 			attenuation = light.dist/(light.dist + light.att[0]*dist);
 			attenuation *= distkw/(distkw + light.att[1]*dist*dist);
 		}
+		
+		attenuation *= max((light.dist - dist), 0.0)/light.dist;
 	}
 	
 	vec3 H = normalize(L - V);

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-19 23:55:37 UTC (rev 50032)
@@ -1316,9 +1316,11 @@
 #endif
 
 	// prepass
+	m_rasterizer->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
 	m_rasterizer->BeginPrePass();
 	scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
 	m_rasterizer->EndPrePass();
+	m_rasterizer->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_DISABLED);
 
 	// light pass
 	m_rasterizer->BeginLightPass();

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2012-08-19 23:55:37 UTC (rev 50032)
@@ -173,8 +173,6 @@
 {
 	BucketList::iterator bit;
 
-	rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
-
 	for (bit = m_SolidBuckets.begin(); bit != m_SolidBuckets.end(); ++bit) {
 #if 1
 		RAS_MaterialBucket* bucket = *bit;

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-19 23:55:37 UTC (rev 50032)
@@ -169,10 +169,42 @@
 
 	m_light_shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
 
+	init_sphere();
+
 	return true;
 }
 
+void RAS_OpenGLRasterizer::init_sphere()
+{
+	//radius == 1
+	int rings = 16;
+	int sectors = 16;
 
+	float R = 1./(rings-1);
+	float S = 1./(sectors-1);
+	int r, s;
+
+	m_sphere_vertices = new float[rings * sectors * 3];
+	m_sphere_indices = new unsigned short[rings * sectors * 4];
+	m_sphere_size = rings*sectors*4;
+
+	int v=0, i=0;
+	for (r = 0; r < rings; r++) {
+		for (s = 0; s < sectors; s++) {
+			m_sphere_vertices[v++] = cos(2*M_PI * s * S) * sin(M_PI * r * R);
+			m_sphere_vertices[v++] = sin(-M_PI/2 + M_PI * r * R);
+			m_sphere_vertices[v++] = sin(2*M_PI * s * S) * sin(M_PI * r * R);
+
+			m_sphere_indices[i++] = r * sectors + s;
+			m_sphere_indices[i++] = r * sectors + (s+1);
+			m_sphere_indices[i++] = (r+1) * sectors + (s+1);
+			m_sphere_indices[i++] = (r+1) * sectors + s;
+		}
+	}
+
+}
+
+
 void RAS_OpenGLRasterizer::SetAmbientColor(float red, float green, float blue)
 {
 	m_ambr = red;
@@ -310,6 +342,9 @@
 	glDeleteTextures(2, m_prepass_target);
 	glDeleteTextures(1, &m_depth_target);
 	glDeleteFramebuffersEXT(1, &m_fbo);
+
+	delete m_sphere_vertices;
+	delete m_sphere_indices;
 	
 	EndFrame();
 }
@@ -1422,7 +1457,7 @@
 void RAS_OpenGLRasterizer::BeginLightPass()
 {
 	int bind;
-	glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
+	glPushAttrib(GL_COLOR_BUFFER_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};
@@ -1432,18 +1467,10 @@
 	glEnable(GL_TEXTURE_2D);
 	glEnable(GL_BLEND);
 	glBlendFunc(GL_ONE, GL_ONE);
-	// in case the previous material was wire
 	glPolygonMode(GL_FRONT, GL_FILL);
-	glPushMatrix();		//GL_MODELVIEW
-	glLoadIdentity();	// GL_MODELVIEW
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
-	glMatrixMode(GL_PROJECTION);
-	glPushMatrix();
-	glLoadIdentity();
 
-	glViewport(0, 0, m_width, m_height);
-
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
 
@@ -1462,14 +1489,18 @@
 
 	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);
+
+	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);
 }
 
 void RAS_OpenGLRasterizer::RenderLight(RAS_LightObject *light)
 {
 	int bind;
-	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, "light.type");
 	GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, (int*)(&light->m_type));
 
@@ -1506,23 +1537,43 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "light.vector");
 	GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, fvec);
 
-	glBegin(GL_QUADS);
-		glColor4f(1.f, 1.f, 1.f, 1.f);
-		glTexCoord2f(1.0, 1.0); glVertex2f(1,1);
-		glTexCoord2f(0.0, 1.0); glVertex2f(-1,1);
-		glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1);
-		glTexCoord2f(1.0, 0.0); glVertex2f(1,-1);
-	glEnd();
+	if (light->m_type == RAS_LightObject::LIGHT_NORMAL) {
+		glMatrixMode(GL_MODELVIEW);
+		glPushMatrix();
+		glLoadIdentity();
+
+		glTranslatef(fpos[0], fpos[1], fpos[2]);
+		glScalef(light->m_distance, light->m_distance, light->m_distance);
+		glEnableClientState(GL_VERTEX_ARRAY);
+		glVertexPointer(3, GL_FLOAT, 0, m_sphere_vertices);
+		glDrawElements(GL_QUADS, m_sphere_size, GL_UNSIGNED_SHORT, m_sphere_indices);
+
+		glPopMatrix();
+	}
+	else {
+		glMatrixMode(GL_MODELVIEW);
+		glPushMatrix();
+		glLoadIdentity();
+		glMatrixMode(GL_PROJECTION);
+		glPushMatrix();
+		glLoadIdentity();
+
+		glBegin(GL_QUADS);
+			glColor4f(1.f, 1.f, 1.f, 1.f);
+			glVertex2f(1,1);
+			glVertex2f(-1,1);
+			glVertex2f(-1,-1);
+			glVertex2f(1,-1);
+		glEnd();
+
+		glPopMatrix();
+		glMatrixMode(GL_MODELVIEW);
+		glPopMatrix();
+	}
 }
 
 void RAS_OpenGLRasterizer::EndLightPass()
 {
-	glUseProgramObjectARB(0);
-	glEnable(GL_DEPTH_TEST);
-	glPopMatrix();
-	glMatrixMode(GL_MODELVIEW);
-	glPopMatrix();
-
 	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
 	glPopAttrib();
 }

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-19 23:55:37 UTC (rev 50032)
@@ -134,6 +134,12 @@
 	int				m_width;
 	int				m_height;
 
+	/* Shapes */
+	void init_sphere();
+	float*			m_sphere_vertices;
+	unsigned short*	m_sphere_indices;
+	int				m_sphere_size;
+
 	/** Stores the caching information for the last material activated. */
 	RAS_IPolyMaterial::TCachingInfo m_materialCachingInfo;
 	RAS_OGLFilterManager m_filtermanager;




More information about the Bf-blender-cvs mailing list