[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49881] branches/ge_harmony/source: Setting up the beginning of the light pass.

Daniel Stokes kupomail at gmail.com
Mon Aug 13 23:21:28 CEST 2012


Revision: 49881
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49881
Author:   kupoman
Date:     2012-08-13 21:21:27 +0000 (Mon, 13 Aug 2012)
Log Message:
-----------
Setting up the beginning of the light pass. Not very exciting yet, but light color is being written to the light map.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/CMakeLists.txt
    branches/ge_harmony/source/blender/gpu/GPU_extensions.h
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
    branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Added Paths:
-----------
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl.c

Modified: branches/ge_harmony/source/blender/gpu/CMakeLists.txt
===================================================================
--- branches/ge_harmony/source/blender/gpu/CMakeLists.txt	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/blender/gpu/CMakeLists.txt	2012-08-13 21:21:27 UTC (rev 49881)
@@ -57,6 +57,7 @@
 	shaders/gpu_shader_sep_gaussian_blur_vert.glsl.c
 	shaders/gpu_shader_vsm_store_frag.glsl.c
 	shaders/gpu_shader_vsm_store_vert.glsl.c
+    shaders/gpu_shader_light_frag.glsl.c
 
 	GPU_buffers.h
 	GPU_draw.h

Modified: branches/ge_harmony/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2012-08-13 21:21:27 UTC (rev 49881)
@@ -221,8 +221,9 @@
 
 /* Builtin/Non-generated shaders */
 typedef enum GPUBuiltinShader {
-	GPU_SHADER_VSM_STORE =			(1<<0),
-	GPU_SHADER_SEP_GAUSSIAN_BLUR =	(1<<1),
+	GPU_SHADER_VSM_STORE,
+	GPU_SHADER_SEP_GAUSSIAN_BLUR,
+	GPU_SHADER_LIGHT,
 } GPUBuiltinShader;
 
 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2012-08-13 21:21:27 UTC (rev 49881)
@@ -73,10 +73,12 @@
 extern char datatoc_gpu_shader_vsm_store_frag_glsl[];
 extern char datatoc_gpu_shader_sep_gaussian_blur_vert_glsl[];
 extern char datatoc_gpu_shader_sep_gaussian_blur_frag_glsl[];
+extern char datatoc_gpu_shader_light_frag_glsl[];
 
 typedef struct GPUShaders {
 	GPUShader *vsm_store;
 	GPUShader *sep_gaussian_blur;
+	GPUShader *light;
 } GPUShaders;
 
 static struct GPUGlobal {
@@ -1371,6 +1373,11 @@
 				GG.shaders.sep_gaussian_blur = GPU_shader_create(datatoc_gpu_shader_sep_gaussian_blur_vert_glsl, datatoc_gpu_shader_sep_gaussian_blur_frag_glsl, NULL, NULL, 0, 0);
 			retval = GG.shaders.sep_gaussian_blur;
 			break;
+		case GPU_SHADER_LIGHT:
+			if (!GG.shaders.light)
+				GG.shaders.light = GPU_shader_create(NULL, datatoc_gpu_shader_light_frag_glsl, NULL, NULL, 0, 0);
+			retval = GG.shaders.light;
+			break;
 	}
 
 	if (retval == NULL)

Added: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	                        (rev 0)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-13 21:21:27 UTC (rev 49881)
@@ -0,0 +1,13 @@
+struct Light {
+    float energy;
+    vec3 color;
+    vec3 position;
+};
+
+uniform Light light;
+
+void main()
+{
+    gl_FragData[0] = vec4(light.color, light.energy);
+}
+

Added: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl.c	                        (rev 0)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl.c	2012-08-13 21:21:27 UTC (rev 49881)
@@ -0,0 +1,12 @@
+/* DataToC output of file <gpu_shader_light_frag_glsl> */
+
+int datatoc_gpu_shader_light_frag_glsl_size = 178;
+char datatoc_gpu_shader_light_frag_glsl[] = {
+115,116,114,117, 99,116, 32, 76,105,103,104,116, 32,123, 13, 10, 32, 32,
+ 32, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 59, 13, 10, 32, 32, 32, 32,118,101, 99, 51, 32, 99,111,108,111,114, 59,
+ 13, 10, 32, 32, 32, 32,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 59, 13, 10,125, 59, 13, 10, 13, 10,117,110,105,102,
+111,114,109, 32, 76,105,103,104,116, 32,108,105,103,104,116, 59, 13, 10, 13, 10,118,111,105,100, 32,109, 97,105,110, 40, 41, 13,
+ 10,123, 13, 10, 32, 32, 32, 32,103,108, 95, 70,114, 97,103, 68, 97,116, 97, 91, 48, 93, 32, 61, 32,118,101, 99, 52, 40,108,105,
+103,104,116, 46, 99,111,108,111,114, 44, 32,108,105,103,104,116, 46,101,110,101,114,103,121, 41, 59, 13, 10,125, 13, 10, 13, 10,
+  0};
+

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-13 21:21:27 UTC (rev 49881)
@@ -872,6 +872,13 @@
 		// this is now done incrementatlly in KX_Scene::CalculateVisibleMeshes
 		//scene->UpdateMeshTransformations();
 
+		// light pass
+		m_rasterizer->BeginLightPass();
+		CListValue *lightlist = scene->GetLightList();
+		for (int i=0; i<lightlist->GetCount(); i++)
+			m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());
+		m_rasterizer->EndLightPass();
+
 		// shadow buffers
 		RenderShadowBuffers(scene);
 

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp	2012-08-13 21:21:27 UTC (rev 49881)
@@ -208,6 +208,8 @@
 			for (int j=0; j<4; j++, dobmat++)
 				obmat[i][j] = (float)*dobmat;
 
+		memcpy(m_lightobj.m_position, &obmat[0][3], sizeof(float)*3);
+
 		GPU_lamp_update(lamp, m_lightobj.m_layer, 0, obmat);
 		GPU_lamp_update_colors(lamp, m_lightobj.m_red, m_lightobj.m_green, 
 			m_lightobj.m_blue, m_lightobj.m_energy);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2012-08-13 21:21:27 UTC (rev 49881)
@@ -42,6 +42,7 @@
 #include "MT_Matrix4x4.h"
 
 #include "RAS_TexVert.h"
+#include "RAS_LightObject.h"
 
 #include <vector>
 using namespace std;
@@ -452,6 +453,9 @@
 	virtual void	EnableUniform(int pass, STR_String name, RAS_UNIFORM_TYPE type, void *data)=0;
 	virtual void	EnableFilter(void* gameObj, RAS_2DFILTER_MODE mode, int pass, STR_String& text)=0;
 
+	virtual void	BeginLightPass()=0;
+	virtual void	RenderLight(RAS_LightObject *light)=0;
+	virtual void	EndLightPass()=0;
 
 #ifdef WITH_CXX_GUARDEDALLOC
 	MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_IRasterizer")

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2012-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2012-08-13 21:21:27 UTC (rev 49881)
@@ -62,6 +62,8 @@
 	
 	bool	m_nodiffuse;
 	bool	m_nospecular;
+
+	float	m_position[3];
 };
 
 #endif //__RAS_LIGHTOBJECT_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-08-13 20:20:49 UTC (rev 49880)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-13 21:21:27 UTC (rev 49881)
@@ -164,6 +164,8 @@
 	glGenTextures(1, &m_depth_target);
 	glGenTextures(RAS_MAX_MRT, m_color_target);
 
+	m_light_shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
+
 	return true;
 }
 
@@ -609,6 +611,14 @@
 			}
 		}
 
+		// Update light target, but don't attach for now
+		glBindTexture(GL_TEXTURE_2D, 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);
+
 		//Check completeness
 		GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
 		if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
@@ -1390,4 +1400,64 @@
 void RAS_OpenGLRasterizer::EnableFilter(void* gameObj, RAS_2DFILTER_MODE mode, int pass, STR_String& text)
 {
 	m_filtermanager.EnableFilter(gameObj, mode, pass, text);
+}
+
+void RAS_OpenGLRasterizer::BeginLightPass()
+{
+	glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
+	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_light_target, 0);
+	GLenum targets[1] = {GL_COLOR_ATTACHMENT0_EXT};
+	glDrawBuffersARB(1, targets);
+
+	glDisable(GL_DEPTH_TEST);
+	glEnable(GL_TEXTURE_2D);
+	// 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, 1.0);
+	glClear(GL_COLOR_BUFFER_BIT);
+	GPU_shader_bind(m_light_shader);
+}
+
+void RAS_OpenGLRasterizer::RenderLight(RAS_LightObject *light)
+{
+	int bind;
+	bind = GPU_shader_get_uniform(m_light_shader, "light.energy");
+	GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_energy);
+
+	float color[3] = {light->m_red, light->m_green, light->m_blue};
+	bind = GPU_shader_get_uniform(m_light_shader, "light.color");
+	GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, color);
+
+	bind = GPU_shader_get_uniform(m_light_shader, "light.position");
+	GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, light->m_position);
+
+	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();
+}
+
+void RAS_OpenGLRasterizer::EndLightPass()
+{
+	GPU_shader_unbind(m_light_shader);
+	glEnable(GL_DEPTH_TEST);
+	glPopMatrix();
+	glMatrixMode(GL_MODELVIEW);
+	glPopMatrix();
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list