Render temporal scene with motion, resolve and sharp UI
Native and manual checks / native (ubuntu-24.04) (push) Failing after 37s
Native and manual checks / manual (push) Successful in 28s
Windows editor and software Vulkan / windows-graphics (push) Canceled after 0s
Native and manual checks / native (windows-2025) (push) Canceled after 0s

This commit is contained in:
Emil
2026-09-24 03:16:44 +03:00
parent c53e51520c
commit 0dcc8790a0
9 changed files with 934 additions and 88 deletions
+37
View File
@@ -28,6 +28,7 @@ struct InstanceRecord {
float4 previousExtent; // 192..207
uint4 metadata; // 208..223: x bits 0=HZB, 1=temporal prior valid; y=stableSlot,
// z=generation low 32, w=generation high 32 (zero = untracked)
column_major float4x4 previousModel; // 224..287
};
struct ViewRecord {
column_major float4x4 currentViewProjection; // 0..63
@@ -81,6 +82,42 @@ GpuSceneOutput gpuVertexMain(GpuSceneVertex vertex, uint drawInstance : SV_Vulka
return output;
}
struct GpuSceneTemporalOutput {
float4 position : SV_Position;
float3 world : TEXCOORD0;
float3 normal : NORMAL;
float4 color : COLOR0;
float2 material : TEXCOORD1;
float2 uv : TEXCOORD2;
float4 previousClip : TEXCOORD3;
float4 currentClip : TEXCOORD4;
float motionValid : TEXCOORD5;
};
[shader("vertex")]
GpuSceneTemporalOutput gpuTemporalVertexMain(GpuSceneVertex vertex,
uint drawInstance : SV_VulkanInstanceID) {
InstanceRecord instance = gfxInstances[gfxVisibleIds[gpuFrame.drawInfo.x + drawInstance]];
ViewRecord view = gfxViews[0];
float4 local = float4(vertex.position, 1);
float4 world = mul(instance.model, local);
GpuSceneTemporalOutput output;
output.position = mul(view.currentViewProjection, world);
output.currentClip = output.position;
output.previousClip = mul(view.previousViewProjection,
mul(instance.previousModel, local));
output.motionValid = (instance.metadata.x & 2u) != 0u ? 1.0 : 0.0;
output.world = world.xyz;
float3 normal = float3(dot(instance.normalRow0.xyz, vertex.normal),
dot(instance.normalRow1.xyz, vertex.normal),
dot(instance.normalRow2.xyz, vertex.normal));
float normalLength = length(normal);
output.normal = normalLength > 1e-8 ? normal / normalLength : float3(0, 0, 0);
output.color = vertex.color * instance.color;
output.material = instance.material.xy;
output.uv = vertex.uv;
return output;
}
[shader("vertex")]
float4 gpuShadowMain(GpuSceneVertex vertex, uint drawInstance : SV_VulkanInstanceID) : SV_Position {
InstanceRecord instance = gfxInstances[gfxVisibleIds[gpuFrame.drawInfo.x + drawInstance]];