63 lines
1.5 KiB
HLSL
63 lines
1.5 KiB
HLSL
struct VS_INPUT
|
|
{
|
|
float4 vPosition : POSITION;
|
|
float3 normal : NORMAL;
|
|
float2 uv0 : UV0;
|
|
float2 uv1 : UV1;
|
|
};
|
|
|
|
struct VS_OUTPUT {
|
|
float4 vPosition : SV_POSITION;
|
|
float3 normal : TEXCOORD0;
|
|
float2 uv0 : TEXCOORD1;
|
|
float2 uv1 : TEXCOORD2;
|
|
float3 worldPos : TEXCOORD3;
|
|
float3 viewPos : TEXCOORD4;
|
|
};
|
|
|
|
cbuffer TestBuffer : register(b3) {
|
|
float4x4 mWorld;
|
|
float4x4 mView;
|
|
float4x4 mProjection;
|
|
float4 cameraWorldPos;
|
|
}
|
|
|
|
Texture2D diffuse : register(t0);
|
|
SamplerState MeshTextureSampler : register(s0);
|
|
|
|
|
|
|
|
VS_OUTPUT main_vs(VS_INPUT v){
|
|
VS_OUTPUT o;
|
|
|
|
|
|
float4x4 wv = mul(mView, mWorld);
|
|
float4x4 wvp = mul(mul(mProjection, mView), mWorld);
|
|
|
|
o.vPosition = mul(wvp, float4(v.vPosition.xyz,1));
|
|
|
|
o.normal = mul((float3x3)mWorld, v.normal);
|
|
o.uv0 = v.uv0;
|
|
o.uv1 = v.uv1;
|
|
o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz);
|
|
o.viewPos = mul(wv, float4(v.vPosition.xyz, 1));
|
|
return o;
|
|
}
|
|
|
|
#include "lighting/cook_torrance_term.inc"
|
|
|
|
float4 main_ps(VS_OUTPUT input) : SV_Target
|
|
{
|
|
float3 ambient = float3(0.3f, 0.3f, 0.4f);
|
|
|
|
float4 diffuseColor = diffuse.Sample(MeshTextureSampler, input.uv0);
|
|
return diffuseColor;
|
|
float3 worldPos = input.worldPos;
|
|
float3 camPos = cameraWorldPos.xyz;
|
|
float3 viewDir = normalize(camPos - worldPos);
|
|
float3 sun = normalize(float3(-1, 1, -1));
|
|
|
|
float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.7f, 0.1f, diffuseColor.rgb, diffuseColor.rgb);
|
|
|
|
return float4(surfaceColor + ambient * diffuseColor, 1);
|
|
} |