[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34700] trunk/blender/source/blender/gpu/ intern: GLSL shader part
M.G. Kishalmi
lmg at kishalmi.net
Mon Feb 7 22:57:40 CET 2011
Revision: 34700
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34700
Author: lmg
Date: 2011-02-07 21:57:40 +0000 (Mon, 07 Feb 2011)
Log Message:
-----------
GLSL shader part
bump-mapping update to properly support
multiple textures in different bump-spaces.
Modified Paths:
--------------
trunk/blender/source/blender/gpu/intern/gpu_material.c
trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl
trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl.c
Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c 2011-02-07 21:55:54 UTC (rev 34699)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c 2011-02-07 21:57:40 UTC (rev 34700)
@@ -892,6 +892,8 @@
char *lastuvname = NULL;
float one = 1.0f, norfac, ofs[3];
int tex_nr, rgbnor, talpha;
+ int init_done = 0, iBumpSpacePrev;
+ GPUNodeLink *vNorg, *vNacc, *fPrevMagnitude;
GPU_link(mat, "set_value", GPU_uniform(&one), &stencil);
@@ -1055,12 +1057,13 @@
} else if( mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) {
/* ntap bumpmap image */
+ int iBumpSpace;
float hScale = 0.1f; // compatibility adjustment factor for all bumpspace types
float hScaleTex = 13.0f; // factor for scaling texspace bumps
GPUNodeLink *surf_pos = GPU_builtin(GPU_VIEW_POSITION);
- GPUNodeLink *vR1, *vR2, *fDet;
- GPUNodeLink *dBs, *dBt, *vN;
+ GPUNodeLink *vR1, *vR2;
+ GPUNodeLink *dBs, *dBt, *fDet;
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
hScale = hScaleTex;
@@ -1070,16 +1073,50 @@
if(GPU_link_changed(stencil))
GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
+ if( !init_done ) {
+ // copy shi->vn to vNorg and vNacc, set magnitude to 1
+ GPU_link(mat, "mtex_bump_normals_init", shi->vn, &vNorg, &vNacc, &fPrevMagnitude);
+ iBumpSpacePrev = 0;
+ init_done = 1;
+ }
+
+ // find current bump space
if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
- GPU_link( mat, "mtex_bump_init_objspace",
- surf_pos, shi->vn,
- GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_OBJECT_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
- &vR1, &vR2, &fDet, &vN );
+ iBumpSpace = 1;
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ iBumpSpace = 2;
else
- GPU_link( mat, "mtex_bump_init_viewspace",
- surf_pos, shi->vn,
- &vR1, &vR2, &fDet, &vN );
+ iBumpSpace = 4; // ViewSpace
+ // re-initialize if bump space changed
+ if( iBumpSpacePrev != iBumpSpace ) {
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ GPU_link( mat, "mtex_bump_init_objspace",
+ surf_pos, vNorg,
+ GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_OBJECT_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ GPU_link( mat, "mtex_bump_init_texturespace",
+ surf_pos, vNorg,
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ else
+ GPU_link( mat, "mtex_bump_init_viewspace",
+ surf_pos, vNorg,
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ iBumpSpacePrev = iBumpSpace;
+ }
+
+
if( mtex->texflag & MTEX_3TAP_BUMP )
GPU_link( mat, "mtex_bump_tap3",
texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
@@ -1089,6 +1126,7 @@
texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
&dBs, &dBt );
+
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
float ima_x= 512.0f, ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
@@ -1096,12 +1134,13 @@
ima_x= ibuf->x; ima_y= ibuf->y;
GPU_link( mat, "mtex_bump_apply_texspace",
- fDet, dBs, dBt, vR1, vR2, vN, GPU_image(tex->ima, &tex->iuser), texco,
- GPU_uniform(&ima_x), GPU_uniform(&ima_y), &shi->vn );
+ fDet, dBs, dBt, vR1, vR2,
+ GPU_image(tex->ima, &tex->iuser), texco, GPU_uniform(&ima_x), GPU_uniform(&ima_y), vNacc,
+ &vNacc, &shi->vn );
} else
GPU_link( mat, "mtex_bump_apply",
- fDet, dBs, dBt, vR1, vR2, vN,
- &shi->vn );
+ fDet, dBs, dBt, vR1, vR2, vNacc,
+ &vNacc, &shi->vn );
}
}
Modified: trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl 2011-02-07 21:55:54 UTC (rev 34699)
+++ trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl 2011-02-07 21:57:40 UTC (rev 34700)
@@ -1102,16 +1102,11 @@
normal = 2.0*(vec3(color.r, -color.g, color.b) - vec3(0.5, -0.5, 0.5));
}
-void mtex_bump_init_viewspace( vec3 surf_pos, vec3 surf_norm,
- out vec3 vR1, out vec3 vR2, out float fDet, out vec3 vN )
+void mtex_bump_normals_init( vec3 vN, out vec3 vNorg, out vec3 vNacc, out float fPrevMagnitude )
{
- vec3 vSigmaS = dFdx( surf_pos );
- vec3 vSigmaT = dFdy( surf_pos );
- vN = surf_norm; /* normalized interpolated vertex normal */
-
- vR1 = cross( vSigmaT , vN );
- vR2 = cross( vN , vSigmaS ) ;
- fDet = dot ( vSigmaS , vR1 );
+ vNorg = vN;
+ vNacc = vN;
+ fPrevMagnitude = 1.0;
}
/** helper method to extract the upper left 3x3 matrix from a 4x4 matrix */
@@ -1125,27 +1120,68 @@
}
void mtex_bump_init_objspace( vec3 surf_pos, vec3 surf_norm,
- mat4 mView, mat4 mViewInv, mat4 mObj, mat4 mObjInv,
- out vec3 vR1, out vec3 vR2, out float fDet, out vec3 vN )
+ mat4 mView, mat4 mViewInv, mat4 mObj, mat4 mObjInv,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
{
mat3 obj2view = to_mat3(mView * mObj);
mat3 view2obj = to_mat3(mObjInv * mViewInv);
vec3 vSigmaS = view2obj * dFdx( surf_pos );
vec3 vSigmaT = view2obj * dFdy( surf_pos );
- vN = normalize( surf_norm * obj2view );
+ vec3 vN = normalize( surf_norm * obj2view );
vR1 = cross( vSigmaT , vN );
vR2 = cross( vN , vSigmaS ) ;
fDet = dot ( vSigmaS , vR1 );
- /* transform back */
+ /* pretransform vNacc (in mtex_bump_apply) using the inverse transposed */
vR1 = vR1 * view2obj;
vR2 = vR2 * view2obj;
vN = vN * view2obj;
+
+ float fMagnitude = abs(fDet) * length(vN);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+void mtex_bump_init_texturespace( vec3 surf_pos, vec3 surf_norm,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ vec3 vSigmaS = dFdx( surf_pos );
+ vec3 vSigmaT = dFdy( surf_pos );
+ vec3 vN = surf_norm; /* normalized interpolated vertex normal */
+
+ vR1 = normalize( cross( vSigmaT , vN ) );
+ vR2 = normalize( cross( vN , vSigmaS ) );
+ fDet = (dot( vSigmaS , vR1 ) < 0)? (-1): 1;
+
+ float fMagnitude = abs(fDet);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
}
+void mtex_bump_init_viewspace( vec3 surf_pos, vec3 surf_norm,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ vec3 vSigmaS = dFdx( surf_pos );
+ vec3 vSigmaT = dFdy( surf_pos );
+ vec3 vN = surf_norm; /* normalized interpolated vertex normal */
+
+ vR1 = cross( vSigmaT , vN );
+ vR2 = cross( vN , vSigmaS ) ;
+ fDet = dot ( vSigmaS , vR1 );
+
+ float fMagnitude = abs(fDet);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
void mtex_bump_tap3( vec3 texco, sampler2D ima, float hScale,
out float dBs, out float dBt )
{
@@ -1185,16 +1221,18 @@
dBt = hScale * (Hu - Hd);
}
-void mtex_bump_apply( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2, vec3 vN,
- out vec3 perturbed_norm )
+void mtex_bump_apply( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2, vec3 vNacc_in,
+ out vec3 vNacc_out, out vec3 perturbed_norm )
{
vec3 vSurfGrad = sign(fDet) * ( dBs * vR1 + dBt * vR2 );
- perturbed_norm = normalize( abs(fDet) * vN - vSurfGrad );
+ vNacc_out = vNacc_in - vSurfGrad;
+ perturbed_norm = normalize( vNacc_out );
}
-void mtex_bump_apply_texspace( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2, vec3 vN,
- sampler2D ima, vec3 texco, float ima_x, float ima_y, out vec3 perturbed_norm )
+void mtex_bump_apply_texspace( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2,
+ sampler2D ima, vec3 texco, float ima_x, float ima_y, vec3 vNacc_in,
+ out vec3 vNacc_out, out vec3 perturbed_norm )
{
vec2 TexDx = dFdx(texco.xy);
vec2 TexDy = dFdy(texco.xy);
@@ -1202,8 +1240,9 @@
vec3 vSurfGrad = sign(fDet) * (
dBs / length( vec2(ima_x*TexDx.x, ima_y*TexDx.y) ) * normalize(vR1) +
dBt / length( vec2(ima_x*TexDy.x, ima_y*TexDy.y) ) * normalize(vR2) );
- perturbed_norm = normalize( vN - vSurfGrad );
-
+
+ vNacc_out = vNacc_in - vSurfGrad;
+ perturbed_norm = normalize( vNacc_out );
}
void mtex_negate_texnormal(vec3 normal, out vec3 outnormal)
Modified: trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl.c 2011-02-07 21:55:54 UTC (rev 34699)
+++ trunk/blender/source/blender/gpu/intern/gpu_shader_material.glsl.c 2011-02-07 21:57:40 UTC (rev 34700)
@@ -1,822 +1,864 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 37417;
+int datatoc_gpu_shader_material_glsl_size= 38764;
char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,116, 32,101,120,
-112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,119,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list