89 lines
2.1 KiB
HLSL
89 lines
2.1 KiB
HLSL
#include "globals.h"
|
|
|
|
struct Appdata
|
|
{
|
|
float4 Position : POSITION;
|
|
float2 Uv : TEXCOORD0;
|
|
float3 Normal : NORMAL0;
|
|
};
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 HPosition : POSITION;
|
|
|
|
float2 Uv : TEXCOORD0;
|
|
float4 Color : COLOR0;
|
|
|
|
float FogFactor : TEXCOORD1;
|
|
};
|
|
|
|
uniform float4x4 WorldMatrix;
|
|
|
|
uniform float4 Color;
|
|
|
|
VertexOutput AdornSelfLitVSGeneric(Appdata IN, float ambient)
|
|
{
|
|
VertexOutput OUT = (VertexOutput)0;
|
|
|
|
float4 position = mul(WorldMatrix, IN.Position);
|
|
float3 normal = normalize(mul((float3x3)WorldMatrix, IN.Normal));
|
|
|
|
float3 light = normalize(G.CameraPosition - position.xyz);
|
|
float ndotl = saturate(dot(normal, light));
|
|
|
|
float lighting = ambient + (1 - ambient) * ndotl;
|
|
float specular = pow(ndotl, 64.0);
|
|
|
|
OUT.HPosition = mul(G.ViewProjection, mul(WorldMatrix, IN.Position));
|
|
OUT.Uv = IN.Uv;
|
|
OUT.Color = float4(Color.rgb * lighting + specular, Color.a);
|
|
|
|
OUT.FogFactor = (G.FogParams.z - OUT.HPosition.w) * G.FogParams.w;
|
|
|
|
return OUT;
|
|
}
|
|
|
|
VertexOutput AdornSelfLitVS(Appdata IN)
|
|
{
|
|
return AdornSelfLitVSGeneric(IN, 0.5f);
|
|
}
|
|
|
|
VertexOutput AdornSelfLitHighlightVS(Appdata IN)
|
|
{
|
|
return AdornSelfLitVSGeneric(IN, 0.75f);
|
|
}
|
|
|
|
VertexOutput AdornVS(Appdata IN)
|
|
{
|
|
VertexOutput OUT = (VertexOutput)0;
|
|
|
|
float4 position = mul(WorldMatrix, IN.Position);
|
|
|
|
#ifdef PIN_LIGHTING
|
|
float3 normal = normalize(mul((float3x3)WorldMatrix, IN.Normal));
|
|
float ndotl = dot(normal, -G.Lamp0Dir);
|
|
float3 lighting = G.AmbientColor + saturate(ndotl) * G.Lamp0Color + saturate(-ndotl) * G.Lamp1Color;
|
|
#else
|
|
float3 lighting = 1;
|
|
#endif
|
|
|
|
OUT.HPosition = mul(G.ViewProjection, position);
|
|
OUT.Uv = IN.Uv;
|
|
OUT.Color = float4(Color.rgb * lighting, Color.a);
|
|
|
|
OUT.FogFactor = (G.FogParams.z - OUT.HPosition.w) * G.FogParams.w;
|
|
|
|
return OUT;
|
|
}
|
|
|
|
sampler2D DiffuseMap: register(s0);
|
|
|
|
float4 AdornPS(VertexOutput IN): COLOR0
|
|
{
|
|
float4 result = tex2D(DiffuseMap, IN.Uv) * IN.Color;
|
|
|
|
result.rgb = lerp(G.FogColor, result.rgb, saturate(IN.FogFactor));
|
|
|
|
return result;
|
|
}
|