// This is mainly to compute the radial curvature per-vertex void main(float4 position : POSITION, float3 normal : NORMAL, float3 curvatures : TEXCOORD0, float3 pdir1 : TEXCOORD1, float3 pdir2 : TEXCOORD2, float4 dcurv : TEXCOORD3, uniform float4x4 ModelViewProj, uniform float4x4 ModelViewIT, uniform float3 eyePosition, out float4 oPosition : POSITION, out float3 objectPos : TEXCOORD0, out float3 oNormal : TEXCOORD1, out float4 oKrNDotV : TEXCOORD2 ) { oPosition = mul(ModelViewProj, position); objectPos = position.xyz; oNormal = mul(ModelViewIT, float4(normal, 0)).xyz; float3 viewdir = eyePosition - position.xyz; float ndotv = (1.0f / length(viewdir)) * dot(viewdir, normal); float3 w = normalize(viewdir - normal * dot(viewdir, normal)); float u = dot(w, pdir1); float v = dot(w, pdir2); float kr = curvatures.x * u * u + curvatures.y * v * v; float u2 = u*u; float v2 = v*v; float uv = u*v; float dwII = u2*u*dcurv.x + 3*u*uv*dcurv.y + 3*uv*v*dcurv.z + v*v2*dcurv.w; float dwkr = dwII + 2 * curvatures.x * curvatures.y * ndotv/sqrt((1.0 - pow(ndotv, 2))); oKrNDotV = float4(kr, ndotv, dwkr, curvatures.x*curvatures.y>0?0:1); }