engine/engine/shaders/hlsl9/rtlight.hlsl

66 lines
1.3 KiB
HLSL

!!permu BUMP
!!permu SPECULAR
!!permu OFFSETMAPPING
!!permu SKELETAL
!!permu FOG
!!samps diffuse
// texture units:
// s0=diffuse, s1=normal, s2=specular, s3=shadowmap
// custom modifiers:
// PCF(shadowmap)
// CUBE(projected cubemap)
struct a2v
{
float4 pos: POSITION;
float3 tc: TEXCOORD0;
float3 n: NORMAL0;
float3 s: TANGENT0;
float3 t: BINORMAL0;
};
struct v2f
{
#ifndef FRAGMENT_SHADER
float4 pos: POSITION;
#endif
float3 tc: TEXCOORD0;
float3 lpos: TEXCOORD1;
};
#ifdef VERTEX_SHADER
float4x4 m_modelviewprojection;
float3 l_lightposition;
v2f main (a2v inp)
{
v2f outp;
outp.pos = mul(m_modelviewprojection, inp.pos);
outp.tc = inp.tc;
float3 lightminusvertex = l_lightposition - inp.pos.xyz;
outp.lpos.x = dot(lightminusvertex, inp.s.xyz);
outp.lpos.y = dot(lightminusvertex, inp.t.xyz);
outp.lpos.z = dot(lightminusvertex, inp.n.xyz);
return outp;
}
#endif
#ifdef FRAGMENT_SHADER
sampler s_diffuse;
float l_lightradius;
float3 l_lightcolour;
float4 main (v2f inp) : COLOR0
{
float3 col = l_lightcolour;
col *= max(1.0 - dot(inp.lpos, inp.lpos)/(l_lightradius*l_lightradius), 0.0);
#ifdef FLAT
float3 diff = FLAT;
#else
float3 diff = tex2D(s_diffuse, inp.tc);
#endif
return float4(diff * col, 1);
}
#endif