[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54643] branches/ge_harmony/source: Changing the light shader to use the bgl naming convention established in the 2D filter system .
Daniel Stokes
kupomail at gmail.com
Tue Feb 19 00:52:20 CET 2013
Revision: 54643
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54643
Author: kupoman
Date: 2013-02-18 23:52:19 +0000 (Mon, 18 Feb 2013)
Log Message:
-----------
Changing the light shader to use the bgl naming convention established in the 2D filter system. This provides a more consistent shader API. Also appending the magic uniform to the bounds uniform to pass in less uniforms, and to get rid of that variable name.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
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 2013-02-18 23:41:28 UTC (rev 54642)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2013-02-18 23:52:19 UTC (rev 54643)
@@ -43,36 +43,29 @@
varying vec3 varposition;
-uniform Light light;
+uniform Light bgl_Light;
-uniform sampler2D prepass1;
-uniform sampler2D prepass2;
-uniform sampler2D depth_texture;
+uniform sampler2D bgl_PrepassTarget0;
+uniform sampler2D bgl_PrepassTarget1;
+uniform sampler2D bgl_DepthTexture;
-uniform vec2 magic;
// uniform mat4 inv_proj_matrix;
-uniform vec2 bounds;
+uniform vec4 bgl_Bounds;
void main()
{
vec3 L;
float attenuation = 1.0;
- vec2 texcoord = gl_FragCoord.xy/bounds.xy;
- vec4 gbuffer = texture2D(prepass1, texcoord);
- vec4 mbuffer = texture2D(prepass2, texcoord);
- // float depth = gbuffer.b;
+ vec2 texcoord = gl_FragCoord.xy/bgl_Bounds.xy;
+ vec4 gbuffer = texture2D(bgl_PrepassTarget0, texcoord);
+ vec4 mbuffer = texture2D(bgl_PrepassTarget1, texcoord);
vec3 N = gbuffer.rgb * 2.0 - vec3(1.0, 1.0, 1.0);
- // vec3 N = vec3(gbuffer.rg, 0.0);
- // N = 2 * (N - vec3(0.5, 0.5, 0.0));
- // float z = sqrt(1.0 - pow(length(N.xy), 2.0));
- // N = vec3(2.0*z*N.x, 2.0*z*N.y, 2.0*z*z -1.0);
- // N = normalize(N);
- float depth = texture2D(depth_texture, texcoord).r;
+ float depth = texture2D(bgl_DepthTexture, texcoord).r;
vec3 viewray = vec3(varposition.xy/varposition.z, 1.0);
- depth = magic.y / (depth - magic.x);
+ depth = bgl_Bounds.w / (depth - bgl_Bounds.z);
vec3 V = viewray * -depth;
// vec3 V;
@@ -87,30 +80,30 @@
vec3 view = (gl_ProjectionMatrix[3][3] == 0.0)? normalize(-V): vec3(0.0, 0.0, -1.0);
// Light position/orientation and attenuation
- if (light.type == SUN || light.type == HEMI)
- L = light.vector;
+ if (bgl_Light.type == SUN || bgl_Light.type == HEMI)
+ L = bgl_Light.vector;
else {
- L = light.position - V;
+ L = bgl_Light.position - V;
float dist = length(L);
- if (light.falloff == INVLINEAR)
- attenuation = light.dist/(light.dist + dist);
- else if (light.falloff == INVSQUARE)
- attenuation = light.dist/(light.dist + dist*dist);
- else if (light.falloff == SLIDERS) {
- float distkw = light.dist * light.dist;
- attenuation = light.dist/(light.dist + light.att[0]*dist);
- attenuation *= distkw/(distkw + light.att[1]*dist*dist);
+ if (bgl_Light.falloff == INVLINEAR)
+ attenuation = bgl_Light.dist/(bgl_Light.dist + dist);
+ else if (bgl_Light.falloff == INVSQUARE)
+ attenuation = bgl_Light.dist/(bgl_Light.dist + dist*dist);
+ else if (bgl_Light.falloff == SLIDERS) {
+ float distkw = bgl_Light.dist * bgl_Light.dist;
+ attenuation = bgl_Light.dist/(bgl_Light.dist + bgl_Light.att[0]*dist);
+ attenuation *= distkw/(distkw + bgl_Light.att[1]*dist*dist);
}
- attenuation *= max((light.dist - dist), 0.0)/light.dist;
+ attenuation *= max((bgl_Light.dist - dist), 0.0)/bgl_Light.dist;
}
L = normalize(L);
- if (light.type == SPOT) {
+ if (bgl_Light.type == SPOT) {
float inpr;
- lamp_visibility_spot_circle(light.vector, L, inpr);
- lamp_visibility_spot(light.spotsize, light.spotblend, inpr, attenuation, attenuation);
+ lamp_visibility_spot_circle(bgl_Light.vector, L, inpr);
+ lamp_visibility_spot(bgl_Light.spotsize, bgl_Light.spotblend, inpr, attenuation, attenuation);
}
attenuation = (attenuation < 0.001) ? 0.0 : attenuation;
@@ -128,7 +121,7 @@
float diff_param2 = mbuffer.g * 10.0;
#endif
float lambert = max(dot(N, L), 0.0);
- if (light.type == HEMI)
+ if (bgl_Light.type == HEMI)
diff_term = 0.5*lambert + 0.5;
#ifdef ALL_SHADERS
else if (diff_shader == DIFF_LAMBERT)
@@ -152,7 +145,7 @@
float spec_param = mbuffer.a * 10.0;
#endif
float spec_term = 0.0;
- if (light.type == HEMI)
+ if (bgl_Light.type == HEMI)
shade_hemi_spec(N, L, view, 1.0, hardness, 1.0, spec_term);
#ifdef ALL_SHADERS
else if (spec_shader == SPEC_PHONG)
@@ -174,9 +167,8 @@
#endif
// Factor in light properties
- vec3 diff = light.color * light.energy * diff_term * attenuation;
- float spec = length(light.energy) * spec_term * attenuation;
- // diff = mix(diff, vec3(0.5, 1.0, 0.0), 0.01);
+ vec3 diff = bgl_Light.color * bgl_Light.energy * diff_term * attenuation;
+ float spec = length(bgl_Light.energy) * spec_term * attenuation;
gl_FragData[0] = vec4(diff, spec);
}
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-18 23:41:28 UTC (rev 54642)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-02-18 23:52:19 UTC (rev 54643)
@@ -1437,38 +1437,40 @@
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
- bind = GPU_shader_get_uniform(m_light_shader, "prepass1");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget0");
glUniform1iARB(bind, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[2]);
- bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget1");
glUniform1iARB(bind, 1);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[3]);
- bind = GPU_shader_get_uniform(m_light_shader, "prepass3");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget2");
glUniform1iARB(bind, 3);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
- bind = GPU_shader_get_uniform(m_light_shader, "depth_texture");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_DepthTexture");
glUniform1iARB(bind, 2);
- float magic[2];
- magic[0] = camera->m_clipend / (camera->m_clipend - camera->m_clipstart);
- magic[1] = (-camera->m_clipend * camera->m_clipstart) / (camera->m_clipend - camera->m_clipstart);
- bind = GPU_shader_get_uniform(m_light_shader, "magic");
- GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, magic);
+ //float magic[2];
+ //magic[0] = camera->m_clipend / (camera->m_clipend - camera->m_clipstart);
+ //magic[1] = (-camera->m_clipend * camera->m_clipstart) / (camera->m_clipend - camera->m_clipstart);
+ //bind = GPU_shader_get_uniform(m_light_shader, "magic");
+ //GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, magic);
float inv_proj_matrix[16];
m_projmatrix.inverse().getValue(inv_proj_matrix);
bind = GPU_shader_get_uniform(m_light_shader, "inv_proj_matrix");
GPU_shader_uniform_vector(m_light_shader, bind, 16, 1, inv_proj_matrix);
- float bounds[2] = {(float)m_width, (float)m_height};
- bind = GPU_shader_get_uniform(m_light_shader, "bounds");
- GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, bounds);
+ float bounds[4] = {(float)m_width, (float)m_height, 0.0, 0.0};
+ bounds[2] = camera->m_clipend / (camera->m_clipend - camera->m_clipstart);
+ bounds[3] = (-camera->m_clipend * camera->m_clipstart) / (camera->m_clipend - camera->m_clipstart);
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Bounds");
+ GPU_shader_uniform_vector(m_light_shader, bind, 4, 1, bounds);
return 1;
}
@@ -1478,24 +1480,24 @@
if (!m_light_shader) return;
int bind;
- bind = GPU_shader_get_uniform(m_light_shader, "light.type");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_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.falloff");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.falloff");
GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, (int*)(&light->m_falloff));
float att[2] = {light->m_att1, light->m_att2};
- bind = GPU_shader_get_uniform(m_light_shader, "light.att");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.att");
GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, att);
- bind = GPU_shader_get_uniform(m_light_shader, "light.energy");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_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");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.color");
GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, color);
- bind = GPU_shader_get_uniform(m_light_shader, "light.dist");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.dist");
GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_distance);
MT_Vector4 pos = MT_Vector4(light->m_position);
@@ -1503,7 +1505,7 @@
float fpos[4];
pos.getValue(fpos);
- bind = GPU_shader_get_uniform(m_light_shader, "light.position");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_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);
@@ -1511,15 +1513,15 @@
float fvec[4];
vec.getValue(fvec);
- bind = GPU_shader_get_uniform(m_light_shader, "light.vector");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.vector");
GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, fvec);
float spotsi = cosf((float)M_PI * light->m_spotsize/360.0f);
- bind = GPU_shader_get_uniform(m_light_shader, "light.spotsize");
+ bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.spotsize");
GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &spotsi);
float spotbl = (1.0f - spotsi/2.0f) * light->m_spotblend;
- bind = GPU_shader_get_uniform(m_light_shader, "light.spotblend");
+ 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_type == RAS_LightObject::LIGHT_NORMAL) {
More information about the Bf-blender-cvs
mailing list