One sampler per texture

This commit is contained in:
2021-02-20 22:44:03 +01:00
parent ad6b0730d5
commit 277d284994
4 changed files with 22 additions and 16 deletions

View File

@@ -25,13 +25,13 @@ use winit::window::{Window, WindowBuilder};
use mesh::CPUMesh;
use pipelines::{Drawcall, LineShader};
use pipelines::{line_vs::ty::LinePushConstants};
use pipelines::line_vs::ty::LinePushConstants;
use pipelines::DefaultShader;
use pipelines::vs;
use pipelines::vs::ty::PushConstants;
use crate::config::RenderConfig;
use crate::vulkan::{gameobject::{GameObject, GameObjectHandle}};
use crate::vulkan::gameobject::{GameObject, GameObjectHandle};
pub mod pipelines;
pub mod gameobject;
@@ -83,6 +83,10 @@ pub struct MeshHandle {
}
pub(crate) type TextureHandle = usize;
pub struct Texture {
pub image: Arc<ImmutableImage<Format>>,
pub sampler: Arc<Sampler>
}
pub struct GameData {
pub start_time: SystemTime,
@@ -94,7 +98,7 @@ pub struct GameData {
pub shutdown: bool,
pub game_objects: Vec<GameObject>,
pub meshes: Vec<Mesh>,
pub textures: Vec<Arc<ImmutableImage<Format>>>,
pub textures: Vec<Texture>,
pub use_line_pipeline: bool,
}
@@ -104,7 +108,6 @@ pub struct VulkanRenderer {
pub game_data: GameData,
pub device: Arc<Device>,
pub framebuffers: Vec<Arc<dyn FramebufferAbstract + Send + Sync>>,
pub sampler: Arc<Sampler>,
pub dynamic_state: DynamicState,
pub pipelines: Vec<Box<dyn Drawcall>>,
pub surface: Arc<Surface<Window>>,
@@ -243,10 +246,6 @@ impl VulkanRenderer {
// Render pass
let render_pass = renderpass::create_render_pass(device.clone(), &render_config, swapchain.format());
let sampler = Sampler::new(device.clone(), Filter::Linear, Filter::Linear,
MipmapMode::Nearest, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat,
SamplerAddressMode::Repeat, 0.0, 1.0, 0.0, 0.0).unwrap();
let line_vertex_buffer = CpuAccessibleBuffer::from_iter(device.clone(), BufferUsage::vertex_buffer(), false, data.line_vertices.iter().cloned()).unwrap();
let pipelines: Vec<Box<dyn Drawcall>> = vec![
@@ -292,7 +291,7 @@ impl VulkanRenderer {
// that, we store the submission of the previous frame here.
let previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
(VulkanRenderer { game_data: data, device, framebuffers, sampler,
(VulkanRenderer { game_data: data, device, framebuffers,
dynamic_state, pipelines, uniform_buffers,
surface, swapchain, render_pass, queue,
recreate_swapchain: false, debug_callback, previous_frame_end,
@@ -348,7 +347,7 @@ impl VulkanRenderer {
self.pipelines = vec![
Box::new(DefaultShader::new(self.device.clone(), self.render_pass.clone())),
Box::new(LineShader::new(self.device.clone(), self.render_pass.clone(), self.line_vertex_buffer.clone())),
// Box::new(LineShader::new(self.device.clone(), self.render_pass.clone(), self.line_vertex_buffer.clone())),
];
self.swapchain = new_swapchain;
@@ -432,7 +431,7 @@ impl VulkanRenderer {
self.game_data.meshes.len() - 1
}
pub fn upload_texture(self: &mut Self, texture_data: &gltf::image::Data) {
pub fn upload_texture(self: &mut Self, texture_data: &gltf::image::Data, device: Arc<Device>) {
// Format buffer on cpu for upload
let buffer: ImageBuffer<Rgb<u8>, Vec<u8>> = image::ImageBuffer::from_raw(texture_data.width, texture_data.height, texture_data.pixels.clone()).unwrap();
let new_buffer: ImageBuffer<Rgba<u8>, Vec<u8>> = buffer.convert();
@@ -448,7 +447,11 @@ impl VulkanRenderer {
let (image_view, future) = ImmutableImage::from_buffer(source.clone(), dimensions, MipmapsCount::Log2, Format::R8G8B8A8Unorm, self.queue.clone()).unwrap();
future.flush().unwrap();
self.game_data.textures.push(image_view);
let sampler = Sampler::new(device.clone(), Filter::Linear, Filter::Linear,
MipmapMode::Linear, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat,
SamplerAddressMode::Repeat, 0.0, 1.0, 0.0, image_view.mipmap_levels() as f32).unwrap();
self.game_data.textures.push(Texture { image: image_view, sampler });
}
pub fn add_game_object(self: &mut Self, mut game_object: GameObject, pipeline_index: usize) -> GameObjectHandle {