feat(renderer): add MeshVertex, Mesh, and depth buffer support

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 19:47:59 +09:00
parent 82e3c19b53
commit 78dcc30258
4 changed files with 80 additions and 1 deletions

View File

@@ -1,12 +1,29 @@
use std::sync::Arc; use std::sync::Arc;
use winit::window::Window; use winit::window::Window;
pub const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float;
fn create_depth_texture(device: &wgpu::Device, width: u32, height: u32) -> wgpu::TextureView {
let texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Depth Texture"),
size: wgpu::Extent3d { width, height, depth_or_array_layers: 1 },
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
format: DEPTH_FORMAT,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
view_formats: &[],
});
texture.create_view(&wgpu::TextureViewDescriptor::default())
}
pub struct GpuContext { pub struct GpuContext {
pub surface: wgpu::Surface<'static>, pub surface: wgpu::Surface<'static>,
pub device: wgpu::Device, pub device: wgpu::Device,
pub queue: wgpu::Queue, pub queue: wgpu::Queue,
pub config: wgpu::SurfaceConfiguration, pub config: wgpu::SurfaceConfiguration,
pub surface_format: wgpu::TextureFormat, pub surface_format: wgpu::TextureFormat,
pub depth_view: wgpu::TextureView,
} }
impl GpuContext { impl GpuContext {
@@ -64,12 +81,15 @@ impl GpuContext {
}; };
surface.configure(&device, &config); surface.configure(&device, &config);
let depth_view = create_depth_texture(&device, config.width, config.height);
Self { Self {
surface, surface,
device, device,
queue, queue,
config, config,
surface_format, surface_format,
depth_view,
} }
} }
@@ -78,6 +98,7 @@ impl GpuContext {
self.config.width = width; self.config.width = width;
self.config.height = height; self.config.height = height;
self.surface.configure(&self.device, &self.config); self.surface.configure(&self.device, &self.config);
self.depth_view = create_depth_texture(&self.device, width, height);
} }
} }
} }

View File

@@ -1,5 +1,7 @@
pub mod gpu; pub mod gpu;
pub mod pipeline; pub mod pipeline;
pub mod vertex; pub mod vertex;
pub mod mesh;
pub use gpu::GpuContext; pub use gpu::{GpuContext, DEPTH_FORMAT};
pub use mesh::Mesh;

View File

@@ -0,0 +1,24 @@
use crate::vertex::MeshVertex;
use wgpu::util::DeviceExt;
pub struct Mesh {
pub vertex_buffer: wgpu::Buffer,
pub index_buffer: wgpu::Buffer,
pub num_indices: u32,
}
impl Mesh {
pub fn new(device: &wgpu::Device, vertices: &[MeshVertex], indices: &[u32]) -> Self {
let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Mesh Vertex Buffer"),
contents: bytemuck::cast_slice(vertices),
usage: wgpu::BufferUsages::VERTEX,
});
let index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Mesh Index Buffer"),
contents: bytemuck::cast_slice(indices),
usage: wgpu::BufferUsages::INDEX,
});
Self { vertex_buffer, index_buffer, num_indices: indices.len() as u32 }
}
}

View File

@@ -25,3 +25,35 @@ impl Vertex {
], ],
}; };
} }
#[repr(C)]
#[derive(Copy, Clone, Debug, Pod, Zeroable)]
pub struct MeshVertex {
pub position: [f32; 3],
pub normal: [f32; 3],
pub uv: [f32; 2],
}
impl MeshVertex {
pub const LAYOUT: wgpu::VertexBufferLayout<'static> = wgpu::VertexBufferLayout {
array_stride: std::mem::size_of::<MeshVertex>() as wgpu::BufferAddress,
step_mode: wgpu::VertexStepMode::Vertex,
attributes: &[
wgpu::VertexAttribute {
offset: 0,
shader_location: 0,
format: wgpu::VertexFormat::Float32x3,
},
wgpu::VertexAttribute {
offset: std::mem::size_of::<[f32; 3]>() as wgpu::BufferAddress,
shader_location: 1,
format: wgpu::VertexFormat::Float32x3,
},
wgpu::VertexAttribute {
offset: (std::mem::size_of::<[f32; 3]>() * 2) as wgpu::BufferAddress,
shader_location: 2,
format: wgpu::VertexFormat::Float32x2,
},
],
};
}