Compare commits

...

1 Commits

Author SHA1 Message Date
Avery ef6da3658e
Skybox rendering, broken
1 week ago

@ -19,13 +19,14 @@
devShells.default = pkgs.mkShell {
VULKAN_SDK = "${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d";
# LD_LIBRARY_PATH = "$LD_LIBRARY_PATH:${pkgs.SDL2}/lib/";
LD_LIBRARY_PATH = lib.makeLibraryPath (with pkgs; [SDL2 vulkan-loader]);
LD_LIBRARY_PATH = lib.makeLibraryPath (with pkgs; [SDL2 vulkan-loader vulkan-validation-layers]);
buildInputs = with pkgs; [
SDL2
SDL2.dev
vulkan-headers
vulkan-loader
vulkan-validation-layers # maybe?
shaderc
# glm and whatnot …
];
};

Binary file not shown.

@ -1,4 +1,7 @@
#version 450
// vim: ft=c
//
layout(binding = 1) uniform samplerCube combined_image;
layout(location = 0) out vec4 outColor;
@ -10,7 +13,8 @@ layout(push_constant, std430) uniform pc {
};
void main() {
outColor = vec4(data.rgb*(1.0+dot(normal.xyz, normalize(vec3(-0.7, -0.5, -0.1))))/2.0, 1.0);
outColor = texture(combined_image, vec3(pos_pre));
// outColor = vec4(data.rgb*(1.0+dot(normal.xyz, normalize(vec3(-0.7, -0.5, -0.1))))/2.0, 1.0);
//if(pos_post.z <= 0.0) {
// outColor = vec4(1.0);
//}

Binary file not shown.

Binary file not shown.

@ -75,7 +75,7 @@ void main() {
// apply view's origin transformation
//gl_Position.xyz += cam_orig.xyz;
gl_Position *= view_orig;
// gl_Position *= view_orig;
// apply view's xz rotation
//mat2 xz_rot;

@ -1,4 +1,3 @@
#![feature(inherent_str_constructors)]
#![allow(unused_variables, unused_mut)]
use ash::Device;
@ -6,6 +5,7 @@ use ash::Entry;
use ash::Instance;
use ash::khr::{surface, swapchain};
use ash::vk;
use ash::vk::ImageCreateFlags;
use sdl2::mouse::MouseUtil;
use std::cmp;
@ -26,7 +26,6 @@ use sdl2::video::Window;
const APP_NAME: &str = "MineClone";
const MOV_STEP: f32 = 0.05;
const ROT_STEP: f32 = 0.05;
const ROT_MOUSE_SCALE: f32 = 0.001;
const MAX_WIDTH: u32 = 3440;
@ -34,26 +33,123 @@ const MAX_HEIGHT: u32 = 1440;
const MESH_SIZE: u64 = 36 * 2 * 4 * 4;
#[rustfmt::skip]
const POSITIONS: [f32; 36 * 2 * 4] = [
// BOTTOM
-0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 2.0, 1.0, 0.0, 1.0, 0.0, 0.0, -0.5, 0.5, 2.0,
1.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 2.0, 1.0, 0.0, 1.0,
0.0, 0.0, -0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // TOP
0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, -0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, -0.5,
-0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.5, -0.5, 1.0,
1.0, 0.0, -1.0, 0.0, 0.0, -0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, // FRONT
-0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.5, 0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, -0.5, 0.5,
1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.5, 0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0, -0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, // BACK
0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, -0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, -0.5, 0.5,
2.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.5, -0.5, 2.0, 1.0, 0.0,
0.0, 1.0, 0.0, -0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, // LEFT
-0.5, -0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5, 0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5,
-0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5, 0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, -0.5, 0.5, 2.0,
1.0, -1.0, 0.0, 0.0, 0.0, -0.5, -0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, // RIGHT
0.5, 0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, -0.5,
2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 1.0,
0.0, 0.0, 0.0, 0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0,
-0.5, 0.5, -0.5, 1.0,
0.0, 1.0, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0,
0.0, 1.0, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0,
0.0, 1.0, 0.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.0, 1.0, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0,
0.0, 1.0, 0.0, 0.0,
-0.5, 0.5, -0.5, 1.0,
0.0, 1.0, 0.0, 0.0,
// TOP
0.5, -0.5, 0.5, 1.0,
0.0, -1.0, 0.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
0.0, -1.0, 0.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
0.0, -1.0, 0.0, 0.0,
0.5, -0.5, 0.5, 1.0,
0.0, -1.0, 0.0, 0.0,
0.5, -0.5, -0.5, 1.0,
0.0, -1.0, 0.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
0.0, -1.0, 0.0, 0.0,
// FRONT
-0.5, -0.5, -0.5, 1.0,
0.0, 0.0, -1.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.0, 0.0, -1.0, 0.0,
-0.5, 0.5, -0.5, 1.0,
0.0, 0.0, -1.0, 0.0,
0.5, -0.5, -0.5, 1.0,
0.0, 0.0, -1.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.0, 0.0, -1.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
0.0, 0.0, -1.0, 0.0,
// BACK
0.5, 0.5, 0.5, 1.0,
0.0, 0.0, 1.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
0.0, 0.0, 1.0, 0.0,
-0.5, 0.5, 0.5, 1.0,
0.0, 0.0, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0,
0.0, 0.0, 1.0, 0.0,
0.5, -0.5, 0.5, 1.0,
0.0, 0.0, 1.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
0.0, 0.0, 1.0, 0.0,
// LEFT
-0.5, -0.5, -0.5, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, 0.5, -0.5, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
-1.0, 0.0, 0.0, 0.0,
// RIGHT
0.5, 0.5, 0.5, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, -0.5, -0.5, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, -0.5, 0.5, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, 0.5, -0.5, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, -0.5, -0.5, 1.0,
1.0, 0.0, 0.0, 0.0,
];
fn create_instance(window: &Window, entry: &Entry) -> Instance {
@ -106,7 +202,7 @@ fn find_pdev_dgpu(instance: &Instance) -> vk::PhysicalDevice {
// Fix.
println!(
"Found discrete GPU: {}",
str::from_utf8(std::mem::transmute(props.device_name.as_slice())).unwrap()
std::str::from_utf8(std::mem::transmute(props.device_name.as_slice())).unwrap()
);
return pdevs.remove(i);
}
@ -339,7 +435,12 @@ fn setup_desc_layout(dev: &Device) -> vk::DescriptorSetLayout {
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
.descriptor_count(1)
.stage_flags(vk::ShaderStageFlags::VERTEX);
let layouts = [storage_binding];
let image_binding = vk::DescriptorSetLayoutBinding::default()
.binding(1)
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.descriptor_count(1)
.stage_flags(vk::ShaderStageFlags::FRAGMENT);
let layouts = [storage_binding, image_binding];
let layout_info = vk::DescriptorSetLayoutCreateInfo::default().bindings(&layouts);
let layout = unsafe {
@ -453,11 +554,11 @@ fn setup_shader_stage(
let vert_stage = vk::PipelineShaderStageCreateInfo::default()
.stage(vk::ShaderStageFlags::VERTEX)
.module(vert_shader)
.name(CStr::from_bytes_with_nul(b"main\0").unwrap());
.name(c"main");
let frag_stage = vk::PipelineShaderStageCreateInfo::default()
.stage(vk::ShaderStageFlags::FRAGMENT)
.module(frag_shader)
.name(CStr::from_bytes_with_nul(b"main\0").unwrap());
.name(c"main");
[vert_stage, frag_stage]
}
@ -474,7 +575,7 @@ fn setup_pipeline(
.topology(vk::PrimitiveTopology::TRIANGLE_LIST);
let rasterization = vk::PipelineRasterizationStateCreateInfo::default()
.polygon_mode(vk::PolygonMode::FILL)
.cull_mode(vk::CullModeFlags::BACK)
.cull_mode(vk::CullModeFlags::NONE)
.front_face(vk::FrontFace::CLOCKWISE)
.line_width(1.0);
let multisample = vk::PipelineMultisampleStateCreateInfo::default()
@ -601,10 +702,14 @@ fn setup_swapchain(
}
fn setup_desc_pool(dev: &Device) -> vk::DescriptorPool {
let pool_size = vk::DescriptorPoolSize::default()
let pool_size_storage = vk::DescriptorPoolSize::default()
.ty(vk::DescriptorType::STORAGE_BUFFER)
.descriptor_count(1);
let pool_sizes = [pool_size];
let pool_size_image = vk::DescriptorPoolSize::default()
.ty(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.descriptor_count(1);
let pool_sizes = [pool_size_storage, pool_size_image];
let pool_info = vk::DescriptorPoolCreateInfo::default()
.max_sets(1)
.pool_sizes(&pool_sizes);
@ -718,7 +823,12 @@ fn make_desc_sets(dev: &Device, desc_pool: &vk::DescriptorPool) -> Vec<vk::Descr
sets
}
fn write_desc_sets(dev: &Device, desc_sets: &Vec<vk::DescriptorSet>, mesh_buf: &vk::Buffer) {
fn write_desc_sets(
dev: &Device,
desc_sets: &Vec<vk::DescriptorSet>,
mesh_buf: &vk::Buffer,
image_view: vk::ImageView,
) {
let buf_info = vk::DescriptorBufferInfo::default()
.buffer(*mesh_buf)
.offset(0)
@ -730,8 +840,20 @@ fn write_desc_sets(dev: &Device, desc_sets: &Vec<vk::DescriptorSet>, mesh_buf: &
.dst_array_element(0)
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
.buffer_info(&buf_infos);
let img_info = vk::DescriptorImageInfo::default()
.image_layout(vk::ImageLayout::UNDEFINED)
.image_view(image_view);
let img_infos = &[img_info];
let img_desc = vk::WriteDescriptorSet::default()
.dst_set(desc_sets[0])
.dst_binding(1)
.dst_array_element(0)
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.image_info(img_infos);
unsafe {
dev.update_descriptor_sets(&[buf_desc], &[]);
dev.update_descriptor_sets(&[buf_desc, img_desc], &[]);
}
}
@ -794,6 +916,8 @@ fn record_commands(
pipe: &vk::Pipeline,
desc_sets: &Vec<vk::DescriptorSet>,
camera: &Camera,
skybox_buffer: &vk::Buffer,
skybox_image: &vk::Image,
) {
let clear_vals = [
vk::ClearValue {
@ -886,6 +1010,32 @@ fn record_commands(
48,
base_color.as_ref(),
);
let regions = (0..6)
.map(|i| {
vk::BufferImageCopy::default()
.buffer_offset(3 * 2048 * 2048 * i)
.buffer_row_length(0)
.buffer_image_height(0)
.image_offset(vk::Offset3D::default())
.image_extent(vk::Extent3D::default().width(2048).height(2048).depth(1))
.image_subresource(
vk::ImageSubresourceLayers::default()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(0)
.layer_count(1)
.base_array_layer(i as u32),
)
})
.collect::<Vec<_>>();
dev.cmd_copy_buffer_to_image(
*cmd_buf,
*skybox_buffer,
*skybox_image,
vk::ImageLayout::GENERAL,
&regions,
);
dev.cmd_draw(*cmd_buf, 36, 1, 0, 0);
dev.cmd_end_render_pass(*cmd_buf);
}
@ -993,6 +1143,10 @@ fn handle_cont_key(keycode: Keycode, camera: &mut Camera, mouse: &MouseUtil) {
}
}
fn decode_rif(raw: &[u8]) -> &[u8] {
&raw[18..]
}
fn main() {
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
@ -1069,6 +1223,68 @@ fn main() {
std::ptr::copy(POSITIONS.as_ptr(), mesh_mem as *mut f32, POSITIONS.len());
}
let (skybox_image, skybox_image_view, skybox_sampler) = {
let qf_idxs = [rcs_queue_inx];
let create_info = vk::ImageCreateInfo::default()
.flags(ImageCreateFlags::CUBE_COMPATIBLE)
.image_type(vk::ImageType::TYPE_2D)
.format(vk::Format::R8G8B8_UNORM)
.extent(vk::Extent3D::default().width(2048).height(2048).depth(1))
.mip_levels(1)
.array_layers(6)
.samples(vk::SampleCountFlags::TYPE_1)
.tiling(vk::ImageTiling::OPTIMAL)
.usage(vk::ImageUsageFlags::TRANSFER_DST | vk::ImageUsageFlags::SAMPLED)
.sharing_mode(vk::SharingMode::EXCLUSIVE)
.initial_layout(vk::ImageLayout::GENERAL)
.queue_family_indices(&qf_idxs);
let image =
unsafe { dev.create_image(&create_info, None) }.expect("Failed to create image");
let create_info = vk::ImageViewCreateInfo::default()
.image(image)
.view_type(vk::ImageViewType::CUBE)
.format(vk::Format::R8G8B8_UNORM)
.components(vk::ComponentMapping::default())
.subresource_range(
vk::ImageSubresourceRange::default()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.base_mip_level(0)
.level_count(1)
.base_array_layer(0)
.layer_count(6),
);
let image_view = unsafe { dev.create_image_view(&create_info, None) }
.expect("Failed to create image view");
let create_info = vk::SamplerCreateInfo::default()
.mag_filter(vk::Filter::LINEAR)
.min_filter(vk::Filter::LINEAR)
.mipmap_mode(vk::SamplerMipmapMode::LINEAR)
.address_mode_u(vk::SamplerAddressMode::CLAMP_TO_EDGE)
.address_mode_v(vk::SamplerAddressMode::CLAMP_TO_EDGE)
.address_mode_w(vk::SamplerAddressMode::CLAMP_TO_EDGE)
.max_anisotropy(1.0)
.max_lod(1.0)
.border_color(vk::BorderColor::FLOAT_OPAQUE_WHITE);
let sampler =
unsafe { dev.create_sampler(&create_info, None) }.expect("Failed to create sampler");
(image, image_view, sampler)
};
let skybox_mem = mem_alloc(&dev, host_visible_inx, 3 * 2048 * 2048 * 6);
let skybox_buf = alloc_buf(
&dev,
&skybox_mem,
3 * 2048 * 2048 * 6,
vk::BufferUsageFlags::TRANSFER_SRC,
);
let skybox_ptr = buf_to_ptr(&dev, &skybox_mem, &skybox_buf);
let img = std::fs::read("resources/skybox.rif").unwrap();
let data = decode_rif(&img);
unsafe {
std::ptr::copy(data.as_ptr(), skybox_ptr as *mut u8, data.len());
}
let vert_shader_bin = std::fs::read("shaders/vert.spv").unwrap();
let frag_shader_bin = std::fs::read("shaders/frag.spv").unwrap();
@ -1127,7 +1343,7 @@ fn main() {
let desc_sets = make_desc_sets(&dev, &desc_pool);
write_desc_sets(&dev, &desc_sets, &mesh_buf);
write_desc_sets(&dev, &desc_sets, &mesh_buf, skybox_image_view);
let sem_avail = make_sem(&dev);
let sem_finish = make_sem(&dev);
@ -1164,7 +1380,7 @@ fn main() {
.expect("Failed to wait for device idle");
swapchain_loader.destroy_swapchain(swapchain, None);
}
(swapchain, extents) = setup_swapchain(
(swapchain, _) = setup_swapchain(
&pdev,
&dev,
&surface,
@ -1202,10 +1418,9 @@ fn main() {
xrel,
yrel,
..
}
// We only wanna do movement if the mouse is in relative mode (ie. its pinned to
// the center of the window and hidden)
if mouse.relative_mouse_mode() => {
} if mouse.relative_mouse_mode() => {
// We only wanna do movement if the mouse is in relative mode (ie. its pinned to
// the center of the window and hidden)
camera.rotation.y -= xrel as f32 * ROT_MOUSE_SCALE;
camera.rotation.x -= yrel as f32 * ROT_MOUSE_SCALE;
mouse.warp_mouse_in_window(&window, width as i32 / 2, height as i32 / 2);
@ -1244,6 +1459,8 @@ fn main() {
&pipe,
&desc_sets,
&camera,
&skybox_buf,
&skybox_image,
);
end_cmd_buf(&dev, &cmd_buf);

Loading…
Cancel
Save