[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49923] branches/ge_harmony/source: Adding support for sun and hemi lights in the light map shader.
Daniel Stokes
kupomail at gmail.com
Wed Aug 15 23:58:21 CEST 2012
Revision: 49923
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49923
Author: kupoman
Date: 2012-08-15 21:58:20 +0000 (Wed, 15 Aug 2012)
Log Message:
-----------
Adding support for sun and hemi lights in the light map shader.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
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_LightObject.h
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 2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2012-08-15 21:58:20 UTC (rev 49923)
@@ -1,8 +1,15 @@
+#define SPOT 0
+#define SUN 1
+#define HEMI 2
+#define NORMAL 3
+
struct Light {
+ int type;
float energy;
vec3 color;
float dist;
vec3 position;
+ vec3 vector;
};
uniform Light light;
@@ -12,15 +19,27 @@
void main()
{
+
+ vec3 L;
+ float attenuation = 1.0;
+
vec3 N = texture2D(prepass1, gl_TexCoord[0].st).rgb;
vec3 V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
- vec3 L = light.position - V;
- float dist = length(L);
- L = normalize(L);
- float attenuation = light.dist/(light.dist + dist*dist);
+ if (light.type == SUN || light.type == HEMI)
+ L = normalize(light.vector);
+ else {
+ L = light.position - V;
+ float dist = length(L);
+ L = normalize(L);
+
+ attenuation = light.dist/(light.dist + dist*dist);
+ }
float lambert = max(dot(N, L), 0.0);
+ if (light.type == HEMI)
+ lambert = 0.5*lambert + 0.5;
+
vec3 diff = light.color * light.energy * lambert * attenuation;
gl_FragData[0] = vec4(diff, 1);
Modified: branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2012-08-15 21:58:20 UTC (rev 49923)
@@ -1901,6 +1901,8 @@
lightobj.m_type = RAS_LightObject::LIGHT_SUN;
} else if (la->type==LA_SPOT) {
lightobj.m_type = RAS_LightObject::LIGHT_SPOT;
+ } else if (la->type==LA_HEMI) {
+ lightobj.m_type = RAS_LightObject::LIGHT_HEMI;
} else {
lightobj.m_type = RAS_LightObject::LIGHT_NORMAL;
}
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2012-08-15 21:58:20 UTC (rev 49923)
@@ -877,9 +877,6 @@
RenderFrame(scene, cam);
m_rasterizer->EndPrePass();
- // shadow buffers
- RenderShadowBuffers(scene);
-
// light pass
m_rasterizer->BeginLightPass();
CListValue *lightlist = scene->GetLightList();
@@ -887,6 +884,9 @@
m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());
m_rasterizer->EndLightPass();
+ // shadow buffers
+ RenderShadowBuffers(scene);
+
// Avoid drawing the scene with the active camera twice when it's viewport is enabled
if (cam && !cam->GetViewport())
{
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp 2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp 2012-08-15 21:58:20 UTC (rev 49923)
@@ -209,6 +209,7 @@
obmat[i][j] = (float)*dobmat;
memcpy(m_lightobj.m_position, &obmat[3], sizeof(float)*4);
+ memcpy(m_lightobj.m_vector, &obmat[2], 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,
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h 2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h 2012-08-15 21:58:20 UTC (rev 49923)
@@ -39,6 +39,7 @@
enum LightType {
LIGHT_SPOT,
LIGHT_SUN,
+ LIGHT_HEMI,
LIGHT_NORMAL
};
bool m_modified;
@@ -64,6 +65,7 @@
bool m_nospecular;
float m_position[4];
+ float m_vector[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-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-08-15 21:58:20 UTC (rev 49923)
@@ -1463,6 +1463,9 @@
void RAS_OpenGLRasterizer::RenderLight(RAS_LightObject *light)
{
int bind;
+ bind = GPU_shader_get_uniform(m_light_shader, "light.type");
+ GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, (int*)(&light->m_type));
+
bind = GPU_shader_get_uniform(m_light_shader, "light.energy");
GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_energy);
@@ -1481,6 +1484,14 @@
bind = GPU_shader_get_uniform(m_light_shader, "light.position");
GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, fpos);
+ MT_Vector4 vec = MT_Vector4(light->m_vector[0], light->m_vector[1], light->m_vector[2], 0.0);
+ vec = m_viewmatrix * vec;
+ float fvec[4];
+ vec.getValue(fvec);
+
+ 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);
More information about the Bf-blender-cvs
mailing list