#include "PreparedSplatView.hlsli" cbuffer FrameConstants : register(b0) { float4x4 gViewProjection; float4x4 gView; float4x4 gProjection; float4 gCameraWorldPos; float4 gScreenParams; float4 gSettings; }; StructuredBuffer gPreparedViews : register(t0); StructuredBuffer 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 scaledAxis1 = view.axis1 * gSettings.w; float2 scaledAxis2 = view.axis2 * gSettings.w; float2 deltaScreenPosition = (quadPosition.x * scaledAxis1 + quadPosition.y * scaledAxis2) * 2.0 / gScreenParams.xy; output.position = view.clipPosition; output.position.xy += deltaScreenPosition * view.clipPosition.w; output.color = color; output.localPosition = quadPosition; return output; }