249 lines
5.8 KiB
Plaintext
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);
|
|
}
|
|
|