transparency first version

This commit is contained in:
zomseffen 2025-01-30 11:03:30 +01:00
parent f0fa28bdd8
commit 66902df99c
14 changed files with 225 additions and 92 deletions

View file

@ -1,5 +1,6 @@
use anyhow::{anyhow, Result};
use cgmath::Point3;
use vulkanalia::prelude::v1_0::*;
use std::mem::size_of;
@ -10,6 +11,7 @@ pub type Mat4 = cgmath::Matrix4<f32>;
use crate::app_data;
use crate::command_buffer;
use crate::vertex::VertexContainer;
use crate::scene;
pub unsafe fn create_buffer(
instance: &Instance,
@ -163,9 +165,6 @@ pub unsafe fn create_index_buffer(
vk::MemoryPropertyFlags::DEVICE_LOCAL,
)?;
let index_buffer = index_buffer;
let index_buffer_memory = index_buffer_memory;
copy_buffer(device, data, staging_buffer, index_buffer, size)?;
device.destroy_buffer(staging_buffer, None);
@ -181,6 +180,7 @@ pub struct UniformBufferObject {
pub geom_rot: Mat4,
pub view: Mat4,
pub proj: Mat4,
pub camera_pos: Point3<f32>,
pub use_geom_shader: [bool; 16],
}
@ -192,7 +192,7 @@ pub unsafe fn create_descriptor_set_layout(
.binding(0)
.descriptor_type(vk::DescriptorType::UNIFORM_BUFFER)
.descriptor_count(1)
.stage_flags(vk::ShaderStageFlags::VERTEX | vk::ShaderStageFlags::GEOMETRY);
.stage_flags(vk::ShaderStageFlags::VERTEX | vk::ShaderStageFlags::GEOMETRY | vk::ShaderStageFlags::FRAGMENT);
let sampler_binding = vk::DescriptorSetLayoutBinding::builder()
.binding(1)
@ -254,8 +254,8 @@ pub unsafe fn create_storage_buffers(
device,
data,
data.scene_rt_memory_size,
vk::BufferUsageFlags::STORAGE_BUFFER,
vk::MemoryPropertyFlags::HOST_COHERENT | vk::MemoryPropertyFlags::HOST_VISIBLE,
vk::BufferUsageFlags::TRANSFER_DST | vk::BufferUsageFlags::STORAGE_BUFFER,
vk::MemoryPropertyFlags::DEVICE_LOCAL,
)?;
data.storage_buffers.push(storage_buffer);
@ -265,6 +265,41 @@ pub unsafe fn create_storage_buffers(
Ok(())
}
pub unsafe fn update_storage_buffer(
instance: &Instance,
device: &Device,
data: &app_data::AppData,
image_index: usize,
scene_handler: &scene::Scene,
) -> Result<()> {
let (staging_buffer, staging_buffer_memory) = create_buffer(
instance,
device,
data,
data.scene_rt_memory_size,
vk::BufferUsageFlags::TRANSFER_SRC,
vk::MemoryPropertyFlags::HOST_COHERENT | vk::MemoryPropertyFlags::HOST_VISIBLE,
)?;
let memory = device.map_memory(
staging_buffer_memory,
0,
data.scene_rt_memory_size,
vk::MemoryMapFlags::empty(),
)?;
memcpy(scene_handler.rt_memory.as_ptr(), memory.cast(), scene_handler.rt_memory.len());
device.unmap_memory(staging_buffer_memory);
copy_buffer(device, data, staging_buffer, data.storage_buffers[image_index], data.scene_rt_memory_size)?;
device.destroy_buffer(staging_buffer, None);
device.free_memory(staging_buffer_memory, None);
Ok(())
}
pub unsafe fn create_descriptor_pool(device: &Device, data: &mut app_data::AppData) -> Result<()> {
let ubo_size = vk::DescriptorPoolSize::builder()
.type_(vk::DescriptorType::UNIFORM_BUFFER)