[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