Advertisement
niedzwiedzw

Untitled

Dec 4th, 2022
1,080
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 7.85 KB | None | 0 0
  1. napisz mi kod w języku rust który rysuje sześcian 3d z teksturą podaną z pliku. zawrzyj wszystkie niezbędne importy, użyj biblioteki wgpu
  2.  
  3. use wgpu::{
  4.     Adapter, Device, Instance, Texture, TextureFormat, TextureViewDescriptor,
  5.     TextureViewDimension,
  6. };
  7. use wgpu_glyph::{ab_glyph::FontArc, GlyphBrushBuilder};
  8. use winit::{
  9.     dpi::LogicalSize,
  10.     event::{Event, WindowEvent},
  11.     event_loop::{ControlFlow, EventLoop},
  12.     window::{Window, WindowBuilder},
  13. };
  14.  
  15. fn main() {
  16.     // Tworzenie instancji i adaptera
  17.     let instance = Instance::new();
  18.     let adapter = Adapter::request(&instance, &wgpu::RequestAdapterOptions {
  19.         power_preference: wgpu::PowerPreference::Default,
  20.         compatible_surface: None,
  21.     }).unwrap();
  22.  
  23.     // Tworzenie okna
  24.     let event_loop = EventLoop::new();
  25.     let window = WindowBuilder::new()
  26.         .with_title("Sześcian 3D z teksturą")
  27.         .build(&event_loop)
  28.         .unwrap();
  29.  
  30.     // Tworzenie urządzenia i kontekstu
  31.     let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
  32.         extensions: wgpu::Extensions {
  33.             anisotropic_filtering: false,
  34.         },
  35.         limits: wgpu::Limits::default(),
  36.     });
  37.  
  38.     // Ładowanie tekstury z pliku
  39.     let texture_bytes = include_bytes!("texture.png");
  40.     let texture_rgba = image::load_from_memory(texture_bytes).unwrap().to_rgba();
  41.     let texture_dimensions = texture_rgba.dimensions();
  42.     let texture_data = texture_rgba.into_raw();
  43.     let texture = Texture::from_data(
  44.         &device,
  45.         &TextureDescriptor {
  46.             size: texture_dimensions,
  47.             mip_level_count: 1,
  48.             sample_count: 1,
  49.             dimension: TextureDimension::D2,
  50.             format: TextureFormat::Rgba8UnormSrgb,
  51.             usage: TextureUsage::SAMPLED | TextureUsage::COPY_DST,
  52.         },
  53.         &texture_data,
  54.     );
  55.     let texture_view = texture.create_view(&TextureViewDescriptor::default());
  56.  
  57.     // Tworzenie bufora wierzchołków
  58.     let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
  59.         label: None,
  60.         contents: bytemuck::cast_slice(&VERTICES),
  61.         usage: wgpu::BufferUsage::VERTEX,
  62.     });
  63.  
  64.     // Tworzenie bufora indeksów
  65.     let index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
  66.         label: None,
  67.         contents: bytemuck::cast_slice(&INDICES),
  68.         usage: wgpu::BufferUsage::INDEX,
  69.     });
  70.  
  71.     // Tworzenie bufora macierzy
  72.     let uniform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
  73.         label: None,
  74.         contents: bytemuck::cast_slice(&[Matrix4::identity()]),
  75.         usage: wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_DST,
  76.     });
  77.  
  78.     // Tworzenie paska tekstur
  79.     let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
  80.         address_mode_u: wgpu::AddressMode::ClampToEdge,
  81.         address_mode_v: wgpu::AddressMode::ClampToEdge,
  82.         address_mode_w: wgpu::AddressMode::ClampToEdge,
  83.         mag_filter: wgpu::FilterMode::Linear,
  84.         min_filter: wgpu::FilterMode::Nearest,
  85.         mipmap_filter: wgpu::FilterMode::Nearest,
  86.         ..Default::default()
  87.     });
  88.  
  89.     // Tworzenie paska tekstur
  90.     let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
  91.         bindings: &[
  92.             wgpu::BindGroupLayoutEntry {
  93.                 binding: 0,
  94.                 visibility: wgpu::ShaderStage::FRAGMENT,
  95.                 ty: wgpu::BindingType::Sampler { comparison: false },
  96.             },
  97.             wgpu::BindGroupLayoutEntry {
  98.                 binding: 1,
  99.                 visibility: wgpu::ShaderStage::FRAGMENT,
  100.                 ty: wgpu::BindingType::SampledTexture {
  101.                     multisampled: false,
  102.                     component_type: wgpu::TextureComponentType::Uint,
  103.                     dimension: wgpu::TextureViewDimension::D2,
  104.                 },
  105.             },
  106.             wgpu::BindGroupLayoutEntry {
  107.                 binding: 2,
  108.                 visibility: wgpu::ShaderStage::VERTEX,
  109.                 ty: wgpu::BindingType::UniformBuffer {
  110.                     dynamic: false,
  111.                     min_binding_size: None,
  112.                 },
  113.             },
  114.         ],
  115.         label: None,
  116.     });
  117.  
  118.     // Tworzenie grupy wiązań
  119.     let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
  120.         layout: &bind_group_layout,
  121.         bindings: &[
  122.             wgpu::Binding {
  123.                 binding: 0,
  124.                 resource: wgpu::BindingResource::Sampler(&sampler),
  125.             },
  126.             wgpu::Binding {
  127.                 binding: 1,
  128.                 resource: wgpu::BindingResource::TextureView(&texture_view),
  129.             },
  130.             wgpu::Binding {
  131.                 binding: 2,
  132.                 resource: wgpu::BindingResource::Buffer(uniform_buffer.slice(..)),
  133.             },
  134.         ],
  135.         label: None,
  136.     });
  137.  
  138.     // Tworzenie pipeline'u
  139.     let render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
  140.         bind_group_layouts: &[&bind_group_layout],
  141.     });
  142.     let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
  143.         layout: &render_pipeline_layout,
  144.         vertex_stage: wgpu::ProgrammableStageDescriptor {
  145.             module: &device.create_shader_module(wgpu::include_spirv!("shader.vert.spv")),
  146.             entry_point: "main",
  147.         },
  148.         fragment_stage: Some(wgpu::ProgrammableStageDescriptor {
  149.             module: &device.create_shader_module(wgpu::include_spirv!("shader.frag.spv")),
  150.             entry_point: "main",
  151.         }),
  152.         rasterization_state: Some(wgpu::RasterizationStateDescriptor {
  153.             front_face: wgpu::FrontFace::Ccw,
  154.             cull_mode: wgpu::CullMode::Back,
  155.             depth_bias: 0,
  156.             depth_bias_slope_scale: 0.0,
  157.             depth_bias_clamp: 0.0,
  158.         }),
  159.         primitive_topology: wgpu::PrimitiveTopology::TriangleList,
  160.         color_states: &[wgpu::ColorStateDescriptor {
  161.             format: wgpu::TextureFormat::Bgra8UnormSrgb,
  162.             color_blend: wgpu::BlendDescriptor::REPLACE,
  163.             alpha_blend: wgpu::BlendDescriptor::REPLACE,
  164.             write_mask: wgpu::ColorWrite::ALL,
  165.         }],
  166.         depth_stencil_state: None,
  167.         vertex_state: wgpu::VertexStateDescriptor {
  168.             index_format: wgpu::IndexFormat::Uint16,
  169.             vertex_buffers: &[Vertex::descriptor()],
  170.         },
  171.         sample_count: 1,
  172.         sample_mask: !0,
  173.         alpha_to_coverage_enabled: false,
  174.     });
  175.  
  176.     // Tworzenie bufora komend
  177.     let mut encoder =
  178.         device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
  179.  
  180.     // Tworzenie bufora komend
  181.     let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
  182.         color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor {
  183.             attachment: &frame.view,
  184.             resolve_target: None,
  185.             load_op: wgpu::LoadOp::Clear,
  186.             store_op: wgpu::StoreOp::Store,
  187.             clear_color: wgpu::Color {
  188.                 r: 0.1,
  189.                 g: 0.2,
  190.                 b: 0.3,
  191.                 a: 1.0,
  192.             },
  193.         }],
  194.         depth_stencil_attachment: None,
  195.     });
  196.  
  197.     // Ustawienie pipeline'u
  198.     render_pass.set_pipeline(&render_pipeline);
  199.  
  200.     // Ustawienie grupy wiązań
  201.     render_pass.set_bind_group(0, &bind_group, &[]);
  202.  
  203.     // Ustawienie bufora wierzchołków
  204.     render_pass.set_vertex_buffer(0, vertex_buffer.slice(..));
  205.  
  206.     // Ustawienie bufora indeksów
  207.     render_pass.set_index_buffer(index_buffer.slice(..));
  208.  
  209.     // Rysowanie sześcianu
  210.     render_pass.draw_indexed(0..INDICES.len() as u32, 0, 0..1);
  211.  
  212.     // Koniec bufora komend
  213.     drop(render_pass);
  214.  
  215.     // Wyślij bufor komend do urządzenia
  216.     queue.submit(&[encoder.finish()]);
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement