Novetus_src/clients/2009L/content/fonts/materials/programs/include/ice.cgh

174 lines
4.5 KiB
Plaintext

#ifdef FXCOMPOSER_VERSION // in fxcompser editor
#include "include/common.cgh"
#else
#include "common.cgh"
#endif
/************* DATA STRUCTS **************/
struct appdataTangent {
float3 Position : POSITION;
float4 IceColor : COLOR;
float2 ModelUV : TEXCOORD0;
float3 IcePos : TEXCOORD1;
float2 SurfaceUV: TEXCOORD2;
float3 Normal : NORMAL;
float3 Tangent : TANGENT0;
};
/* data passed from vertex shader to pixel shader */
struct iceVertexOutput {
float4 HPosition : POSITION;
float4 IceColor : COLOR;
float4 ModelUV : TEXCOORD0;
float4 IcePos : TEXCOORD1; // coord w is attenuation 0 = no normal map, 1 = full normal map
float3 Light0Vec : TEXCOORD2;
float3 Light1Vec : TEXCOORD3;
float3 WorldNormal : TEXCOORD4;
float3 WorldTangent : TEXCOORD5;
float3 WorldView : TEXCOORD7;
float4 ObjectNormal : TEXCOORD6;
float3 ActualPos : COLOR1;
};
/*********** vertex shader ******/
iceVertexOutput mainVS(appdataTangent IN,
uniform float4x4 WorldITXf, // our four standard "untweakable" xforms
uniform float4x4 WorldXf,
uniform float4x4 ViewIXf,
uniform float4x4 WvpXf,
uniform float4 Lamp0Pos,
uniform float4 Lamp1Pos
) {
iceVertexOutput OUT = (iceVertexOutput)0;
float3 aWorldBinormal = cross(OUT.WorldNormal, OUT.WorldTangent);
vs_shared_lighting(
IN.Position,
IN.Normal,
IN.Tangent,
WorldITXf, // our four standard "untweakable" xforms
WorldXf,
ViewIXf,
WvpXf,
Lamp0Pos,
Lamp1Pos,
OUT.Light0Vec,
OUT.Light1Vec,
OUT.WorldView,
OUT.HPosition,
OUT.WorldNormal,
OUT.WorldTangent,
aWorldBinormal);
OUT.IcePos = float4(IN.Position, 0);
OUT.ModelUV = float4(IN.ModelUV, IN.SurfaceUV);
OUT.IceColor = IN.IceColor;
OUT.ObjectNormal = float4(IN.Normal,1);
OUT.ObjectNormal.w = mul(WvpXf,float4(IN.Position,1)).z;
OUT.ActualPos = IN.IcePos;
OUT.IcePos.w = IN.IcePos.x;
float cfactor = 0.980066578; //cos(0.2);
float sfactor = 0.198669331; //sin(0.2);
float cfactor2 = 0.955336489; //cos(0.3);
float sfactor2 = 0.295520207; //sin(0.3);
float cfactor3 = 0.921060994; //cos(0.4);
float sfactor3 = 0.389418342; //sin(0.4);
float3 p = IN.IcePos;
float3 shiftPos = p;
shiftPos.x += p.x * cfactor + p.z * sfactor;
shiftPos.z += p.x * -sfactor + p.z * cfactor;
shiftPos.x += p.x * cfactor2 - p.y * sfactor2;
shiftPos.y += p.x * sfactor2 + p.y * cfactor2;
shiftPos.y += p.y * cfactor3 - p.z * sfactor3;
shiftPos.z += p.y * sfactor3 + p.z * cfactor3;
OUT.IcePos = float4(shiftPos,0);
return OUT;
}
/********* pixel shader ********/
float4 icePSStuds(iceVertexOutput IN,
uniform float Ks,
uniform float SpecExpon,
uniform float3 Lamp0Color,
uniform float3 Lamp1Color,
uniform float3 AmbiColor,
uniform float NoiseScale,
uniform float NormMapScale,
uniform sampler2D StudsSamp,
uniform sampler3D NoiseSamp,
uniform sampler2D NormalSamp,
uniform samplerCUBE EnvSampler,
uniform float Kr,
uniform float FresnelVal
) : COLOR
{
float4 studShade = tex2D(StudsSamp, IN.ModelUV.xy);
float fade = 1-abs(IN.ObjectNormal.w/260);
if(fade < 0)
fade = 0;
float2 NormalUV = IN.ModelUV.zw * NormMapScale;
//float2 NormalUV2 = NormalUV * 0.2; // different scale
float3 shiftPos = IN.IcePos;
// low frequency
float3 noiseval = tex3D(NoiseSamp,shiftPos.xyz/NoiseScale*0.1).xyz;
float3 noiseval2 = tex3D(NoiseSamp,shiftPos.xyz/NoiseScale*0.5).xyz * 0.7 + 0.5;
noiseval *= noiseval2;
noiseval = 0.3 + noiseval * 0.7;
float3 dColor = IN.IceColor.xyz + fade*(noiseval*0.5 - 0.3);
float3 tNorm = tex2D(NormalSamp,NormalUV).xyz - float3(0.5,0.5,0.5);
//float3 tNorm2 = tex2D(NormalSamp, NormalUV2).xyz - float3(0.5, 0.5, 0.5);
//tNorm = lerp(tNorm, tNorm2, 0.4);
float tNormSum = 0.85+0.15*(tNorm.x + tNorm.y + tNorm.z);
dColor *= ((1-fade) + (fade*tNormSum));
float3 aWorldBinormal = cross(IN.WorldTangent, IN.WorldNormal);
float3 NnBump = normalize(tNorm.x*IN.WorldTangent -
tNorm.y*aWorldBinormal +
tNorm.z*IN.WorldNormal);
NnBump *= fade;
Ks *= fade;
float3 Nn = normalize(lerp(NnBump, IN.WorldNormal, 0.85 ));
float3 diffContrib;
float3 specContrib;
float3 reflContrib;
ps_shared_lighting_env(dColor, Nn, IN.WorldView,
IN.Light0Vec, IN.Light1Vec,
Lamp0Color, Lamp1Color,
AmbiColor,
Ks, SpecExpon,
Kr,
diffContrib,
specContrib,
EnvSampler,
reflContrib);
float3 result = lerp(diffContrib, studShade.xyz, studShade.w) + specContrib;
result += (FresnelVal*reflContrib) * fade;
return float4(result, 1);
}