Seperate shader for skybox, shader and cube in one scene

master
Avery 1 week ago
parent 6f04e54627
commit 3da43d5a69
Signed by: Avery
GPG Key ID: 4E53F4CB69B2CC8D

1
.gitignore vendored

@ -1 +1,2 @@
/target
/shaders/*.spv

@ -1,6 +1,6 @@
BIN = target/debug/mineclone
SHADERS = shaders/vert.spv shaders/frag.spv
SHADERS = $(shell find shaders -name '*.frag' -or -name '*.vert' | sed -e 's/\.frag/_frag.spv/' -e 's/\.vert/_vert.spv/')
SOURCES = $(shell find src -name '*.rs')
all: $(SHADERS) $(BIN)
@ -11,8 +11,8 @@ run: all
$(BIN): $(SOURCES)
cargo build
%.spv: %.vert
%_vert.spv: %.vert
glslc $< -o $@
%.spv: %.frag
%_frag.spv: %.frag
glslc $< -o $@

@ -26,6 +26,7 @@
vulkan-headers
vulkan-loader
vulkan-validation-layers # maybe?
shaderc
# glm and whatnot …
];
};

@ -1,7 +1,6 @@
#version 450
// vim: ft=c
//
layout(binding = 1) uniform samplerCube combined_image;
// clang-format off
layout(location = 0) out vec4 outColor;
@ -13,8 +12,7 @@ layout(push_constant, std430) uniform pc {
};
void main() {
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);
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);
//}

@ -1,5 +1,6 @@
#version 450
// vim: ft=c
// clang-format off
struct PosNorm {
vec4 pos;
@ -91,7 +92,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;

Binary file not shown.

@ -0,0 +1,10 @@
#version 450
// vim: ft=c
layout(binding = 1) uniform samplerCube combined_image;
layout(location = 0) out vec4 outColor;
layout(location = 0) in vec4 pos_pre;
void main() { outColor = texture(combined_image, vec3(pos_pre)); }

@ -0,0 +1,157 @@
#version 450
// vim: ft=c
// clang-format off
const vec4 positions[36] = vec4[36](
// BOTTOM
vec4(-0.5, 0.5, -0.5, 1.0),
vec4(0.5, 0.5, 0.5, 1.0),
vec4(-0.5, 0.5, 0.5, 1.0),
vec4(0.5, 0.5, -0.5, 1.0),
vec4(0.5, 0.5, 0.5, 1.0),
vec4(-0.5, 0.5, -0.5, 1.0),
// TOP
vec4(0.5, -0.5, 0.5, 1.0),
vec4(-0.5, -0.5, -0.5, 1.0),
vec4(-0.5, -0.5, 0.5, 1.0),
vec4(0.5, -0.5, 0.5, 1.0),
vec4(0.5, -0.5, -0.5, 1.0),
vec4(-0.5, -0.5, -0.5, 1.0),
// FRONT
vec4(-0.5, -0.5, -0.5, 1.0),
vec4(0.5, 0.5, -0.5, 1.0),
vec4(-0.5, 0.5, -0.5, 1.0),
vec4(0.5, -0.5, -0.5, 1.0),
vec4(0.5, 0.5, -0.5, 1.0),
vec4(-0.5, -0.5, -0.5, 1.0),
// BACK
vec4(0.5, 0.5, 0.5, 1.0),
vec4(-0.5, -0.5, 0.5, 1.0),
vec4(-0.5, 0.5, 0.5, 1.0),
vec4(0.5, 0.5, 0.5, 1.0),
vec4(0.5, -0.5, 0.5, 1.0),
vec4(-0.5, -0.5, 0.5, 1.0),
// LEFT
vec4(-0.5, -0.5, -0.5, 1.0),
vec4(-0.5, 0.5, 0.5, 1.0),
vec4(-0.5, -0.5, 0.5, 1.0),
vec4(-0.5, 0.5, -0.5, 1.0),
vec4(-0.5, 0.5, 0.5, 1.0),
vec4(-0.5, -0.5, -0.5, 1.0),
// RIGHT
vec4(0.5, 0.5, 0.5, 1.0),
vec4(0.5, -0.5, -0.5, 1.0),
vec4(0.5, -0.5, 0.5, 1.0),
vec4(0.5, 0.5, 0.5, 1.0),
vec4(0.5, 0.5, -0.5, 1.0),
vec4(0.5, -0.5, -0.5, 1.0)
);
layout(push_constant, std430) uniform pc {
layout(offset=0) vec4 cam_orig;
layout(offset=16) vec4 cam_rot;
layout(offset=32) uvec2 screen_res;
};
layout (location = 0) out vec4 pos_pre;
const float PI = 3.14159;
// Forgive me for I have sinned
const float TAU = PI*2.0;
void main() {
// assign outs
pos_pre = positions[gl_VertexIndex];
// define constants
const float zFar = 100.0;
const float zNear = 0.1;
// assign the transformee
gl_Position = positions[gl_VertexIndex];
mat4 fix_coordinates = mat4(
-1.0, 0.0, 0.0, 0.0,
0.0, -1.0, 0.0, 0.0,
0.0, 0.0, -1.0, 0.0,
0.0, 0.0, 0.0, 1.0
);
mat4 view_rot_xz = mat4(
cos(cam_rot.y), 0.0, sin(cam_rot.y), 0.0,
0.0, 1.0, 0.0, 0.0,
-sin(cam_rot.y), 0.0, cos(cam_rot.y), 0.0,
0.0, 0.0, 0.0, 1.0
);
mat4 view_rot_yz = mat4(
1.0, 0.0, 0.0, 0.0,
0.0, cos(cam_rot.x), sin(cam_rot.x), 0.0,
0.0, -sin(cam_rot.x), cos(cam_rot.x), 0.0,
0.0, 0.0, 0.0, 1.0
);
mat4 project_aspect = mat4(
(float(screen_res.y)/float(screen_res.x)), 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
);
mat4 project_znear = mat4(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, -zNear,
0.0, 0.0, 0.0, 1.0
);
mat4 project_div = mat4(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, tan((70.0/2.0)/360.0*TAU), 0.0
);
mat4 project_normal = mat4(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0/zFar, 0.0,
0.0, 0.0, 0.0, 1.0
);
// vulkan has inverted screen coordinates
// but we want regular mesh coordinates
// gl_Position.xyz *= -1.0
gl_Position *= fix_coordinates;
// apply view's xz rotation
//mat2 xz_rot;
//xz_rot[0] = vec2(cos(cam_rot.y), -sin(cam_rot.y));
//xz_rot[1] = vec2(sin(cam_rot.y), cos(cam_rot.y));
//gl_Position.xz *= inverse(xz_rot);
gl_Position *= view_rot_xz;
// apply view's yz rotation
//mat2 yz_rot;
//yz_rot[0] = vec2(cos(cam_rot.x), -sin(cam_rot.x));
//yz_rot[1] = vec2(sin(cam_rot.x), cos(cam_rot.x));
//gl_Position.yz *= inverse(yz_rot);
gl_Position *= view_rot_yz;
// aspect correction
//gl_Position.x *= (1080.0/1920.0);
gl_Position *= project_aspect;
// z near correction
//gl_Position.z -= zNear;
gl_Position *= project_znear;
// division by z
// has to be assigned by w so that the hardware performs the division AFTER clipping.
//gl_Position.w = (gl_Position.z*sin(140.0/360.0*TAU));
gl_Position *= project_div;
// z normalization
//gl_Position.z /= zFar;
gl_Position *= project_normal;
}

Binary file not shown.

@ -36,120 +36,118 @@ const MESH_SIZE: u64 = 36 * 2 * 4 * 4;
#[rustfmt::skip]
const POSITIONS: [f32; 36 * 2 * 4] = [
// BOTTOM
-0.5, 0.5, -0.5, 1.0,
-0.5, 0.5, 1.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0,
0.5, 0.5, 2.0, 1.0,
0.0, 1.0, 0.0, 0.0,
-0.5, 0.5, 0.5, 1.0,
-0.5, 0.5, 2.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.5, 0.5, 1.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.5, 0.5, 0.5, 1.0,
0.5, 0.5, 2.0, 1.0,
0.0, 1.0, 0.0, 0.0,
-0.5, 0.5, -0.5, 1.0,
-0.5, 0.5, 1.0, 1.0,
0.0, 1.0, 0.0, 0.0,
// TOP
0.5, -0.5, 0.5, 1.0,
0.5, -0.5, 2.0, 1.0,
0.0, -1.0, 0.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
-0.5, -0.5, 1.0, 1.0,
0.0, -1.0, 0.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
-0.5, -0.5, 2.0, 1.0,
0.0, -1.0, 0.0, 0.0,
0.5, -0.5, 0.5, 1.0,
0.5, -0.5, 2.0, 1.0,
0.0, -1.0, 0.0, 0.0,
0.5, -0.5, -0.5, 1.0,
0.5, -0.5, 1.0, 1.0,
0.0, -1.0, 0.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
-0.5, -0.5, 1.0, 1.0,
0.0, -1.0, 0.0, 0.0,
// FRONT
-0.5, -0.5, -0.5, 1.0,
-0.5, -0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.5, 0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0,
-0.5, 0.5, -0.5, 1.0,
-0.5, 0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0,
0.5, -0.5, -0.5, 1.0,
0.5, -0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.5, 0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
-0.5, -0.5, 1.0, 1.0,
0.0, 0.0, -1.0, 0.0,
// BACK
0.5, 0.5, 0.5, 1.0,
0.5, 0.5, 2.0, 1.0,
0.0, 0.0, 1.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
-0.5, -0.5, 2.0, 1.0,
0.0, 0.0, 1.0, 0.0,
-0.5, 0.5, 0.5, 1.0,
-0.5, 0.5, 2.0, 1.0,
0.0, 0.0, 1.0, 0.0,
0.5, 0.5, 0.5, 1.0,
0.5, 0.5, 2.0, 1.0,
0.0, 0.0, 1.0, 0.0,
0.5, -0.5, 0.5, 1.0,
0.5, -0.5, 2.0, 1.0,
0.0, 0.0, 1.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
-0.5, -0.5, 2.0, 1.0,
0.0, 0.0, 1.0, 0.0,
// LEFT
-0.5, -0.5, -0.5, 1.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.5, 0.5, 2.0, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, -0.5, 0.5, 1.0,
-0.5, -0.5, 2.0, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, 0.5, -0.5, 1.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.5, 0.5, 2.0, 1.0,
-1.0, 0.0, 0.0, 0.0,
-0.5, -0.5, -0.5, 1.0,
-0.5, -0.5, 1.0, 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,
0.5, 0.5, 2.0, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, -0.5, 0.5, 1.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.5, -0.5, 2.0, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, 0.5, -0.5, 1.0,
0.5, 0.5, 2.0, 1.0,
1.0, 0.0, 0.0, 0.0,
0.5, -0.5, -0.5, 1.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,
];
fn create_instance(window: &Window, entry: &Entry) -> Instance {
@ -568,6 +566,7 @@ fn setup_pipeline(
frag_shader: &vk::ShaderModule,
pass: &vk::RenderPass,
pipe_layout: &vk::PipelineLayout,
cull_mode: vk::CullModeFlags,
) -> vk::Pipeline {
let shader_stages = setup_shader_stage(&dev, *vert_shader, *frag_shader);
let vert_input = vk::PipelineVertexInputStateCreateInfo::default();
@ -575,7 +574,7 @@ fn setup_pipeline(
.topology(vk::PrimitiveTopology::TRIANGLE_LIST);
let rasterization = vk::PipelineRasterizationStateCreateInfo::default()
.polygon_mode(vk::PolygonMode::FILL)
.cull_mode(vk::CullModeFlags::NONE)
.cull_mode(cull_mode)
.front_face(vk::FrontFace::CLOCKWISE)
.line_width(1.0);
let multisample = vk::PipelineMultisampleStateCreateInfo::default()
@ -828,7 +827,7 @@ fn write_desc_sets(
desc_sets: &Vec<vk::DescriptorSet>,
mesh_buf: &vk::Buffer,
image_view: vk::ImageView,
skybox_sampler: vk::Sampler
skybox_sampler: vk::Sampler,
) {
let buf_info = vk::DescriptorBufferInfo::default()
.buffer(*mesh_buf)
@ -912,11 +911,9 @@ fn record_commands(
cmd_buf: &vk::CommandBuffer,
framebuf: &vk::Framebuffer,
pass: &vk::RenderPass,
layout: &vk::PipelineLayout,
width: u32,
height: u32,
pipe: &vk::Pipeline,
desc_sets: &Vec<vk::DescriptorSet>,
pipes: &[(vk::Pipeline, vk::PipelineLayout, &[vk::DescriptorSet])],
camera: &Camera,
skybox_buffer: &vk::Buffer,
skybox_image: &vk::Image,
@ -971,7 +968,34 @@ fn record_commands(
&regions,
);
dev.cmd_begin_render_pass(*cmd_buf, &render_pass_info, vk::SubpassContents::INLINE);
let screen_res: Vec<u8> = (Vec::<u32>::from([width, height]))
.iter()
.map(|f| f.to_ne_bytes())
.collect::<Vec<_>>()
.into_flattened();
let base_color: Vec<u8> = (Vec::<f32>::from([0.0, 1.0, 1.0, 1.0]))
.iter()
.map(|f| f.to_ne_bytes())
.collect::<Vec<_>>()
.into_flattened();
let cam_data: Vec<u8> = (Vec::<f32>::from([
camera.origin.x,
camera.origin.y,
camera.origin.z,
0.0,
camera.rotation.x,
camera.rotation.y,
camera.rotation.z,
]))
.iter()
.map(|f| f.to_ne_bytes())
.collect::<Vec<_>>()
.into_flattened();
for (pipe, layout, desc_sets) in pipes {
dev.cmd_bind_pipeline(*cmd_buf, vk::PipelineBindPoint::GRAPHICS, *pipe);
dev.cmd_bind_descriptor_sets(
*cmd_buf,
vk::PipelineBindPoint::GRAPHICS,
@ -980,6 +1004,7 @@ fn record_commands(
desc_sets.as_ref(),
&[],
);
dev.cmd_set_viewport_with_count(
*cmd_buf,
&[vk::Viewport::default()
@ -990,30 +1015,6 @@ fn record_commands(
*cmd_buf,
&[vk::Rect2D::default().extent(vk::Extent2D { width, height })],
);
let cam_data: Vec<u8> = (Vec::<f32>::from([
camera.origin.x,
camera.origin.y,
camera.origin.z,
0.0,
camera.rotation.x,
camera.rotation.y,
camera.rotation.z,
]))
.iter()
.map(|f| f.to_ne_bytes())
.collect::<Vec<_>>()
.into_flattened();
let screen_res: Vec<u8> = (Vec::<u32>::from([width, height]))
.iter()
.map(|f| f.to_ne_bytes())
.collect::<Vec<_>>()
.into_flattened();
let base_color: Vec<u8> = (Vec::<f32>::from([0.0, 1.0, 1.0, 1.0]))
.iter()
.map(|f| f.to_ne_bytes())
.collect::<Vec<_>>()
.into_flattened();
dev.cmd_push_constants(
*cmd_buf,
@ -1037,9 +1038,9 @@ fn record_commands(
base_color.as_ref(),
);
dev.cmd_draw(*cmd_buf, 36, 1, 0, 0);
}
dev.cmd_end_render_pass(*cmd_buf);
}
}
@ -1244,10 +1245,12 @@ fn main() {
let image =
unsafe { dev.create_image(&create_info, None) }.expect("Failed to create image");
let skybox_mem_size: vk::MemoryRequirements = unsafe {dev.get_image_memory_requirements(image)};
let skybox_mem_size: vk::MemoryRequirements =
unsafe { dev.get_image_memory_requirements(image) };
let skybox_dev_mem = mem_alloc(&dev, host_invisible_inx, skybox_mem_size.size);
unsafe {
dev.bind_image_memory(image, skybox_dev_mem, 0).expect("Failed to bind image memory");
dev.bind_image_memory(image, skybox_dev_mem, 0)
.expect("Failed to bind image memory");
}
let create_info = vk::ImageViewCreateInfo::default()
.image(image)
@ -1277,7 +1280,6 @@ fn main() {
let sampler =
unsafe { dev.create_sampler(&create_info, None) }.expect("Failed to create sampler");
(image, image_view, sampler)
};
@ -1295,14 +1297,14 @@ fn main() {
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();
let skybox_vert_shader_bin = std::fs::read("shaders/skybox_vert.spv").unwrap();
let skybox_frag_shader_bin = std::fs::read("shaders/skybox_frag.spv").unwrap();
let vert_shader = unsafe {
let skybox_vert_shader = unsafe {
dev.create_shader_module(
&vk::ShaderModuleCreateInfo {
code_size: vert_shader_bin.len(),
p_code: vert_shader_bin.as_ptr() as *const u32,
code_size: skybox_vert_shader_bin.len(),
p_code: skybox_vert_shader_bin.as_ptr() as *const u32,
..Default::default()
},
None,
@ -1310,11 +1312,38 @@ fn main() {
.expect("Failed to create vertex shader module")
};
let frag_shader = unsafe {
let skybox_frag_shader = unsafe {
dev.create_shader_module(
&vk::ShaderModuleCreateInfo {
code_size: frag_shader_bin.len(),
p_code: frag_shader_bin.as_ptr() as *const u32,
code_size: skybox_frag_shader_bin.len(),
p_code: skybox_frag_shader_bin.as_ptr() as *const u32,
..Default::default()
},
None,
)
.expect("Failed to create fragment shader module")
};
let cube_vert_shader_bin = std::fs::read("shaders/cube_vert.spv").unwrap();
let cube_frag_shader_bin = std::fs::read("shaders/cube_frag.spv").unwrap();
let cube_vert_shader = unsafe {
dev.create_shader_module(
&vk::ShaderModuleCreateInfo {
code_size: cube_vert_shader_bin.len(),
p_code: cube_vert_shader_bin.as_ptr() as *const u32,
..Default::default()
},
None,
)
.expect("Failed to create vertex shader module")
};
let cube_frag_shader = unsafe {
dev.create_shader_module(
&vk::ShaderModuleCreateInfo {
code_size: cube_frag_shader_bin.len(),
p_code: cube_frag_shader_bin.as_ptr() as *const u32,
..Default::default()
},
None,
@ -1325,7 +1354,22 @@ fn main() {
let pass = setup_render_pass(&dev);
let pipe_layout = setup_pipe_layout(&dev);
let pipe = setup_pipeline(&dev, &vert_shader, &frag_shader, &pass, &pipe_layout);
let skybox_pipe = setup_pipeline(
&dev,
&skybox_vert_shader,
&skybox_frag_shader,
&pass,
&pipe_layout,
vk::CullModeFlags::NONE,
);
let cube_pipe = setup_pipeline(
&dev,
&cube_vert_shader,
&cube_frag_shader,
&pass,
&pipe_layout,
vk::CullModeFlags::FRONT,
);
let surface_loader = surface::Instance::new(&entry, &instance);
let swapchain_loader = swapchain::Device::new(&instance, &dev);
@ -1341,8 +1385,6 @@ fn main() {
height,
);
let desc_pool = setup_desc_pool(&dev);
let mut swap_images = make_swap_images(&dev, &swapchain, &swapchain_loader);
let mut swap_views = make_swap_views(&dev, &swap_images, vk::Format::B8G8R8A8_UNORM);
@ -1351,9 +1393,17 @@ fn main() {
let mut framebufs = make_framebufs(&dev, &swap_views, &depth_view, &pass, width, height);
let desc_pool = setup_desc_pool(&dev);
let desc_sets = make_desc_sets(&dev, &desc_pool);
write_desc_sets(&dev, &desc_sets, &mesh_buf, skybox_image_view, skybox_sampler);
write_desc_sets(
&dev,
&desc_sets,
&mesh_buf,
skybox_image_view,
skybox_sampler,
);
let sem_avail = make_sem(&dev);
let sem_finish = make_sem(&dev);
@ -1463,11 +1513,12 @@ fn main() {
&cmd_buf,
&framebufs[img_inx as usize],
&pass,
&pipe_layout,
width,
height,
&pipe,
&desc_sets,
&[
(cube_pipe, pipe_layout, &desc_sets),
(skybox_pipe, pipe_layout, &desc_sets),
],
&camera,
&skybox_buf,
&skybox_image,

Loading…
Cancel
Save