début renderer
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
# Shaders Directory
|
||||||
|
|
||||||
|
Contains WGSL shader source files compiled at runtime by wgpu. Each file defines vertex and fragment stages for a specific rendering pipeline.
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
- **basic_shader.wgsl** — Simple triangle shader used as a minimal example. Renders a solid red triangle using hardcoded positions computed entirely on the GPU side.
|
||||||
@@ -1,14 +1,20 @@
|
|||||||
|
//! # Basic Shader Module
|
||||||
|
struct VertexInput {
|
||||||
|
@location(0) position: vec3<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexOutput {
|
||||||
|
@builtin(position) clip_position: vec4<f32>,
|
||||||
|
};
|
||||||
|
|
||||||
@vertex
|
@vertex
|
||||||
pub fn vs_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
|
fn vs_main(model: VertexInput) -> VertexOutput {
|
||||||
var positions = array<vec2f, 3>(
|
var out: VertexOutput;
|
||||||
vec2f(0.0, 0.5),
|
out.clip_position = vec4<f32>(model.position, 1.0);
|
||||||
vec2f(-0.5, -0.5),
|
return out;
|
||||||
vec2f(0.5, -0.5),
|
|
||||||
);
|
|
||||||
return vec4f(positions[vertex_index], 0.0, 1.0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@fragment
|
@fragment
|
||||||
pub fn fs_main() -> @location(0) vec4f {
|
fn fs_main() -> @location(0) vec4<f32> {
|
||||||
return vec4f(1.0, 0.0, 0.0, 1.0);
|
return vec4<f32>(1.0, 0.5, 0.2, 1.0); // Couleur orange
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-2
@@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
use crate::conf::BASIC_SHADER;
|
use crate::conf::BASIC_SHADER;
|
||||||
|
|
||||||
|
// On demande à Cargo de surveiller ce fichier (si le wsgl est modifié, mais pas la lib)
|
||||||
|
const _: &[u8] = include_bytes!("../assets/shaders/basic_shader.wgsl");
|
||||||
|
|
||||||
/// Renders geometry using a fixed RenderPipeline. This struct owns heavy objects
|
/// Renders geometry using a fixed RenderPipeline. This struct owns heavy objects
|
||||||
/// (RenderPipeline) compiled once at creation time, avoiding per-frame allocation.
|
/// (RenderPipeline) compiled once at creation time, avoiding per-frame allocation.
|
||||||
pub struct Renderer {
|
pub struct Renderer {
|
||||||
@@ -19,10 +22,15 @@ impl Renderer {
|
|||||||
/// by the orchestrator (main.rs). The pipeline is compiled only here; subsequent calls are cheap.
|
/// by the orchestrator (main.rs). The pipeline is compiled only here; subsequent calls are cheap.
|
||||||
pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self {
|
pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self {
|
||||||
// In wgpu 30, ShaderModuleDescriptor fields changed: label is Option<&str> (not Some(label)),
|
// In wgpu 30, ShaderModuleDescriptor fields changed: label is Option<&str> (not Some(label)),
|
||||||
// and source uses Cow<'_, str> instead of [u8]. include_str! + .into() converts &str → Cow<str>.
|
// and source uses Cow<'_, str> instead of [u8].
|
||||||
|
// BASIC_SHADER serves as both the debug label and the file path loaded at runtime
|
||||||
|
// (include_str!() requires a string literal, not a variable).
|
||||||
|
// See assets/shaders/basic_shader.wgsl for the WGSL source — defines vs_main + fs_main stages.
|
||||||
|
let shader_source =
|
||||||
|
std::fs::read_to_string(BASIC_SHADER).expect("Failed to read shader file");
|
||||||
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
|
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
|
||||||
label: Some(BASIC_SHADER),
|
label: Some(BASIC_SHADER),
|
||||||
source: wgpu::ShaderSource::Wgsl(include_str!("../assets/shaders/basic_shader.wgsl").into()),
|
source: wgpu::ShaderSource::Wgsl(shader_source.into()),
|
||||||
});
|
});
|
||||||
|
|
||||||
// push_constant_ranges → removed in wgpu 30; replaced by immediate_size for var<immediate> support.
|
// push_constant_ranges → removed in wgpu 30; replaced by immediate_size for var<immediate> support.
|
||||||
@@ -98,4 +106,8 @@ impl Renderer {
|
|||||||
drop(render_pass);
|
drop(render_pass);
|
||||||
queue.submit(std::iter::once(encoder.finish()));
|
queue.submit(std::iter::once(encoder.finish()));
|
||||||
}
|
}
|
||||||
|
// méthode utilitaire pour cacher le "bruit"
|
||||||
|
pub fn submit_commands(&self, queue: &wgpu::Queue, encoder: wgpu::CommandEncoder) {
|
||||||
|
queue.submit(std::iter::once(encoder.finish()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user