[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53756] branches/ge_harmony/source: Adding some basic normal mapping support to the inferred lighting ( it makes a lot of assumptions right now).

Daniel Stokes kupomail at gmail.com
Sun Jan 13 03:29:06 CET 2013


Revision: 53756
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53756
Author:   kupoman
Date:     2013-01-13 02:28:57 +0000 (Sun, 13 Jan 2013)
Log Message:
-----------
Adding some basic normal mapping support to the inferred lighting (it makes a lot of assumptions right now).

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl
    branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl	2013-01-13 00:37:32 UTC (rev 53755)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl	2013-01-13 02:28:57 UTC (rev 53756)
@@ -1,7 +1,17 @@
+#define MAX_TEX 8
+struct Texture {
+	sampler2D data;
+	bool enabled;
+};
 
+
 varying vec3 varnormal;
 varying vec3 varposition;
+varying vec4 varuv[8];
+varying vec4 vartangent;
 // varying vec2 vardepth;
+
+
 uniform float mat_id;
 
 uniform float diff_param1;
@@ -10,13 +20,35 @@
 uniform float hardness;
 uniform float spec_param;
 
+uniform Texture textures[MAX_TEX];
+
+
 void main()
 {
 	// vec3 n = normalize(varnormal + vec3(0.0, 0.0, 1.0));
 	// n = 0.5 * n + vec3(0.5, 0.5, 0.5);
 	// gl_FragData[0].rg = n.xy;
 	// gl_FragData[0].b = vardepth.x / vardepth.y;
-	gl_FragData[0].rgb = varnormal * 0.5 + vec3(0.5, 0.5, 0.5);
+	
+	int i = 0;
+	vec3 normal = varnormal;
+	vec3 data, B;
+	for (; i < MAX_TEX; i++) {
+		if (textures[i].enabled) {
+			data = texture2D(textures[i].data, varuv[i].xy).rgb;
+			data = 2.0*(data - vec3(0.5, 0.5, 0.5));
+			
+			B = vartangent.w * cross(varnormal, vartangent.xyz);
+			data = data.x*vartangent.xyz + data.y*B + data.z*varnormal;
+			data = normalize(data);
+			
+			normal = data;
+			normal = mix(normal, data, 1.0);
+			normal = normalize(normal);
+		}
+	}
+	
+	gl_FragData[0].rgb = normal * 0.5 + vec3(0.5, 0.5, 0.5);
 	gl_FragData[0].a = mat_id;
 	
 	gl_FragData[1].r = diff_param1;

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl	2013-01-13 00:37:32 UTC (rev 53755)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl	2013-01-13 02:28:57 UTC (rev 53756)
@@ -1,10 +1,26 @@
-
 varying vec3 varposition;
 varying vec3 varnormal;
+varying vec4 varuv[8];
+varying vec4 vartangent;
 // varying vec2 vardepth;
 
+
+attribute vec4 in_tangent;
+
+
 void main()
 {
+	varuv[0] = gl_MultiTexCoord0;
+	varuv[1] = gl_MultiTexCoord1;
+	varuv[2] = gl_MultiTexCoord2;
+	varuv[3] = gl_MultiTexCoord3;
+	varuv[4] = gl_MultiTexCoord4;
+	varuv[5] = gl_MultiTexCoord5;
+	varuv[6] = gl_MultiTexCoord6;
+	varuv[7] = gl_MultiTexCoord7;
+	
+	vartangent = in_tangent;
+	
 	vec4 co = gl_ModelViewMatrix * gl_Vertex;
 
 	varposition = co.xyz;

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-01-13 00:37:32 UTC (rev 53755)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-01-13 02:28:57 UTC (rev 53756)
@@ -32,6 +32,7 @@
 // ------------------------------------
 #include "DNA_object_types.h"
 #include "DNA_material_types.h"
+#include "DNA_texture_types.h"
 #include "DNA_image_types.h"
 #include "DNA_meshdata_types.h"
 #include "BKE_mesh.h"
@@ -550,7 +551,17 @@
 	TCachingInfo& cachingInfo
 	)const
 {
-	if (GLEW_ARB_shader_objects && (mShader && mShader->Ok())) {
+	if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE) {		
+		if (mPass++ == 0) {
+			ActivateTexGen(rasty);
+			return true;
+		}
+		else {
+			mPass = 0;
+			return false;
+		}
+	}
+	else if (GLEW_ARB_shader_objects && (mShader && mShader->Ok())) {
 		if ((mPass++) < mShader->getNumPass() ) {
 			ActivatShaders(rasty, cachingInfo);
 			return true;
@@ -604,6 +615,11 @@
 	if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE)
 	{
 		Material *mat = mMaterial->material;
+		MTex *mtex;
+		Tex *tex;
+		GPUTexture *gpu_tex;
+		char name[50];
+		float texco[3];
 		int bind;
 		GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_PREPASS);
 
@@ -646,6 +662,33 @@
 		else if (mat->spec_shader == MA_SPEC_TOON)
 			spec_param = mat->param[3] / 10.0;
 		GPU_shader_uniform_vector(shader, bind, 1, 1, &spec_param);
+
+		int slot = 0;
+		for (int i = 0; i < MAX_MTEX; i++) {
+			int f = 0, t = 1;
+
+			mtex = mat->mtex[i];
+			if (!mtex) continue;
+
+			tex = mtex->tex;
+			if (!tex) continue;
+
+			if (mtex->mapto & MAP_NORM && tex->type == TEX_IMAGE) {
+				sprintf(name, "textures[%d].data", slot);
+				bind = GPU_shader_get_uniform(shader, name);
+				gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, rasty->GetTime(), 1);
+				GPU_texture_bind(gpu_tex, slot);
+				GPU_shader_uniform_texture(shader, bind, gpu_tex);
+			}
+			else
+				continue;
+
+			sprintf(name, "textures[%d].enabled", slot);
+			bind = GPU_shader_get_uniform(shader, name);
+			GPU_shader_uniform_ivector(shader, bind, 1, 1, &t);
+
+			slot++;
+		}
 	}
 	if (mShader && GLEW_ARB_shader_objects) {
 		mShader->Update(ms, rasty);
@@ -699,7 +742,8 @@
 
 void KX_BlenderMaterial::ActivateTexGen(RAS_IRasterizer *ras) const
 {
-	if (ras->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) {
+	if (ras->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED ||
+		ras->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE) {
 		ras->SetAttribNum(0);
 		if (mShader && GLEW_ARB_shader_objects) {
 			if (mShader->GetAttribute() == BL_Shader::SHD_TANGENT) {
@@ -708,6 +752,10 @@
 				ras->SetAttribNum(2);
 			}
 		}
+		else if (ras->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE) {
+			ras->SetAttrib(RAS_IRasterizer::RAS_TEXTANGENT, 1);
+			ras->SetAttribNum(1);
+		}
 
 		ras->SetTexCoordNum(mMaterial->num_enabled);
 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2013-01-13 00:37:32 UTC (rev 53755)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2013-01-13 02:28:57 UTC (rev 53756)
@@ -632,7 +632,7 @@
 		ms.m_bDisplayList = false;
 	else if (!ms.m_DisplayList && rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW)
 		ms.m_bDisplayList = false;
-	else if (!ms.m_DisplayList && rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE)
+	else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE)
 		ms.m_bDisplayList = false;
 	else if (IsZSort())
 		ms.m_bDisplayList = false;




More information about the Bf-blender-cvs mailing list