[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49928] branches/ge_harmony/source: Adding some blinn-phong specular support to the light map shading.
Daniel Stokes
kupomail at gmail.com
Thu Aug 16 04:53:04 CEST 2012
Revision: 49928
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49928
Author: kupoman
Date: 2012-08-16 02:53:04 +0000 (Thu, 16 Aug 2012)
Log Message:
-----------
Adding some blinn-phong specular support to the light map shading. It is currently fixed at a hardness value of 50, and does not support ramps. It does not match the forward render exactly. Part of this is because the specular color is extracted from the diffuse color, but there seems to be a slight position difference of the specular highlights.
Modified Paths:
--------------
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/blender/gpu/shaders/gpu_shader_material.glsl
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2012-08-15 22:59:23 UTC (rev 49927)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2012-08-16 02:53:04 UTC (rev 49928)
@@ -1026,15 +1026,20 @@
{
Material *ma= shi->mat;
GPUMaterial *mat= shi->gpumat;
- GPUNodeLink *is, *spec, *lcol, *rgb;
+ GPUNodeLink *is, *spec, *rgb, *drgb, *srgb;
- GPU_link(mat, "light_map_read", GPU_dynamic_texture(light_map, GPU_DYNAMIC_SAMPLER_2DIMAGE, ma), &is, &spec, &lcol);
+ GPU_link(mat, "light_map_read", GPU_dynamic_texture(light_map, GPU_DYNAMIC_SAMPLER_2DIMAGE, ma), &is, &spec, &drgb, &srgb);
- GPU_link(mat, "shade_mul_value", shi->refl, lcol, &rgb);
+ /* Diffuse */
+ GPU_link(mat, "shade_mul_value", shi->refl, drgb, &rgb);
add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
+ /* Specular */
+ GPU_link(mat, "shade_mul_value", shi->spec, srgb, &srgb);
+ GPU_link(mat, "shade_mul", shi->specrgb, srgb, &srgb);
+ GPU_link(mat, "shade_add", shr->spec, srgb, &shr->spec);
}
static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
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 22:59:23 UTC (rev 49927)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2012-08-16 02:53:04 UTC (rev 49928)
@@ -35,11 +35,10 @@
vec3 V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
if (light.type == SUN || light.type == HEMI)
- L = normalize(light.vector);
+ L = light.vector;
else {
L = light.position - V;
float dist = length(L);
- L = normalize(L);
if (light.falloff == INVLINEAR)
attenuation = light.dist/(light.dist + dist);
@@ -52,12 +51,17 @@
}
}
- float lambert = max(dot(N, L), 0.0);
+ vec3 H = normalize(L - V);
+
+ float lambert = max(dot(N, normalize(L)), 0.0);
if (light.type == HEMI)
lambert = 0.5*lambert + 0.5;
+ float phong = pow(max(dot(H, N), 0.0), 50.0);
+
vec3 diff = light.color * light.energy * lambert * attenuation;
+ float spec = length(light.energy) * phong * attenuation;
- gl_FragData[0] = vec4(diff, 1);
+ gl_FragData[0] = vec4(diff, spec);
}
Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl 2012-08-15 22:59:23 UTC (rev 49927)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl 2012-08-16 02:53:04 UTC (rev 49928)
@@ -1382,13 +1382,14 @@
}
/******* MATERIAL *********/
-void light_map_read(sampler2D map, out float is, out float spec, out vec3 rgb)
+void light_map_read(sampler2D map, out float is, out float spec, out vec3 drgb, out vec3 srgb)
{
vec4 data = texelFetch(map, ivec2(gl_FragCoord.xy), 0);
- rgb = data.rgb;
- is = length(rgb);
+ drgb = data.rgb;
+ is = length(drgb);
spec = data.a;
+ srgb = normalize(drgb) * spec;
}
void lamp_visibility_sun_hemi(vec3 lampvec, out vec3 lv, out float dist, out float visifac)
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 22:59:23 UTC (rev 49927)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-08-16 02:53:04 UTC (rev 49928)
@@ -1430,7 +1430,7 @@
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glBlendFunc(GL_ONE, GL_ONE);
// in case the previous material was wire
glPolygonMode(GL_FRONT, GL_FILL);
glPushMatrix(); //GL_MODELVIEW
@@ -1443,7 +1443,7 @@
glViewport(0, 0, m_width, m_height);
- glClearColor(0.0, 0.0, 0.0, 1.0);
+ glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
More information about the Bf-blender-cvs
mailing list