186 lines
3.9 KiB
HLSL
186 lines
3.9 KiB
HLSL
cbuffer cbEveryFrame
|
|
{
|
|
matrix View;
|
|
matrix Projection;
|
|
|
|
float4 ViewEye;
|
|
|
|
float4 LightPos[4];
|
|
float4 LightDir[4];
|
|
float4 LightColor[4];
|
|
};
|
|
|
|
cbuffer cbMultiplePerFrame
|
|
{
|
|
matrix World;
|
|
};
|
|
|
|
cbuffer cbMultiplePerController
|
|
{
|
|
matrix Joints[16];
|
|
};
|
|
|
|
cbuffer cbPerMaterial
|
|
{
|
|
float4 Emission;
|
|
float4 Ambient;
|
|
float4 Diffuse;
|
|
float4 Specular;
|
|
float Shininess;
|
|
|
|
int4 TextureChannel;
|
|
};
|
|
|
|
Texture2D TexEmission;
|
|
Texture2D TexAmbient;
|
|
Texture2D TexDiffuse;
|
|
Texture2D TexSpecular;
|
|
|
|
SamplerState samLinear {
|
|
Filter = MIN_MAG_MIP_LINEAR;
|
|
AddressU = Wrap;
|
|
AddressV = Wrap;
|
|
};
|
|
|
|
struct VS_INPUT_SKINNED
|
|
{
|
|
float3 Pos : POSITION;
|
|
float3 Norm : NORMAL;
|
|
float2 Tex : TEXCOORD0;
|
|
int4 Joint : BLENDINDICES0;
|
|
float4 Weight: BLENDWEIGHT0;
|
|
};
|
|
|
|
struct VS_INPUT
|
|
{
|
|
float3 Pos : POSITION;
|
|
float3 Norm : NORMAL;
|
|
float2 Tex : TEXCOORD0;
|
|
};
|
|
|
|
struct PS_INPUT
|
|
{
|
|
float4 Pos : SV_POSITION;
|
|
float3 Norm : NORMAL;
|
|
float2 Tex : TEXCOORD0;
|
|
float4 WPos : POSITION;
|
|
};
|
|
|
|
struct PS_OUTPUT
|
|
{
|
|
float4 color0 : SV_TARGET0;
|
|
float4 color1 : SV_TARGET1;
|
|
};
|
|
|
|
PS_INPUT VSSkin(VS_INPUT_SKINNED input)
|
|
{
|
|
PS_INPUT output;
|
|
|
|
matrix mSkin
|
|
= input.Weight.x * Joints[input.Joint.x]
|
|
+ input.Weight.y * Joints[input.Joint.y]
|
|
+ input.Weight.z * Joints[input.Joint.z]
|
|
+ input.Weight.w * Joints[input.Joint.w]
|
|
;
|
|
|
|
float4 world_pos = mul(float4(input.Pos, 1), mSkin);
|
|
//float4 world_pos = mul(float4(input.Pos, 1), World);
|
|
output.Pos = mul(world_pos, View);
|
|
output.Pos = mul(output.Pos, Projection);
|
|
|
|
output.Norm = mul(input.Norm, (float3x3)World);
|
|
output.Tex = input.Tex;
|
|
|
|
output.WPos = world_pos;
|
|
|
|
return output;
|
|
}
|
|
|
|
PS_INPUT VS(VS_INPUT input)
|
|
{
|
|
PS_INPUT output;
|
|
|
|
float4 world_pos = mul(float4(input.Pos, 1), World);
|
|
output.Pos = mul(world_pos, View);
|
|
output.Pos = mul(output.Pos, Projection);
|
|
|
|
output.Norm = mul(input.Norm, (float3x3)World);
|
|
output.Tex = float2(input.Tex.x, 1 - input.Tex.y);
|
|
|
|
output.WPos = world_pos;
|
|
|
|
return output;
|
|
}
|
|
|
|
PS_OUTPUT PS(PS_INPUT input)
|
|
{
|
|
float3 normal = normalize(input.Norm);
|
|
float3 view_dir = normalize(ViewEye.xyz - input.WPos.xyz);
|
|
|
|
float3 emissionColor = float3(0, 0, 0);
|
|
|
|
if (TextureChannel.x >= 0) { // emission
|
|
emissionColor = TexEmission.Sample(samLinear, input.Tex).xyz;
|
|
} else {
|
|
emissionColor = Emission.xyz;
|
|
}
|
|
|
|
float3 diffuseColor;
|
|
if (TextureChannel.z >= 0) { // diffuse
|
|
diffuseColor = TexDiffuse.Sample(samLinear, input.Tex).xyz;
|
|
} else {
|
|
diffuseColor = Diffuse.xyz;
|
|
}
|
|
|
|
float3 color = emissionColor;
|
|
for (int i = 0; i < 4; i++) {
|
|
float3 light_dir = normalize(-LightDir[i].xyz);
|
|
float diffuse_intensity = max(dot(normal, light_dir), 0.0) + 0.2;
|
|
|
|
float distance = length(LightPos[i].xyz - input.WPos.xyz);
|
|
float attenuation = 1.0 / (0.00000006 * distance * distance * distance);
|
|
|
|
color += diffuseColor * diffuse_intensity * LightColor[i].xyz * attenuation;
|
|
}
|
|
|
|
PS_OUTPUT output;
|
|
output.color0 = float4(color, 1.0);
|
|
output.color1 = float4(emissionColor, 1.0);
|
|
return output;
|
|
}
|
|
|
|
BlendState DisableBlending
|
|
{
|
|
BlendEnable[0] = FALSE;
|
|
};
|
|
|
|
DepthStencilState EnableDepth
|
|
{
|
|
DepthEnable = TRUE;
|
|
DepthWriteMask = ALL;
|
|
};
|
|
|
|
technique10 Blinn
|
|
{
|
|
pass P0
|
|
{
|
|
SetVertexShader(CompileShader(vs_4_0, VS()));
|
|
SetGeometryShader(NULL);
|
|
SetPixelShader(CompileShader(ps_4_0, PS()));
|
|
SetBlendState(DisableBlending, float4(0.0, 0.0, 0.0, 0.0), 0xffffffff);
|
|
SetDepthStencilState(EnableDepth, 0);
|
|
}
|
|
}
|
|
|
|
technique10 BlinnSkin
|
|
{
|
|
pass P0
|
|
{
|
|
SetVertexShader(CompileShader(vs_4_0, VSSkin()));
|
|
SetGeometryShader(NULL);
|
|
SetPixelShader(CompileShader(ps_4_0, PS()));
|
|
SetBlendState(DisableBlending, float4(0.0, 0.0, 0.0, 0.0), 0xffffffff);
|
|
SetDepthStencilState(EnableDepth, 0);
|
|
}
|
|
}
|