소스 검색

Added texture, + start of the heightmap

Ghastrod 1 년 전
부모
커밋
34d8b7a555
5개의 변경된 파일761개의 추가작업 그리고 2개의 파일을 삭제
  1. 677 2
      Cargo.lock
  2. 2 0
      Cargo.toml
  3. 1 0
      src/main.rs
  4. 1 0
      src/texture/mod.rs
  5. 80 0
      src/texture/texture_struct.rs

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 677 - 2
Cargo.lock


+ 2 - 0
Cargo.toml

@@ -4,12 +4,14 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
+anyhow = "1.0.86"
 bytemuck = { version = "1.16.0", features = ["derive"] }
 cfg-if = "1.0.0"
 chrono = "0.4.38"
 egui = "0.27.2"
 env_logger = "0.11.3"
 glam = "0.27.0"
+image = "0.25.1"
 log = "0.4"
 pollster = "0.3.0"
 serde = { version = "1.0.203", features = ["derive"] }

+ 1 - 0
src/main.rs

@@ -7,6 +7,7 @@ mod compute;
 mod sky;
 mod wireframe;
 mod object;
+mod texture;
 fn main() {
     println!("wgpu5 launched");
     pollster::block_on(run());

+ 1 - 0
src/texture/mod.rs

@@ -0,0 +1 @@
+pub mod texture_struct;

+ 80 - 0
src/texture/texture_struct.rs

@@ -0,0 +1,80 @@
+use anyhow::*;
+use image::GenericImageView;
+
+pub struct Texture {
+    pub texture: wgpu::Texture,
+    pub view: wgpu::TextureView,
+    pub sampler: wgpu::Sampler,
+}
+
+impl Texture {
+    pub fn from_bytes(
+        device: &wgpu::Device,
+        queue: &wgpu::Queue,
+        bytes: &[u8],
+        label: &str,
+    ) -> Result<Self> {
+        let img = image::load_from_memory(bytes)?;
+        Self::from_image(device, queue, &img, Some(label))
+    }
+
+    pub fn from_image(
+        device: &wgpu::Device,
+        queue: &wgpu::Queue,
+        img: &image::DynamicImage,
+        label: Option<&str>,
+    ) -> Result<Self> {
+        let rgba = img.to_rgba8();
+        let dimensions = img.dimensions();
+
+        let size = wgpu::Extent3d {
+            width: dimensions.0,
+            height: dimensions.1,
+            depth_or_array_layers: 1,
+        };
+        let format = wgpu::TextureFormat::Rgba8UnormSrgb;
+        let texture = device.create_texture(&wgpu::TextureDescriptor {
+            label,
+            size,
+            mip_level_count: 1,
+            sample_count: 1,
+            dimension: wgpu::TextureDimension::D2,
+            format,
+            usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
+            view_formats: &[],
+        });
+
+        queue.write_texture(
+            wgpu::ImageCopyTexture {
+                aspect: wgpu::TextureAspect::All,
+                texture: &texture,
+                mip_level: 0,
+                origin: wgpu::Origin3d::ZERO,
+            },
+            &rgba,
+            wgpu::ImageDataLayout {
+                offset: 0,
+                bytes_per_row: Some(4 * dimensions.0),
+                rows_per_image: Some(dimensions.1),
+            },
+            size,
+        );
+
+        let view = texture.create_view(&wgpu::TextureViewDescriptor::default());
+        let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
+            address_mode_u: wgpu::AddressMode::ClampToEdge,
+            address_mode_v: wgpu::AddressMode::ClampToEdge,
+            address_mode_w: wgpu::AddressMode::ClampToEdge,
+            mag_filter: wgpu::FilterMode::Linear,
+            min_filter: wgpu::FilterMode::Nearest,
+            mipmap_filter: wgpu::FilterMode::Nearest,
+            ..Default::default()
+        });
+
+        Ok(Self {
+            texture,
+            view,
+            sampler,
+        })
+    }
+}

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.