[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