home *** CD-ROM | disk | FTP | other *** search
- //***************************************************************************************
- // Default.hlsl by Frank Luna (C) 2015 All Rights Reserved.
- //***************************************************************************************
-
- // Defaults for number of lights.
- #ifndef NUM_DIR_LIGHTS
- #define NUM_DIR_LIGHTS 3
- #endif
-
- #ifndef NUM_POINT_LIGHTS
- #define NUM_POINT_LIGHTS 0
- #endif
-
- #ifndef NUM_SPOT_LIGHTS
- #define NUM_SPOT_LIGHTS 0
- #endif
-
- // Include structures and functions for lighting.
- #include "LightingUtil.hlsl"
-
- struct MaterialData
- {
- float4 DiffuseAlbedo;
- float3 FresnelR0;
- float Roughness;
- float4x4 MatTransform;
- uint DiffuseMapIndex;
- uint MatPad0;
- uint MatPad1;
- uint MatPad2;
- };
-
-
- // An array of textures, which is only supported in shader model 5.1+. Unlike Texture2DArray, the textures
- // in this array can be different sizes and formats, making it more flexible than texture arrays.
- Texture2D gDiffuseMap[4] : register(t0);
-
- // Put in space1, so the texture array does not overlap with these resources.
- // The texture array will occupy registers t0, t1, ..., t3 in space0.
- StructuredBuffer<MaterialData> gMaterialData : register(t0, space1);
-
-
- SamplerState gsamPointWrap : register(s0);
- SamplerState gsamPointClamp : register(s1);
- SamplerState gsamLinearWrap : register(s2);
- SamplerState gsamLinearClamp : register(s3);
- SamplerState gsamAnisotropicWrap : register(s4);
- SamplerState gsamAnisotropicClamp : register(s5);
-
- // Constant data that varies per frame.
- cbuffer cbPerObject : register(b0)
- {
- float4x4 gWorld;
- float4x4 gTexTransform;
- uint gMaterialIndex;
- uint gObjPad0;
- uint gObjPad1;
- uint gObjPad2;
- };
-
- // Constant data that varies per material.
- cbuffer cbPass : register(b1)
- {
- float4x4 gView;
- float4x4 gInvView;
- float4x4 gProj;
- float4x4 gInvProj;
- float4x4 gViewProj;
- float4x4 gInvViewProj;
- float3 gEyePosW;
- float cbPerObjectPad1;
- float2 gRenderTargetSize;
- float2 gInvRenderTargetSize;
- float gNearZ;
- float gFarZ;
- float gTotalTime;
- float gDeltaTime;
- float4 gAmbientLight;
-
- // Indices [0, NUM_DIR_LIGHTS) are directional lights;
- // indices [NUM_DIR_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHTS) are point lights;
- // indices [NUM_DIR_LIGHTS+NUM_POINT_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHT+NUM_SPOT_LIGHTS)
- // are spot lights for a maximum of MaxLights per object.
- Light gLights[MaxLights];
- };
-
- struct VertexIn
- {
- float3 PosL : POSITION;
- float3 NormalL : NORMAL;
- float2 TexC : TEXCOORD;
- };
-
- struct VertexOut
- {
- float4 PosH : SV_POSITION;
- float3 PosW : POSITION;
- float3 NormalW : NORMAL;
- float2 TexC : TEXCOORD;
- };
-
- VertexOut VS(VertexIn vin)
- {
- VertexOut vout = (VertexOut)0.0f;
-
- // Fetch the material data.
- MaterialData matData = gMaterialData[gMaterialIndex];
-
- // Transform to world space.
- float4 posW = mul(float4(vin.PosL, 1.0f), gWorld);
- vout.PosW = posW.xyz;
-
- // Assumes nonuniform scaling; otherwise, need to use inverse-transpose of world matrix.
- vout.NormalW = mul(vin.NormalL, (float3x3)gWorld);
-
- // Transform to homogeneous clip space.
- vout.PosH = mul(posW, gViewProj);
-
- // Output vertex attributes for interpolation across triangle.
- float4 texC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform);
- vout.TexC = mul(texC, matData.MatTransform).xy;
-
- return vout;
- }
-
- float4 PS(VertexOut pin) : SV_Target
- {
- // Fetch the material data.
- MaterialData matData = gMaterialData[gMaterialIndex];
- float4 diffuseAlbedo = matData.DiffuseAlbedo;
- float3 fresnelR0 = matData.FresnelR0;
- float roughness = matData.Roughness;
- uint diffuseTexIndex = matData.DiffuseMapIndex;
-
- // Dynamically look up the texture in the array.
- diffuseAlbedo *= gDiffuseMap[diffuseTexIndex].Sample(gsamLinearWrap, pin.TexC);
-
- // Interpolating normal can unnormalize it, so renormalize it.
- pin.NormalW = normalize(pin.NormalW);
-
- // Vector from point being lit to eye.
- float3 toEyeW = normalize(gEyePosW - pin.PosW);
-
- // Light terms.
- float4 ambient = gAmbientLight*diffuseAlbedo;
-
- const float shininess = 1.0f - roughness;
- Material mat = { diffuseAlbedo, fresnelR0, shininess };
- float3 shadowFactor = 1.0f;
- float4 directLight = ComputeLighting(gLights, mat, pin.PosW,
- pin.NormalW, toEyeW, shadowFactor);
-
- float4 litColor = ambient + directLight;
-
- // Common convention to take alpha from diffuse albedo.
- litColor.a = diffuseAlbedo.a;
-
- return litColor;
- }
-
-
-