//**************************************************************************************// // // // BUMP - NORMAL - OFFSET/PARALLAX - RELIEF // // MAPPING COMES NOW // // // //**************************************************************************************// // General functions // Expand a range-compressed vector float3 expand(float3 v) { return (v - 0.5) * 2; } void Offset_Vert( float4 position : POSITION, float3 normal : NORMAL, float2 uv : TEXCOORD0, float3 tangent : TEXCOORD1, out float4 oPosition : POSITION, out float2 oUv : TEXCOORD0, out float3 oLightDir : TEXCOORD1, out float3 oEyeDir : TEXCOORD2, out float3 oHalfAngle : TEXCOORD3, uniform float scale, uniform float4 lightPosition, // object space uniform float3 eyePosition, // object space uniform float4x4 worldviewproj) { //why normalize lightDir if don't normalize eyeDir? both will be mul-ed //by matrix! oPosition = mul(worldviewproj , position); oUv = uv * scale; float3 eyeDir = eyePosition - position.xyz; float3 binormal = cross(tangent, normal); float3x3 rotation = float3x3(tangent, binormal, normal); eyeDir = normalize(mul(rotation, eyeDir)); float3 lightDir = normalize(lightPosition.xyz - (position * lightPosition.w)); lightDir = normalize(mul(rotation, lightDir)); oHalfAngle = normalize(eyeDir + lightDir); oLightDir = lightDir; oEyeDir = eyeDir; //changing these variables to calculate with output value and not use them doesn't yield any //boost } void Offset_Frag( float2 uv : TEXCOORD0, float3 lightVec : TEXCOORD1, float3 eyeDir : TEXCOORD2, float3 halfAngle: TEXCOORD3, out float4 oColor : COLOR, uniform float4 lightDiffuse, uniform float4 lightSpecular, uniform float exponent, uniform float4 scaleBias, uniform sampler2D normalHeightMap : register(s0) ) { float height = tex2D(normalHeightMap, uv).a; float scale = scaleBias.x; float bias = scaleBias.y; float displacement = (height * scale) + bias; float3 uv2 = float3(uv, 1); float2 newTexCoord = ((eyeDir * displacement) + uv2).xy; float3 bumpVec = expand(tex2D(normalHeightMap, newTexCoord ).xyz); float3 N = normalize(bumpVec); float NdotL = dot(normalize(lightVec), N); float NdotH = dot(normalize(halfAngle), N); float4 Lit = lit(NdotL,NdotH,exponent); oColor = lightDiffuse * Lit.y + lightSpecular * Lit.z; //do I need to normalize here the normal (=bumpvec)? } void Offset_Lim3_Vert( float4 position : POSITION, float3 normal : NORMAL, float2 uv : TEXCOORD0, float3 tangent : TEXCOORD1, out float4 oPosition : POSITION, out float2 oUv : TEXCOORD0, out float3 oLightDir0 : TEXCOORD1, out float3 oLightDir1 : TEXCOORD2, out float3 oLightDir2 : TEXCOORD3, out float3 oHalfAngle0 : TEXCOORD4, out float3 oHalfAngle1 : TEXCOORD5, out float3 oHalfAngle2 : TEXCOORD6, out float3 oEyeDir : TEXCOORD7, uniform float scale, uniform float4 lightPosition0, // object space uniform float4 lightPosition1, // object space uniform float4 lightPosition2, // object space uniform float3 eyePosition, // object space uniform float4x4 worldviewproj ) { oPosition = mul(worldviewproj , position); oUv = uv * scale; float3 eyeDir = eyePosition - position.xyz; float3 binormal = cross(tangent, normal); float3x3 rotation = float3x3(tangent, binormal, normal); eyeDir = normalize(mul(rotation, eyeDir)); oEyeDir = eyeDir; float3 temp_lightDir = normalize(lightPosition0.xyz - (position * lightPosition0.w)); oLightDir0 = normalize(mul(rotation, temp_lightDir)); oHalfAngle0 = normalize(eyeDir + oLightDir0); temp_lightDir = normalize(lightPosition1.xyz - (position * lightPosition1.w)); oLightDir1 = normalize(mul(rotation, temp_lightDir)); oHalfAngle1 = normalize(eyeDir + oLightDir1); temp_lightDir = normalize(lightPosition2.xyz - (position * lightPosition2.w)); oLightDir2 = normalize(mul(rotation, temp_lightDir)); oHalfAngle2 = normalize(eyeDir + oLightDir2); } void Offset_Lim3_Frag( float2 uv : TEXCOORD0, float3 LightDir0 : TEXCOORD1, float3 LightDir1 : TEXCOORD2, float3 LightDir2 : TEXCOORD3, float3 HalfAngle0 : TEXCOORD4, float3 HalfAngle1 : TEXCOORD5, float3 HalfAngle2 : TEXCOORD6, #if _OFFSET_LIM float3 EyeDir : TEXCOORD7, #endif out float4 oColor : COLOR, uniform float4 lightDiffuse0, uniform float4 lightDiffuse1, uniform float4 lightDiffuse2, uniform float4 lightSpecular0, uniform float4 lightSpecular1, uniform float4 lightSpecular2, uniform float exponent0, // uniform float exponent1, // uniform float exponent2, uniform float4 ambient, #if _OFFSET_LIM uniform float4 scaleBias, #endif uniform sampler2D normalHeightMap, //: register(s0) uniform sampler2D diffuseMap ) { #if _OFFSET_LIM float height = tex2D(normalHeightMap, uv).a; float scale = scaleBias.x; float bias = scaleBias.y; float displacement = (height * scale) + bias; float3 uv2 = float3(uv, 1); float2 newTexCoord = ((EyeDir * displacement) + uv2).xy; float3 bumpVec = expand(tex2D(normalHeightMap, newTexCoord ).xyz); #else float3 newTexCoord = float3(uv.xy, 1); float3 bumpVec = expand(tex2D(normalHeightMap, newTexCoord ).xyz); #endif float3 diffusetex = tex2D(diffuseMap, newTexCoord).xyz; float3 N = normalize(bumpVec); float NdotL0 = dot(normalize(LightDir0), N); float NdotH0 = dot(normalize(HalfAngle0), N); float4 Lit0 = lit(NdotL0,NdotH0,exponent0); float NdotL1 = dot(normalize(LightDir1), N); float NdotH1 = dot(normalize(HalfAngle1), N); float4 Lit1 = lit(NdotL1,NdotH1,exponent0); float NdotL2 = dot(normalize(LightDir2), N); float NdotH2 = dot(normalize(HalfAngle2), N); float4 Lit2 = lit(NdotL2,NdotH2,exponent0); oColor = float4(diffusetex,1) * (lightDiffuse0 * Lit0.y + lightDiffuse1 * Lit1.y + lightDiffuse2 * Lit2.y) + lightSpecular0 * Lit0.z + lightSpecular1 * Lit1.z + lightSpecular2 * Lit2.z + ambient; }