49 lines
1.4 KiB
HLSL
49 lines
1.4 KiB
HLSL
#include "PreparedSplatView.hlsli"
|
|
|
|
cbuffer FrameConstants : register(b0)
|
|
{
|
|
float4x4 gViewProjection;
|
|
float4x4 gView;
|
|
float4x4 gProjection;
|
|
float4 gCameraWorldPos;
|
|
float4 gScreenParams;
|
|
float4 gSettings;
|
|
};
|
|
|
|
StructuredBuffer<PreparedSplatView> gPreparedViews : register(t0);
|
|
StructuredBuffer<uint> gOrderBuffer : register(t1);
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 position : SV_Position;
|
|
float4 color : COLOR0;
|
|
float2 localPosition : TEXCOORD0;
|
|
};
|
|
|
|
VertexOutput MainVS(uint vertexId : SV_VertexID, uint instanceId : SV_InstanceID)
|
|
{
|
|
VertexOutput output = (VertexOutput)0;
|
|
uint splatIndex = gOrderBuffer[instanceId];
|
|
PreparedSplatView view = gPreparedViews[splatIndex];
|
|
float4 color = UnpackPreparedColor(view);
|
|
|
|
if (view.clipPosition.w <= 0.0)
|
|
{
|
|
const float nanValue = asfloat(0x7fc00000);
|
|
output.position = float4(nanValue, nanValue, nanValue, nanValue);
|
|
return output;
|
|
}
|
|
|
|
float2 quadPosition = float2(vertexId & 1, (vertexId >> 1) & 1) * 2.0 - 1.0;
|
|
quadPosition *= 2.0;
|
|
|
|
float2 deltaScreenPosition =
|
|
(quadPosition.x * view.axis1 + quadPosition.y * view.axis2) * 2.0 / gScreenParams.xy;
|
|
|
|
output.position = view.clipPosition;
|
|
output.position.xy += deltaScreenPosition * view.clipPosition.w;
|
|
output.color = color;
|
|
output.localPosition = quadPosition;
|
|
return output;
|
|
}
|