diff --git a/Cargo.lock b/Cargo.lock index f649aad..eee3982 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,6 +389,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + [[package]] name = "foreign-types" version = "0.3.2" @@ -431,6 +443,31 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + [[package]] name = "gimli" version = "0.28.0" @@ -438,10 +475,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] -name = "glow" -version = "0.12.3" +name = "gl_generator" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "886c2a30b160c4c6fec8f987430c26b526b7988ca71f664e6a699ddf6f9601e4" dependencies = [ "js-sys", "slotmap", @@ -449,6 +497,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + [[package]] name = "gpu-alloc" version = "0.6.0" @@ -470,12 +527,13 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" +checksum = "40fe17c8a05d60c38c0a4e5a3c802f2f1ceb66b76c67d96ffb34bef0475a7fad" dependencies = [ "backtrace", "log", + "presser", "thiserror", "winapi", "windows", @@ -489,7 +547,7 @@ checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ "bitflags 2.4.1", "gpu-descriptor-types", - "hashbrown 0.14.2", + "hashbrown", ] [[package]] @@ -501,12 +559,6 @@ dependencies = [ "bitflags 2.4.1", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.2" @@ -550,16 +602,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - [[package]] name = "indexmap" version = "2.1.0" @@ -567,7 +609,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown", ] [[package]] @@ -619,15 +661,21 @@ dependencies = [ [[package]] name = "khronos-egl" -version = "4.1.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.7.4", + "libloading 0.8.1", "pkg-config", ] +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "lazy_static" version = "1.4.0" @@ -738,9 +786,9 @@ dependencies = [ [[package]] name = "metal" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ "bitflags 2.4.1", "block", @@ -781,15 +829,15 @@ dependencies = [ [[package]] name = "naga" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" +checksum = "61d829abac9f5230a85d8cc83ec0879b4c09790208ae25b5ea031ef84562e071" dependencies = [ "bit-set", "bitflags 2.4.1", "codespan-reporting", "hexf-parse", - "indexmap 1.9.3", + "indexmap", "log", "num-traits", "rustc-hash", @@ -826,6 +874,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + [[package]] name = "ndk" version = "0.7.0" @@ -1084,12 +1141,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - [[package]] name = "pkg-config" version = "0.3.27" @@ -1115,6 +1166,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1229,7 +1286,6 @@ dependencies = [ "log", "nalgebra", "pollster", - "tokio", "wgpu", "winit", ] @@ -1346,6 +1402,15 @@ dependencies = [ "wayland-protocols", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -1444,16 +1509,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tokio" -version = "1.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" -dependencies = [ - "backtrace", - "pin-project-lite", -] - [[package]] name = "toml_datetime" version = "0.6.5" @@ -1466,7 +1521,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap", "toml_datetime", "winnow", ] @@ -1670,12 +1725,13 @@ dependencies = [ [[package]] name = "wgpu" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed547920565c56c7a29afb4538ac5ae5048865a5d2f05bff3ad4fbeb921a9a2c" +checksum = "30e7d227c9f961f2061c26f4cb0fbd4df0ef37e056edd0931783599d6c94ef24" dependencies = [ "arrayvec", "cfg-if", + "flume", "js-sys", "log", "naga", @@ -1694,9 +1750,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f8a44dd301a30ceeed3c27d8c0090433d3da04d7b2a4042738095a424d12ae7" +checksum = "837e02ddcdc6d4a9b56ba4598f7fd4202a7699ab03f6ef4dcdebfad2c966aea6" dependencies = [ "arrayvec", "bit-vec", @@ -1717,9 +1773,9 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.17.2" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a80bf0e3c77399bb52850cb0830af9bad073d5cfcb9dd8253bef8125c42db17" +checksum = "1e30b9a8155c83868e82a8c5d3ce899de6c3961d2ef595de8fc168a1677fc2d8" dependencies = [ "android_system_properties", "arrayvec", @@ -1730,6 +1786,7 @@ dependencies = [ "core-graphics-types", "d3d12", "glow", + "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", @@ -1742,6 +1799,7 @@ dependencies = [ "metal", "naga", "objc", + "once_cell", "parking_lot", "profiling", "range-alloc", @@ -1758,9 +1816,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" +checksum = "0d5ed5f0edf0de351fe311c53304986315ce866f394a2e6df0c4b3c70774bcdd" dependencies = [ "bitflags 2.4.1", "js-sys", @@ -1816,11 +1874,21 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.44.0" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-targets 0.42.2", + "windows-core", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index cca3b8d..aeaefc1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,12 +4,15 @@ version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[package.include] +"shaders" = "shaders" + [dependencies] cfg-if = "1" -nalgebra = "0.32.3" winit = "0.28" env_logger = "0.10" log = "0.4" +wgpu = "0.18" pollster = "0.3" -wgpu = "0.17" -tokio = "1.34.0" +nalgebra = "0.32.3" + diff --git a/src/display.rs b/src/display.rs deleted file mode 100644 index b38626b..0000000 --- a/src/display.rs +++ /dev/null @@ -1,197 +0,0 @@ -use std::borrow::Cow; -use std::fs; -use std::iter; - -use wgpu::ShaderModuleDescriptor; -use winit::{ - event::*, - event_loop::{ControlFlow, EventLoop}, - window::Window, - window::WindowBuilder, -}; - -pub struct Display { - //Surface we will draw two - surface: wgpu::Surface, - // Description of a surface - config: wgpu::SurfaceConfiguration, - //Device we will he using to render - device: wgpu::Device, - // Command query for a divice - queue: wgpu::Queue, - size: winit::dpi::PhysicalSize, - // The window must be declared after the surface so - // it gets dropped after it as the surface contains - // unsafe references to the window's resources. - window: winit::window::Window, - // Handle to a rendering pipeline - render_pipeline: wgpu::RenderPipeline, - clear_color: wgpu::Color, -} - -impl Display { - // Creating some of the wgpu types requires async code - pub async fn new(window: Window, shader_filename: String) -> Self { - //Self explaining, the window size - let size = window.inner_size(); - // Backends to handle our gpu - let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { - backends: wgpu::Backends::all(), - dx12_shader_compiler: Default::default(), - }); - // Surface needs to be alive as long as window is created - let surface = unsafe { instance.create_surface(&window) }.unwrap(); - // Handles our graphics card, gets backend the adapter uses - // Compatible surface fields tells wgpu whats a adapter that can supply a surface - let adapter = instance - .request_adapter(&wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::default(), - compatible_surface: Some(&surface), - force_fallback_adapter: false, - }) - .await - .unwrap(); - // Use the adapter to create a device and queue - // Includes limitations on the graphics card - let (device, queue) = adapter - .request_device( - &wgpu::DeviceDescriptor { - features: wgpu::Features::empty(), - // WebGL doesn't support all of wgpu's features, so if - // we're building for the web we'll have to disable some. - limits: wgpu::Limits::default(), - label: None, - }, - None, // Trace path - ) - .await - .unwrap(); - // Some surfaces have different capabilities, get the capabilities - let surface_caps = surface.get_capabilities(&adapter); - // Find how surface textures will be stored on the GPU - let surface_format = surface_caps - .formats - .iter() - .copied() - .find(|f| f.is_srgb()) - .unwrap_or(surface_caps.formats[0]); - let config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: surface_format, - width: size.width, - height: size.height, - present_mode: surface_caps.present_modes[0], - alpha_mode: surface_caps.alpha_modes[0], - view_formats: vec![], - }; - surface.configure(&device, &config); - //Load a shader into our device and get a module handler - let shader_contents = - fs::read_to_string(shader_filename).expect("Failed to read shader file"); - - let shader = device.create_shader_module(ShaderModuleDescriptor { - label: Some("Shader.wgsl"), - source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(&shader_contents)), - }); - - //Create pipeline layout using device - let render_pipeline_layout = - device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: Some("Render Pipeline Layout"), - bind_group_layouts: &[], - push_constant_ranges: &[], - }); - //Create final render pipeline - let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Render Pipeline"), - layout: Some(&render_pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: "vs_main", // 1. - buffers: &[], // 2. - }, - fragment: Some(wgpu::FragmentState { - // 3. - module: &shader, - entry_point: "fs_main", - targets: &[Some(wgpu::ColorTargetState { - // 4. - format: config.format, - blend: Some(wgpu::BlendState::REPLACE), - write_mask: wgpu::ColorWrites::ALL, - })], - }), - primitive: wgpu::PrimitiveState { - topology: wgpu::PrimitiveTopology::TriangleList, // 1. - strip_index_format: None, - front_face: wgpu::FrontFace::Ccw, // 2. - cull_mode: Some(wgpu::Face::Back), - // Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE - polygon_mode: wgpu::PolygonMode::Fill, - // Requires Features::DEPTH_CLIP_CONTROL - unclipped_depth: false, - // Requires Features::CONSERVATIVE_RASTERIZATION - conservative: false, - }, - depth_stencil: None, // 1. - multisample: wgpu::MultisampleState { - count: 1, // 2. - mask: !0, // 3. - alpha_to_coverage_enabled: false, // 4. - }, - multiview: None, // 5. - }); - - let clear_color = wgpu::Color { - r: 0.0, - g: 0.0, - b: 0.0, - a: 1.0, - }; - - Self { - window, - surface, - device, - queue, - config, - size, - render_pipeline, - clear_color, - } - } -} -impl Display { - pub fn render( - &mut self, - render_function: fn( - &wgpu::Device, - &wgpu::Queue, - &wgpu::SurfaceTexture, - &wgpu::RenderPipeline, - ) -> Result<(), wgpu::SurfaceError>, - ) -> Result<(), wgpu::SurfaceError> { - let texture = &self.surface.get_current_texture().expect("All good"); - render_function(&self.device, &self.queue, &texture, &self.render_pipeline) - } -} -impl Display { - pub fn window(&self) -> &Window { - &self.window - } - - pub fn resize(&mut self, new_size: winit::dpi::PhysicalSize) { - self.size = new_size; - self.config.width = new_size.width; - self.config.height = new_size.height; - self.surface.configure(&self.device, &self.config); - } - - pub fn get_size(&self) -> winit::dpi::PhysicalSize { - self.size - } - - pub fn update_surface(&self) { - self.resize(self.get_size()) - } -} diff --git a/src/main.rs b/src/main.rs index d297e53..ca55e83 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,146 +1,11 @@ #![allow(dead_code)] #![allow(unused_imports)] #![allow(unused_variables)] -//Use our ray module -mod ray; -use ray::Ray; -//Use our display -pub mod display; -use display::Display; //Use linear algebra module -use nalgebra::Vector4; -//Use modules for wgpu -use std::iter; -use winit::{ - event::*, - event_loop::{ControlFlow, EventLoop}, - window::Window, - window::WindowBuilder, -}; -pub struct Program { - display: Display, -} - -impl Program { - pub async fn new() -> Self { - let event_loop = EventLoop::new(); - let window = WindowBuilder::new().build(&event_loop).unwrap(); - let display = Display::new(window, "shader.wgsl".to_string()).await; - Program { display } - } -impl Program {} - async fn start_event_loop(mut self) { - let event_loop = EventLoop::new(); - let window = WindowBuilder::new().build(&event_loop).unwrap(); - - event_loop.run(move |event, _, control_flow| match event { - Event::WindowEvent { - ref event, - window_id, - } if window_id == window.id() => { - if !self.input(event) { - match event { - WindowEvent::CloseRequested - | WindowEvent::KeyboardInput { - input: - KeyboardInput { - state: ElementState::Pressed, - virtual_keycode: Some(VirtualKeyCode::Escape), - .. - }, - .. - } => *control_flow = ControlFlow::Exit, - WindowEvent::Resized(physical_size) => { - self.display.resize(*physical_size); - } - WindowEvent::ScaleFactorChanged { new_inner_size, .. } => { - self.display.resize(**new_inner_size); - } - _ => {} - } - } - } - Event::RedrawRequested(window_id) if window_id == window.id() => { - self.update(); - match self.display.render(Self::render) { - Ok(_) => {} - Err(wgpu::SurfaceError::Lost | wgpu::SurfaceError::Outdated) => { - self.display.update_surface(); - } - Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit, - Err(wgpu::SurfaceError::Timeout) => log::warn!("Surface timeout"), - } - } - Event::RedrawEventsCleared => { - window.request_redraw(); - } - _ => {} - }); - } - - fn input(&self, event: &WindowEvent) -> bool { - match event { - WindowEvent::MouseInput { .. } => true, - WindowEvent::KeyboardInput { input, .. } => { - match input.virtual_keycode.expect("Not a keycode") { - VirtualKeyCode::Space => true, - _ => false, - } - } - _ => true, - } - } - - fn update(&mut self) {} - - fn render( - device: &wgpu::Device, - queue: &wgpu::Queue, - output: &wgpu::SurfaceTexture, - render_pipeline: &wgpu::RenderPipeline, - ) -> Result<(), wgpu::SurfaceError> { - let view = output - .texture - .create_view(&wgpu::TextureViewDescriptor::default()); - - let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Render Encoder"), - }); - - { - let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("Render Pass"), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color { - r: 1.0, - b: 1.0, - g: 1.0, - a: 1.0, - }), - store: true, - }, - })], - depth_stencil_attachment: None, - }); - - render_pass.set_pipeline(render_pipeline); - render_pass.draw(0..3, 0..1); // 3. - } - - // submit will accept anything that implements IntoIter - queue.submit(std::iter::once(encoder.finish())); - output.present(); - Ok(()) - } -} - -//MAIN --------------------------------------------------------------------------------- -#[tokio::main] -async fn main() { - let program = Program::new(); - program.start_event_loop().await; +pub mod state; +use state::run; + +fn main() { + pollster::block_on(run()); } diff --git a/src/shader.wgsl b/src/shader.wgsl deleted file mode 100644 index ee3788e..0000000 --- a/src/shader.wgsl +++ /dev/null @@ -1,26 +0,0 @@ -// Vertex shader - -struct VertexOutput { - @builtin(position) clip_position: vec4, - @location(0) color: vec4, -}; - -@vertex -fn vs_main(@builtin(vertex_index) in_vertex_index: u32,) -> VertexOutput { - var out: VertexOutput; - let x = f32(1 - i32(in_vertex_index)) * 0.5; - let y = f32(i32(in_vertex_index & 1u) * 2 - 1) * 0.5; - out.clip_position = vec4(x, y, 0.0, 1.0); - out.color = vec4(1.0/(f32(in_vertex_index)+1.0),1.0/(f32(in_vertex_index)+1.0),1.0/(f32(in_vertex_index)+1.0),1.0); - - return out; -} - -@fragment -fn fs_main(in: VertexOutput) -> @location(0) vec4 { - return in.color; -} -@fragment -fn fs_alt(in: VertexOutput) -> @location(0) vec4 { - return vec4(0.3, 0.7, 0.7, 1.0); -}