Novetus_src/clients/2010L/content/materials/programs/include/plastic.cgh

249 lines
5.8 KiB
Plaintext

//////// CONNECTOR DATA STRUCTURES ///////////
/* data from application vertex buffer */
struct appdata {
float3 Position : POSITION;
float4 Color : COLOR;
float4 ModelUV : TEXCOORD0;
float3 Normal : NORMAL;
float3 Tangent : TANGENT0;
};
/* data passed from vertex shader to pixel shader */
struct vertexOutputPrecise {
float4 HPosition : POSITION;
float4 Color : COLOR;
float3 ModelUV : TEXCOORD0;
float4 TextureUVW : TEXCOORD1;
float3 Light0Vec : TEXCOORD2;
float3 Light1Vec : TEXCOORD3;
float3 WorldNormal : TEXCOORD4;
float3 WorldTangent : TEXCOORD5;
float3 WorldBinormal : TEXCOORD6;
float3 WorldView : TEXCOORD7;
};
struct vertexOutputSimple {
float4 HPosition : POSITION;
float4 DiffuseContrib : COLOR;
float3 ModelUV : TEXCOORD0;
float3 Light0Vec : TEXCOORD1;
float3 WorldNormal : TEXCOORD2;
float3 WorldView : TEXCOORD3;
float Fresnel : TEXCOORD4;
};
#ifdef FXCOMPOSER_VERSION // in fxcompser editor
#include "include/common.cgh"
#else
#include "common.cgh"
#endif
///////// VERTEX SHADING /////////////////////
/*********** Generic Vertex Shader ******/
vertexOutputSimple plastic_vp_simple(appdata IN,
uniform float4x4 WorldITXf, // our four standard "untweakable" xforms
uniform float4x4 WorldXf,
uniform float4x4 ViewIXf,
uniform float4x4 WvpXf,
uniform float4 Lamp0Pos,
uniform float4 Lamp1Pos,
uniform float Kr,
uniform float FresnelMin,
uniform float FresnelExp,
uniform float3 Lamp0Color,
uniform float3 Lamp1Color,
uniform float3 AmbiColor
) {
vertexOutputSimple OUT = (vertexOutputSimple)0;
#ifdef FXCOMPOSER_VERSION // in fxcompser editor
IN.Color = float4(gSurfaceColor,1);
#endif
float3 diffuseContrib;
float3 ignore;
vs_shared_lighting_diffuse(
IN.Position,
IN.Normal,
IN.Tangent,
IN.Color.xyz,
WorldITXf, // our four standard "untweakable" xforms
WorldXf,
ViewIXf,
WvpXf,
Lamp0Pos,
Lamp1Pos,
Lamp0Color,
Lamp1Color,
AmbiColor,
OUT.Light0Vec,
diffuseContrib,
OUT.WorldView,
OUT.HPosition,
OUT.WorldNormal,
ignore,
ignore);
OUT.DiffuseContrib = float4(diffuseContrib, IN.Color.w); // keep input color alpha
OUT.ModelUV = IN.ModelUV.xyz;
#ifdef ENABLE_FRESNEL
float3 Nn = normalize(OUT.WorldNormal);
float3 Vn = normalize(OUT.WorldView);
float KrMin = (Kr * FresnelMin);
float InvFrExp = (1.0/FresnelExp);
OUT.Fresnel = lerp(Kr,KrMin,pow(abs(dot(Nn,Vn)),InvFrExp));
#else
OUT.Fresnel = Kr * FresnelMin * 2;
#endif
return OUT;
}
float4 plastic_fp_simple(vertexOutputSimple IN,
uniform float3 Lamp0Color,
uniform float Ks,
uniform float SpecExpon,
uniform float Kr,
uniform sampler2D StudsSampler,
uniform samplerCUBE EnvSampler
) : COLOR {
#ifdef ENABLE_STUDS
float4 StudShade = tex2D(StudsSampler, IN.ModelUV.xy);
#endif
float3 specContrib;
float3 reflContrib;
float3 result;
float3 fresnel = IN.Fresnel;
ps_shared_lighting_env_specularonly(
IN.WorldNormal, IN.WorldView, IN.Light0Vec,
Lamp0Color, // use lamp0Color as specular.
Ks, SpecExpon, Kr,
specContrib,
EnvSampler,
reflContrib);
#ifdef ENABLE_STUDS
result = lerp(IN.DiffuseContrib.xyz, StudShade.xyz, StudShade.w);
#else
result = IN.DiffuseContrib.xyz;
#endif
result += specContrib;
#ifdef ENABLE_REFLECTIONS
result = lerp(result, reflContrib, fresnel);
#endif
return float4(result,1); //IN.DiffuseContrib.w); // copy alpha out.
}
vertexOutputPrecise plastic_vp_precise(appdata IN,
uniform float4x4 WorldITXf, // our four standard "untweakable" xforms
uniform float4x4 WorldXf,
uniform float4x4 ViewIXf,
uniform float4x4 WvpXf,
uniform float4 Lamp0Pos,
uniform float4 Lamp1Pos) {
vertexOutputPrecise OUT = (vertexOutputPrecise)0;
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,
OUT.WorldBinormal);
OUT.ModelUV = IN.ModelUV.xyz;
OUT.TextureUVW = float4(IN.Position.xyz, 0);
#ifdef FXCOMPOSER_VERSION // in fxcompser editor
OUT.Color = float4(gSurfaceColor,1);
#else
OUT.Color = IN.Color;
#endif
return OUT;
}
///////// PIXEL SHADING //////////////////////
float3 rebase(float3 v, float3 xrow, float3 yrow, float3 zrow)
{
//todo: faster? put in matrix, then mul? or just mul?
return v.x*xrow + // normal mapping had this at -, why?
v.y*yrow +
v.z*zrow;
}
float4 plastic_fp_precise(vertexOutputPrecise IN,
uniform float Ks,
uniform float SpecExpon,
uniform float Kr,
uniform float FresnelMin,
uniform float FresnelExp,
uniform sampler2D StudsSampler,
uniform samplerCUBE EnvSampler,
uniform float3 Lamp0Color,
uniform float3 Lamp1Color,
uniform float3 AmbiColor
) : COLOR {
#ifdef ENABLE_STUDS
float4 StudShade = tex2D(StudsSampler, IN.ModelUV.xy);
#endif
float3 diffContrib;
float3 specContrib;
float3 reflContrib;
float3 result;
#ifdef ENABLE_FRESNEL
float3 Nn = normalize(IN.WorldNormal);
float3 Vn = normalize(IN.WorldView);
float KrMin = (Kr * FresnelMin);
float InvFrExp = (1.0/FresnelExp);
float fresnel = lerp(Kr,KrMin,pow(abs(dot(Nn,Vn)),InvFrExp));
#else
float fresnel = FresnelMin*Kr;
#endif
ps_shared_lighting_env(IN.Color.xyz,
IN.WorldNormal, IN.WorldView, IN.Light0Vec, IN.Light1Vec,
Lamp0Color, Lamp1Color,
AmbiColor,
Ks, SpecExpon, Kr,
diffContrib,specContrib
,EnvSampler
,reflContrib
);
#ifdef ENABLE_STUDS
result = lerp(diffContrib, StudShade.xyz, StudShade.w);
#else
result = diffContrib;
#endif
result += specContrib;
#ifdef ENABLE_REFLECTIONS
result = lerp(result, reflContrib, fresnel);
#endif
return float4(result,1);
}