merge integration
This commit is contained in:
commit
9015a777ec
|
|
@ -9,10 +9,8 @@ keywords = ["wgpu", "raymarching", "sdf", "renderer", "3d"]
|
||||||
categories = ["graphics", "rendering"]
|
categories = ["graphics", "rendering"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cord-shader = { path = "../cord-shader" }
|
|
||||||
wgpu = "24"
|
wgpu = "24"
|
||||||
winit = "0.30"
|
winit = "0.30"
|
||||||
pollster = "0.4"
|
pollster = "0.4"
|
||||||
bytemuck = { version = "1", features = ["derive"] }
|
bytemuck = { version = "1", features = ["derive"] }
|
||||||
glam = "0.29"
|
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
|
|
|
||||||
|
|
@ -217,8 +217,9 @@ async fn init_render_state(
|
||||||
};
|
};
|
||||||
surface.configure(&device, &config);
|
surface.configure(&device, &config);
|
||||||
|
|
||||||
let pipeline = RenderPipeline::new(&device, format, wgsl_source)?;
|
let scene_scale = (bounding_radius as f32).max(0.1);
|
||||||
let camera = Camera::new(bounding_radius as f32);
|
let pipeline = RenderPipeline::new(&device, format, wgsl_source, scene_scale)?;
|
||||||
|
let camera = Camera::new(scene_scale);
|
||||||
|
|
||||||
Ok(RenderState {
|
Ok(RenderState {
|
||||||
window,
|
window,
|
||||||
|
|
|
||||||
|
|
@ -2,26 +2,33 @@ use crate::camera::Camera;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use bytemuck::{Pod, Zeroable};
|
use bytemuck::{Pod, Zeroable};
|
||||||
|
|
||||||
|
/// Matches the WGSL `Uniforms` struct byte-for-byte.
|
||||||
|
///
|
||||||
|
/// WGSL alignment: vec3<f32> aligns to 16 bytes, vec2 to 8, vec4 to 16.
|
||||||
|
/// Total: 80 bytes (multiple of 16).
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Copy, Clone, Pod, Zeroable)]
|
#[derive(Debug, Copy, Clone, Pod, Zeroable)]
|
||||||
struct Uniforms {
|
struct Uniforms {
|
||||||
resolution: [f32; 2],
|
resolution: [f32; 2], // offset 0
|
||||||
time: f32,
|
viewport_offset: [f32; 2], // offset 8
|
||||||
_pad0: f32,
|
camera_pos: [f32; 3], // offset 16 (vec3 align 16)
|
||||||
camera_pos: [f32; 3],
|
time: f32, // offset 28
|
||||||
_pad1: f32,
|
camera_target: [f32; 3], // offset 32 (vec3 align 16)
|
||||||
camera_target: [f32; 3],
|
fov: f32, // offset 44
|
||||||
fov: f32,
|
render_flags: [f32; 4], // offset 48 (vec4 align 16)
|
||||||
|
scene_scale: f32, // offset 64
|
||||||
|
_pad: [f32; 3], // offset 68
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct RenderPipeline {
|
pub struct RenderPipeline {
|
||||||
pipeline: wgpu::RenderPipeline,
|
pipeline: wgpu::RenderPipeline,
|
||||||
uniform_buffer: wgpu::Buffer,
|
uniform_buffer: wgpu::Buffer,
|
||||||
bind_group: wgpu::BindGroup,
|
bind_group: wgpu::BindGroup,
|
||||||
|
scene_scale: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderPipeline {
|
impl RenderPipeline {
|
||||||
pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat, wgsl_source: &str) -> Result<Self> {
|
pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat, wgsl_source: &str, scene_scale: f32) -> Result<Self> {
|
||||||
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
|
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
|
||||||
label: Some("scene"),
|
label: Some("scene"),
|
||||||
source: wgpu::ShaderSource::Wgsl(wgsl_source.into()),
|
source: wgpu::ShaderSource::Wgsl(wgsl_source.into()),
|
||||||
|
|
@ -42,7 +49,9 @@ impl RenderPipeline {
|
||||||
ty: wgpu::BindingType::Buffer {
|
ty: wgpu::BindingType::Buffer {
|
||||||
ty: wgpu::BufferBindingType::Uniform,
|
ty: wgpu::BufferBindingType::Uniform,
|
||||||
has_dynamic_offset: false,
|
has_dynamic_offset: false,
|
||||||
min_binding_size: None,
|
min_binding_size: wgpu::BufferSize::new(
|
||||||
|
std::mem::size_of::<Uniforms>() as u64
|
||||||
|
),
|
||||||
},
|
},
|
||||||
count: None,
|
count: None,
|
||||||
}],
|
}],
|
||||||
|
|
@ -92,7 +101,7 @@ impl RenderPipeline {
|
||||||
cache: None,
|
cache: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(Self { pipeline, uniform_buffer, bind_group })
|
Ok(Self { pipeline, uniform_buffer, bind_group, scene_scale })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_uniforms(
|
pub fn update_uniforms(
|
||||||
|
|
@ -105,12 +114,14 @@ impl RenderPipeline {
|
||||||
) {
|
) {
|
||||||
let uniforms = Uniforms {
|
let uniforms = Uniforms {
|
||||||
resolution: [width as f32, height as f32],
|
resolution: [width as f32, height as f32],
|
||||||
time,
|
viewport_offset: [0.0, 0.0],
|
||||||
_pad0: 0.0,
|
|
||||||
camera_pos: camera.position(),
|
camera_pos: camera.position(),
|
||||||
_pad1: 0.0,
|
time,
|
||||||
camera_target: camera.target,
|
camera_target: camera.target,
|
||||||
fov: camera.fov,
|
fov: camera.fov,
|
||||||
|
render_flags: [1.0, 1.0, 1.0, 0.0],
|
||||||
|
scene_scale: self.scene_scale,
|
||||||
|
_pad: [0.0; 3],
|
||||||
};
|
};
|
||||||
queue.write_buffer(&self.uniform_buffer, 0, bytemuck::bytes_of(&uniforms));
|
queue.write_buffer(&self.uniform_buffer, 0, bytemuck::bytes_of(&uniforms));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,9 @@ r#"struct Uniforms {
|
||||||
fov: f32,
|
fov: f32,
|
||||||
render_flags: vec4<f32>,
|
render_flags: vec4<f32>,
|
||||||
scene_scale: f32,
|
scene_scale: f32,
|
||||||
_pad: vec3<f32>,
|
_pad1: f32,
|
||||||
|
_pad2: f32,
|
||||||
|
_pad3: f32,
|
||||||
};
|
};
|
||||||
|
|
||||||
@group(0) @binding(0) var<uniform> u: Uniforms;
|
@group(0) @binding(0) var<uniform> u: Uniforms;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue