Add depth buffer

This commit is contained in:
Riyyi
2026-10-14 23:10:33 +02:00
parent d12118e80a
commit 31005e0861
+77 -5
View File
@@ -45,6 +45,9 @@ state: struct {
capabilities: wgpu.SurfaceCapabilities,
vsync: bool,
// ----------------------------------------
depth_texture: wgpu.Texture,
depth_texture_view: wgpu.TextureView,
// ----------------------------------------
uniform_buffer: wgpu.Buffer,
bind_group_layout: wgpu.BindGroupLayout,
bind_group: wgpu.BindGroup,
@@ -88,6 +91,9 @@ instance_init :: proc(settings: base.Settings) {
}
instance_destroy :: proc() {
wgpu.TextureViewRelease(state.depth_texture_view)
wgpu.TextureRelease(state.depth_texture)
wgpu.BufferRelease(state.uniform_buffer)
wgpu.BufferRelease(state.vertex_buffer)
wgpu.BufferRelease(state.index_buffer)
@@ -126,6 +132,8 @@ resize :: proc "c" () {
state.config.width, state.config.height = os_get_framebuffer_size()
wgpu.SurfaceConfigure(state.surface, &state.config)
create_depth_texture()
// The projection depends on aspect, so rebuild and re-upload the matrix
upload_camera(state.queue, state.uniform_buffer, framebuffer_aspect())
}
@@ -173,6 +181,12 @@ frame :: proc "c" () {
depthSlice = wgpu.DEPTH_SLICE_UNDEFINED,
clearValue = {55 / 255.0, 73 / 255.0, 73 / 255.0, 1},
},
depthStencilAttachment = &wgpu.RenderPassDepthStencilAttachment {
view = state.depth_texture_view,
depthLoadOp = .Clear,
depthStoreOp = .Store,
depthClearValue = 1.0,
},
},
)
@@ -268,6 +282,11 @@ on_device :: proc "c" (
}
wgpu.SurfaceConfigure(state.surface, &state.config)
// ----------------------------------------
// Depth buffer
create_depth_texture()
// ----------------------------------------
// Compile shader
@@ -402,6 +421,11 @@ on_device :: proc "c" (
},
primitive = {topology = .TriangleList},
multisample = {count = 1, mask = 0xFFFFFFFF},
depthStencil = &wgpu.DepthStencilState {
format = .Depth24Plus,
depthWriteEnabled = .True,
depthCompare = .Less,
},
},
)
@@ -469,15 +493,63 @@ pick_present_mode :: proc(vsync: bool) -> wgpu.PresentMode {
return .Fifo // Vsync On
}
// Depth buffer: same size as the surface, should get recreated on resize
@(private = "file")
create_depth_texture :: proc() {
if state.depth_texture != nil {
wgpu.TextureViewRelease(state.depth_texture_view)
wgpu.TextureRelease(state.depth_texture)
}
state.depth_texture = wgpu.DeviceCreateTexture(
state.device,
&{
label = "depth texture",
usage = {.RenderAttachment},
dimension = ._2D,
size = {
width = state.config.width,
height = state.config.height,
depthOrArrayLayers = 1,
},
format = .Depth24Plus,
mipLevelCount = 1,
sampleCount = 1,
},
)
state.depth_texture_view = wgpu.TextureCreateView(state.depth_texture, nil)
}
@(private = "file")
fill_buffers_with_quad :: proc() {
vertices := [?]Vertex {
{pos = {-0.5, -0.5, 0}, col = {1, 0, 0}}, // 0 bottom-left red
{pos = {+0.5, -0.5, 0}, col = {0, 1, 0}}, // 1 bottom-right green
{pos = {+0.5, +0.5, 0}, col = {0, 0, 1}}, // 2 top-right blue
{pos = {-0.5, +0.5, 0}, col = {1, 1, 0}}, // 3 top-left yellow
// Near quad: z = 0, colourful, drawn first
{pos = {-0.4, -0.4, 0.0}, col = {1, 0, 0}}, // 0 bottom-left red
{pos = {0.4, -0.4, 0.0}, col = {0, 1, 0}}, // 1 bottom-right green
{pos = {0.4, 0.4, 0.0}, col = {0, 0, 1}}, // 2 top-right blue
{pos = {-0.4, 0.4, 0.0}, col = {1, 1, 0}}, // 3 top-left yellow
// Far quad: z = -0.5, cyan, drawn second
{pos = {-0.8, -0.8, -0.5}, col = {0, 1, 1}}, // 4 bottom-left
{pos = {0.8, -0.8, -0.5}, col = {0, 1, 1}}, // 5 bottom-right
{pos = {0.8, 0.8, -0.5}, col = {0, 1, 1}}, // 6 top-right
{pos = {-0.8, 0.8, -0.5}, col = {0, 1, 1}}, // 7 top-left
}
indices := [?]u16 {
0,
1,
2,
2,
3,
0, // near quad
4,
5,
6,
6,
7,
4, // far quad
}
indices := [?]u16{0, 1, 2, 2, 3, 0}
state.vertex_buffer = wgpu.DeviceCreateBufferWithData(
state.device,