[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