91 lines
1.9 KiB
GLSL
91 lines
1.9 KiB
GLSL
#include "macros.hlsl"
|
|
#include "funny_shared.hlsl"
|
|
|
|
|
|
USE_CALLABLE_SHADERS;
|
|
|
|
COMMON {
|
|
cbuffer CameraInfo
|
|
{
|
|
float4x4 g_matViewProjection;
|
|
float4 g_vViewPosition;
|
|
};
|
|
struct PerModelData
|
|
{
|
|
float4x4 m_matTranslation;
|
|
float4x4 m_matRotation;
|
|
uint32_t m_uAlbedo;
|
|
}
|
|
StructuredBuffer<PerModelData> g_modelData;
|
|
struct PS_INPUT
|
|
{
|
|
float4 m_vScreenPosition: SV_POSITION;
|
|
float4 m_vWorldPosition: POSITION;
|
|
float4 m_vTexCoord: TEXCOORD0;
|
|
float4 m_vNormal: NORMAL0;
|
|
uint m_uInstance: SV_InstanceID;
|
|
}
|
|
}
|
|
VS
|
|
{
|
|
|
|
struct VS_INPUT
|
|
{
|
|
float3 m_vPosition: POSITION;
|
|
float2 m_vTexCoord: TEXCOORD0;
|
|
float3 m_vNormal: NORMAL0;
|
|
}
|
|
|
|
PS_INPUT vsMain( VS_INPUT input, uint uInstance: SV_InstanceID, uint uBaseInstance: SV_StartInstanceLocation )
|
|
{
|
|
uint uInstance = uBaseInstance + uInstance;
|
|
|
|
PS_INPUT output = {};
|
|
output.m_vScreenPosition = float4(input.m_vPosition, 1);
|
|
output.m_vScreenPosition = mul(
|
|
output.m_vScreenPosition,
|
|
g_modelData[uInstance].m_matTranslation
|
|
);
|
|
|
|
output.m_vScreenPosition = mul(
|
|
output.m_vScreenPosition,
|
|
g_matViewProjection
|
|
);
|
|
output.m_vWorldPosition = mul(
|
|
float4(input.m_vPosition, 1),
|
|
g_modelData[uInstance].m_matTranslation
|
|
);
|
|
output.m_vNormal = mul(
|
|
float4(input.m_vNormal, 1),
|
|
g_modelData[uInstance].m_matRotation
|
|
);
|
|
output.m_vTexCoord = float4(input.m_vTexCoord, 0, 0);
|
|
output.m_uInstance = uInstance;
|
|
return output;
|
|
}
|
|
}
|
|
PS
|
|
{
|
|
#include "brdf.hlsl"
|
|
#include "textures.hlsl"
|
|
|
|
|
|
struct PS_OUTPUT
|
|
{
|
|
float4 m_vAlbedo: SV_Target0;
|
|
float4 m_vNormal: SV_Target1;
|
|
float4 m_vWorldPosition: SV_Target2;
|
|
}
|
|
|
|
PS_OUTPUT psMain( PS_INPUT input )
|
|
{
|
|
PS_OUTPUT output = {};
|
|
PerModelData data = g_modelData[input.m_uInstance];
|
|
output.m_vAlbedo = g_textures[data.m_uAlbedo].Sample(g_textureSampler, input.m_vTexCoord.xy);
|
|
output.m_vWorldPosition = input.m_vWorldPosition;
|
|
output.m_vNormal = input.m_vNormal;
|
|
return output;
|
|
}
|
|
}
|
|
|