[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54831] branches/ge_harmony/source: Adding support for simple and variance shadows to the inferred lighting.
Daniel Stokes
kupomail at gmail.com
Mon Feb 25 03:23:39 CET 2013
Revision: 54831
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54831
Author: kupoman
Date: 2013-02-25 02:23:38 +0000 (Mon, 25 Feb 2013)
Log Message:
-----------
Adding support for simple and variance shadows to the inferred lighting. The impact of the bias setting does not appear to be one-to-one with the forward rendering and may require further investigation.
Also making sure all prepass targets are available to the light shader.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/GPU_material.h
branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
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_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/GPU_material.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_material.h 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/GPU_material.h 2013-02-25 02:23:38 UTC (rev 54831)
@@ -242,6 +242,8 @@
void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[4][4], int *winsize, float winmat[4][4]);
void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
int GPU_lamp_shadow_buffer_type(GPULamp *lamp);
+int GPU_lamp_shadow_buffer_get(GPULamp *lamp);
+float* GPU_lamp_perspective_get(GPULamp *lamp);
void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[4][4]);
void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy);
Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c 2013-02-25 02:23:38 UTC (rev 54831)
@@ -779,7 +779,9 @@
int GPU_texture_opengl_bindcode(GPUTexture *tex)
{
- return tex->bindcode;
+ if (tex)
+ return tex->bindcode;
+ return 0;
}
GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex)
Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2013-02-25 02:23:38 UTC (rev 54831)
@@ -2112,6 +2112,21 @@
return -1;
}
+int GPU_lamp_shadow_buffer_get(GPULamp *lamp)
+{
+ if (lamp->la->shadowmap_type == LA_SHADMAP_VARIANCE)
+ return GPU_texture_opengl_bindcode(lamp->tex);
+ else if (lamp->tex)
+ return GPU_texture_opengl_bindcode(lamp->tex);
+ else
+ return 0;
+}
+
+float* GPU_lamp_perspective_get(GPULamp *lamp)
+{
+ return &(lamp->dynpersmat[0][0]);
+}
+
/* export the GLSL shader */
GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)
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-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2013-02-25 02:23:38 UTC (rev 54831)
@@ -26,6 +26,10 @@
#define SPEC_TOON 3
#define SPEC_WARDISO 4
+#define SHADOW_NONE 0
+#define SHADOW_SIMPLE 1
+#define SHADOW_VARIANCE 2
+
#define LN_511 6.23636959
struct Light {
@@ -39,6 +43,13 @@
vec3 vector;
float spotsize;
float spotblend;
+
+ int shadowtype;
+ sampler2DShadow shadowbuffer;
+ sampler2D shadowbuffercol;
+ float shadowbias;
+ float shadowbleed;
+ mat4 shadowpersmat;
};
varying vec3 varposition;
@@ -170,6 +181,19 @@
shade_phong_spec(N, L, view, 1.0, hardness);
#endif
+ if (bgl_Light.shadowtype == SHADOW_SIMPLE) {
+ float shadfac;
+ test_shadowbuf(V, bgl_Light.shadowbuffer, bgl_Light.shadowpersmat, bgl_Light.shadowbias,
+ diff_term, shadfac);
+ diff_term *= shadfac;
+ }
+ else if (bgl_Light.shadowtype == SHADOW_VARIANCE) {
+ float shadfac;
+ test_shadowbuf_vsm(V, bgl_Light.shadowbuffercol, bgl_Light.shadowpersmat, bgl_Light.shadowbias,
+ bgl_Light.shadowbleed, diff_term, shadfac);
+ diff_term *= shadfac;
+ }
+
// Factor in light properties
vec3 diff = bgl_Light.color * bgl_Light.energy * diff_term * attenuation;
float spec = length(bgl_Light.energy) * spec_term * attenuation;
Modified: branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2013-02-25 02:23:38 UTC (rev 54831)
@@ -1869,6 +1869,10 @@
lightobj.m_nodiffuse = (la->mode & LA_NO_DIFF) != 0;
lightobj.m_nospecular = (la->mode & LA_NO_SPEC) != 0;
+
+ lightobj.m_shadowtype = la->shadowmap_type;
+ lightobj.m_shadowbias = la->bias;
+ lightobj.m_shadowbleed = la->bleedbias;
bool glslmat = converter->GetGLSLMaterials();
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp 2013-02-25 02:23:38 UTC (rev 54831)
@@ -213,6 +213,9 @@
memcpy(m_lightobj.m_vector, &obmat[2], sizeof(float)*3);
memcpy(m_lightobj.m_obmat, obmat, sizeof(float)*16);
+ m_lightobj.m_shadowbuffer = GPU_lamp_shadow_buffer_get(lamp);
+ m_lightobj.m_shadowpersmat = GPU_lamp_perspective_get(lamp);
+
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_LightObject.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h 2013-02-25 02:23:38 UTC (rev 54831)
@@ -75,6 +75,12 @@
float m_position[4];
float m_vector[3];
float m_obmat[4][4];
+
+ int m_shadowbuffer;
+ int m_shadowtype;
+ float m_shadowbias;
+ float m_shadowbleed;
+ float* m_shadowpersmat;
};
#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 2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-02-25 02:23:38 UTC (rev 54831)
@@ -56,6 +56,7 @@
#include "BL_Material.h"
#include "DNA_image_types.h"
+#include "DNA_lamp_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_material_types.h"
#include "DNA_texture_types.h"
@@ -1438,25 +1439,30 @@
GPU_shader_bind(m_light_shader);
- glActiveTexture(GL_TEXTURE0);
+ glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget0");
- glUniform1iARB(bind, 0);
+ glUniform1iARB(bind, 1);
- glActiveTexture(GL_TEXTURE1);
+ glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[2]);
bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget1");
- glUniform1iARB(bind, 1);
+ glUniform1iARB(bind, 2);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[3]);
bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget2");
glUniform1iARB(bind, 3);
- glActiveTexture(GL_TEXTURE2);
+ glActiveTexture(GL_TEXTURE4);
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[4]);
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget3");
+ glUniform1iARB(bind, 4);
+
+ glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
bind = GPU_shader_get_uniform(m_light_shader, "bgl_DepthTexture");
- glUniform1iARB(bind, 2);
+ glUniform1iARB(bind, 0);
float inv_proj_matrix[16];
m_projmatrix.inverse().getValue(inv_proj_matrix);
@@ -1521,6 +1527,36 @@
bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.spotblend");
GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &spotbl);
+ if (light->m_shadowbuffer) {
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowtype");
+ int type = light->m_shadowtype + 1;;
+ GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, &type);
+
+ glActiveTexture(GL_TEXTURE5);
+ glBindTexture(GL_TEXTURE_2D, light->m_shadowbuffer);
+ if (light->m_shadowtype == LA_SHADMAP_VARIANCE) {
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbuffercol");
+ }
+ else {
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbuffer");
+ }
+ glUniform1iARB(bind, 5);
+
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbias");
+ float bias = 0.02f * light->m_shadowbias;
+ GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &bias);
+
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbleed");
+ GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_shadowbleed);
+
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowpersmat");
+ GPU_shader_uniform_vector(m_light_shader, bind, 16, 1, light->m_shadowpersmat);
+ }
+ else {
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowtype");
+ int type = 0;
+ GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, &type);
+ }
if (light->m_type == RAS_LightObject::LIGHT_NORMAL) {
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
More information about the Bf-blender-cvs
mailing list