Geommetry shader and start of rotation&movement
This commit is contained in:
parent
fdac5a97a1
commit
9ad743cfa2
10 changed files with 240 additions and 26 deletions
|
@ -1,2 +1,3 @@
|
||||||
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/shader.vert -o shaders/vert.spv
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/shader.vert -o shaders/vert.spv
|
||||||
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/shader.frag -o shaders/frag.spv
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/shader.frag -o shaders/frag.spv
|
||||||
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/shader.geom -o shaders/geo.spv
|
BIN
shaders/frag.spv
BIN
shaders/frag.spv
Binary file not shown.
BIN
shaders/geo.spv
Normal file
BIN
shaders/geo.spv
Normal file
Binary file not shown.
|
@ -7,5 +7,5 @@ layout(location = 0) out vec4 outColor;
|
||||||
layout(binding = 1) uniform sampler2D texSampler;
|
layout(binding = 1) uniform sampler2D texSampler;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
outColor = texture(texSampler, fragTexCoord);
|
outColor = vec4(fragColor, 1); //texture(texSampler, fragTexCoord);
|
||||||
}
|
}
|
152
shaders/shader.geom
Normal file
152
shaders/shader.geom
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(points) in;
|
||||||
|
layout(triangle_strip, max_vertices=24) out;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform UniformBufferObject {
|
||||||
|
mat4 model;
|
||||||
|
mat4 geom_rot;
|
||||||
|
mat4 view;
|
||||||
|
mat4 proj;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 geoColor[];
|
||||||
|
layout(location = 1) in vec2 geoTexCoord[];
|
||||||
|
|
||||||
|
layout(location = 0) out vec3 fragColor;
|
||||||
|
layout(location = 1) out vec2 fragTexCoord;
|
||||||
|
|
||||||
|
void main () {
|
||||||
|
mat4 geom_rotation = ubo.geom_rot;
|
||||||
|
//back
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, -0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, -0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, 0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, 0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
EndPrimitive();
|
||||||
|
|
||||||
|
//front
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, 0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, -0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, 0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, -0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
EndPrimitive();
|
||||||
|
|
||||||
|
//up
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, 0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, 0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, 0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, 0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
EndPrimitive();
|
||||||
|
|
||||||
|
//down
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, -0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, -0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, -0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, -0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
EndPrimitive();
|
||||||
|
|
||||||
|
//left
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, 0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, -0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, 0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-0.5, -0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
EndPrimitive();
|
||||||
|
|
||||||
|
//right
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, -0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, -0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, 0.5, 0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
|
||||||
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(0.5, 0.5, -0.5, 0));
|
||||||
|
fragColor = geoColor[0];
|
||||||
|
fragTexCoord = geoTexCoord[0];
|
||||||
|
EmitVertex();
|
||||||
|
EndPrimitive();
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
layout(binding = 0) uniform UniformBufferObject {
|
layout(binding = 0) uniform UniformBufferObject {
|
||||||
mat4 model;
|
mat4 model;
|
||||||
|
mat4 geom_rot;
|
||||||
mat4 view;
|
mat4 view;
|
||||||
mat4 proj;
|
mat4 proj;
|
||||||
} ubo;
|
} ubo;
|
||||||
|
@ -11,11 +12,11 @@ layout(location = 0) in vec3 inPosition;
|
||||||
layout(location = 1) in vec3 inColor;
|
layout(location = 1) in vec3 inColor;
|
||||||
layout(location = 2) in vec2 inTexCoord;
|
layout(location = 2) in vec2 inTexCoord;
|
||||||
|
|
||||||
layout(location = 0) out vec3 fragColor;
|
layout(location = 0) out vec3 geoColor;
|
||||||
layout(location = 1) out vec2 fragTexCoord;
|
layout(location = 1) out vec2 geoTexCoord;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);
|
gl_Position = ubo.geom_rot * ubo.model * vec4(inPosition, 1.0);
|
||||||
fragColor = inColor;
|
geoColor = inColor;
|
||||||
fragTexCoord = inTexCoord;
|
geoTexCoord = inTexCoord;
|
||||||
}
|
}
|
BIN
shaders/vert.spv
BIN
shaders/vert.spv
Binary file not shown.
|
@ -176,6 +176,7 @@ pub unsafe fn create_index_buffer(
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub struct UniformBufferObject {
|
pub struct UniformBufferObject {
|
||||||
pub model: Mat4,
|
pub model: Mat4,
|
||||||
|
pub geom_rot: Mat4,
|
||||||
pub view: Mat4,
|
pub view: Mat4,
|
||||||
pub proj: Mat4,
|
pub proj: Mat4,
|
||||||
}
|
}
|
||||||
|
@ -188,7 +189,7 @@ pub unsafe fn create_descriptor_set_layout(
|
||||||
.binding(0)
|
.binding(0)
|
||||||
.descriptor_type(vk::DescriptorType::UNIFORM_BUFFER)
|
.descriptor_type(vk::DescriptorType::UNIFORM_BUFFER)
|
||||||
.descriptor_count(1)
|
.descriptor_count(1)
|
||||||
.stage_flags(vk::ShaderStageFlags::VERTEX);
|
.stage_flags(vk::ShaderStageFlags::VERTEX | vk::ShaderStageFlags::GEOMETRY);
|
||||||
|
|
||||||
let sampler_binding = vk::DescriptorSetLayoutBinding::builder()
|
let sampler_binding = vk::DescriptorSetLayoutBinding::builder()
|
||||||
.binding(1)
|
.binding(1)
|
||||||
|
|
91
src/main.rs
91
src/main.rs
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use log::*;
|
use log::*;
|
||||||
use winit::dpi::LogicalSize;
|
use winit::dpi::{LogicalSize, LogicalPosition, PhysicalPosition};
|
||||||
use winit::event::{Event, WindowEvent};
|
use winit::event::{Event, WindowEvent};
|
||||||
use winit::event_loop::EventLoop;
|
use winit::event_loop::EventLoop;
|
||||||
use winit::window::{Window, WindowBuilder};
|
use winit::window::{Window, WindowBuilder};
|
||||||
|
@ -27,7 +27,7 @@ use vulkanalia::vk::ExtDebugUtilsExtension;
|
||||||
use vulkanalia::vk::KhrSurfaceExtension;
|
use vulkanalia::vk::KhrSurfaceExtension;
|
||||||
use vulkanalia::vk::KhrSwapchainExtension;
|
use vulkanalia::vk::KhrSwapchainExtension;
|
||||||
|
|
||||||
use cgmath::vec3;
|
use cgmath::{vec2, vec3, SquareMatrix};
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
use std::ptr::copy_nonoverlapping as memcpy;
|
use std::ptr::copy_nonoverlapping as memcpy;
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ fn main() -> Result<()> {
|
||||||
.with_title("Vulkan Tutorial (Rust)")
|
.with_title("Vulkan Tutorial (Rust)")
|
||||||
.with_inner_size(LogicalSize::new(1024, 768))
|
.with_inner_size(LogicalSize::new(1024, 768))
|
||||||
.build(&event_loop)?;
|
.build(&event_loop)?;
|
||||||
|
//window.set_cursor_visible(false);
|
||||||
|
|
||||||
// App
|
// App
|
||||||
|
|
||||||
|
@ -88,7 +89,30 @@ fn main() -> Result<()> {
|
||||||
app.minimized = false;
|
app.minimized = false;
|
||||||
app.resized = true;
|
app.resized = true;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
WindowEvent::CursorMoved { device_id, position } => {
|
||||||
|
let log_pos: LogicalPosition<f32> = position.to_logical(window.scale_factor());
|
||||||
|
if app.last_pos.x != -1.0 {
|
||||||
|
app.cam_angle_x += ((log_pos.x - (window.inner_size().width as f32 / 2.0)) / (window.inner_size().width as f32)) * 180.0;
|
||||||
|
app.cam_angle_y += ((log_pos.y - (window.inner_size().height as f32 / 2.0)) / (window.inner_size().height as f32)) * 180.0;
|
||||||
|
|
||||||
|
if app.cam_angle_x >= 360.0 {
|
||||||
|
app.cam_angle_x -= 360.0;
|
||||||
}
|
}
|
||||||
|
if app.cam_angle_x <= -360.0 {
|
||||||
|
app.cam_angle_x += 360.0;
|
||||||
|
}
|
||||||
|
app.cam_angle_y = app.cam_angle_y.max(-90.0).min(90.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.set_cursor_position(LogicalPosition::new(window.inner_size().width / 2, window.inner_size().height / 2)).expect("Cannot set Cursor!");
|
||||||
|
app.last_pos = LogicalPosition::new(window.inner_size().width as f32 / 2 as f32, window.inner_size().height as f32 / 2 as f32);
|
||||||
|
},
|
||||||
|
WindowEvent::KeyboardInput { device_id, event, is_synthetic } => {
|
||||||
|
if event.logical_key == "w" {
|
||||||
|
app.cur_pos += app.view_direction * 0.1;
|
||||||
|
}
|
||||||
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -109,6 +133,11 @@ struct App {
|
||||||
resized: bool,
|
resized: bool,
|
||||||
minimized: bool,
|
minimized: bool,
|
||||||
start: Instant,
|
start: Instant,
|
||||||
|
cam_angle_x: f32,
|
||||||
|
cam_angle_y: f32,
|
||||||
|
last_pos: LogicalPosition<f32>,
|
||||||
|
view_direction: vertex::Vec3,
|
||||||
|
cur_pos: cgmath::Point3<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
|
@ -117,7 +146,17 @@ impl App {
|
||||||
let loader = LibloadingLoader::new(LIBRARY)?;
|
let loader = LibloadingLoader::new(LIBRARY)?;
|
||||||
let entry = Entry::new(loader).map_err(|b| anyhow!("{}", b))?;
|
let entry = Entry::new(loader).map_err(|b| anyhow!("{}", b))?;
|
||||||
let mut data = app_data::AppData::default();
|
let mut data = app_data::AppData::default();
|
||||||
load_model::load_model(&mut data)?;
|
|
||||||
|
//load_model::load_model(&mut data)?;
|
||||||
|
data.vertices.push(
|
||||||
|
vertex::Vertex::new(vec3(8.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), vec2(0.0, 0.0))
|
||||||
|
);
|
||||||
|
data.indices.push(0);
|
||||||
|
data.vertices.push(
|
||||||
|
vertex::Vertex::new(vec3(-8.0, 0.0, 0.0), vec3(0.0, 0.0, 1.0), vec2(0.0, 0.0))
|
||||||
|
);
|
||||||
|
data.indices.push(1);
|
||||||
|
|
||||||
let instance = create_instance(window, &entry, &mut data)?;
|
let instance = create_instance(window, &entry, &mut data)?;
|
||||||
data.surface = vk_window::create_surface(&instance, &window, &window)?;
|
data.surface = vk_window::create_surface(&instance, &window, &window)?;
|
||||||
pick_physical_device(&instance, &mut data)?;
|
pick_physical_device(&instance, &mut data)?;
|
||||||
|
@ -151,7 +190,12 @@ impl App {
|
||||||
|
|
||||||
create_sync_objects(&device, &mut data)?;
|
create_sync_objects(&device, &mut data)?;
|
||||||
|
|
||||||
Ok(Self { entry, instance, data, device, frame: 0 , resized: false, minimized: false, start: Instant::now()})
|
Ok(Self { entry, instance, data, device, frame: 0 , resized: false, minimized: false, start: Instant::now(),
|
||||||
|
cam_angle_x: 0.0, cam_angle_y: 0.0,
|
||||||
|
last_pos: LogicalPosition::new(-1 as f32, -1 as f32),
|
||||||
|
view_direction: vertex::Vec3::new(0.0, 0.0, 0.0),
|
||||||
|
cur_pos: cgmath::point3(0.0, 0.0, 0.0),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Renders a frame for our Vulkan app.
|
/// Renders a frame for our Vulkan app.
|
||||||
|
@ -308,19 +352,25 @@ impl App {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn update_uniform_buffer(&self, image_index: usize) -> Result<()> {
|
unsafe fn update_uniform_buffer(&mut self, image_index: usize) -> Result<()> {
|
||||||
let time = self.start.elapsed().as_secs_f32();
|
let time = self.start.elapsed().as_secs_f32();
|
||||||
|
|
||||||
let model = buffer::Mat4::from_axis_angle(
|
/*let model = buffer::Mat4::from_axis_angle(
|
||||||
vec3(0.0, 0.0, 1.0),
|
vec3(0.0, 1.0, 0.0),
|
||||||
cgmath::Deg(90.0) * 0.0 //time
|
cgmath::Deg(90.0) * 0.0 //time
|
||||||
|
);*/
|
||||||
|
|
||||||
|
let rot_mat = cgmath::Matrix3::from_angle_y(cgmath::Deg(-self.cam_angle_y)) * cgmath::Matrix3::from_angle_z(cgmath::Deg(self.cam_angle_x));
|
||||||
|
let rot_mat4 = cgmath::Matrix4::from_angle_y(cgmath::Deg(-self.cam_angle_y)) * cgmath::Matrix4::from_angle_z(cgmath::Deg(self.cam_angle_x));
|
||||||
|
self.view_direction = rot_mat * vertex::Vec3::new(1.0, 0.0, 0.0);
|
||||||
|
let model = cgmath::Matrix4::from_translation( cgmath::Point3::new(0.0, 0.0, 0.0) - self.cur_pos );
|
||||||
|
|
||||||
|
let view = buffer::Mat4::look_to_rh(
|
||||||
|
cgmath::point3(0.0, 0.0, 0.0),
|
||||||
|
vertex::Vec3::new(1.0, 0.0, 0.0),
|
||||||
|
vertex::Vec3::new(0.0, 0.0, 1.0)
|
||||||
);
|
);
|
||||||
|
|
||||||
let view = buffer::Mat4::look_at_rh(
|
|
||||||
cgmath::point3(2.0, 2.0, 2.0),
|
|
||||||
cgmath::point3(0.0, 0.0, 0.0),
|
|
||||||
vec3(0.0, 0.0, 1.0),
|
|
||||||
);
|
|
||||||
|
|
||||||
let correction = buffer::Mat4::new( //column major order, matrix looks transposed
|
let correction = buffer::Mat4::new( //column major order, matrix looks transposed
|
||||||
1.0, 0.0, 0.0, 0.0,
|
1.0, 0.0, 0.0, 0.0,
|
||||||
|
@ -338,7 +388,7 @@ impl App {
|
||||||
10.0,
|
10.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
let ubo = buffer::UniformBufferObject { model, view, proj };
|
let ubo = buffer::UniformBufferObject { model, geom_rot: rot_mat4, view, proj };
|
||||||
|
|
||||||
let memory = self.device.map_memory(
|
let memory = self.device.map_memory(
|
||||||
self.data.uniform_buffers_memory[image_index],
|
self.data.uniform_buffers_memory[image_index],
|
||||||
|
@ -546,7 +596,8 @@ unsafe fn create_logical_device(
|
||||||
};
|
};
|
||||||
|
|
||||||
let features = vk::PhysicalDeviceFeatures::builder()
|
let features = vk::PhysicalDeviceFeatures::builder()
|
||||||
.sampler_anisotropy(true);
|
.sampler_anisotropy(true)
|
||||||
|
.geometry_shader(true);
|
||||||
|
|
||||||
let indices = queue_family_indices::QueueFamilyIndices::get(instance, data, data.physical_device)?;
|
let indices = queue_family_indices::QueueFamilyIndices::get(instance, data, data.physical_device)?;
|
||||||
|
|
||||||
|
@ -580,9 +631,11 @@ unsafe fn create_logical_device(
|
||||||
|
|
||||||
unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Result<()> {
|
unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Result<()> {
|
||||||
let vert = include_bytes!("../shaders/vert.spv");
|
let vert = include_bytes!("../shaders/vert.spv");
|
||||||
|
let geo = include_bytes!("../shaders/geo.spv");
|
||||||
let frag = include_bytes!("../shaders/frag.spv");
|
let frag = include_bytes!("../shaders/frag.spv");
|
||||||
|
|
||||||
let vert_shader_module = create_shader_module(device, &vert[..])?;
|
let vert_shader_module = create_shader_module(device, &vert[..])?;
|
||||||
|
let geo_shader_module = create_shader_module(device, &geo[..])?;
|
||||||
let frag_shader_module = create_shader_module(device, &frag[..])?;
|
let frag_shader_module = create_shader_module(device, &frag[..])?;
|
||||||
|
|
||||||
let vert_stage = vk::PipelineShaderStageCreateInfo::builder()
|
let vert_stage = vk::PipelineShaderStageCreateInfo::builder()
|
||||||
|
@ -590,6 +643,11 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
.module(vert_shader_module)
|
.module(vert_shader_module)
|
||||||
.name(b"main\0");
|
.name(b"main\0");
|
||||||
|
|
||||||
|
let geo_stage = vk::PipelineShaderStageCreateInfo::builder()
|
||||||
|
.stage(vk::ShaderStageFlags::GEOMETRY)
|
||||||
|
.module(geo_shader_module)
|
||||||
|
.name(b"main\0");
|
||||||
|
|
||||||
let frag_stage = vk::PipelineShaderStageCreateInfo::builder()
|
let frag_stage = vk::PipelineShaderStageCreateInfo::builder()
|
||||||
.stage(vk::ShaderStageFlags::FRAGMENT)
|
.stage(vk::ShaderStageFlags::FRAGMENT)
|
||||||
.module(frag_shader_module)
|
.module(frag_shader_module)
|
||||||
|
@ -602,7 +660,7 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
.vertex_attribute_descriptions(&attribute_descriptions);
|
.vertex_attribute_descriptions(&attribute_descriptions);
|
||||||
|
|
||||||
let input_assembly_state = vk::PipelineInputAssemblyStateCreateInfo::builder()
|
let input_assembly_state = vk::PipelineInputAssemblyStateCreateInfo::builder()
|
||||||
.topology(vk::PrimitiveTopology::TRIANGLE_LIST)
|
.topology(vk::PrimitiveTopology::POINT_LIST)
|
||||||
.primitive_restart_enable(false);
|
.primitive_restart_enable(false);
|
||||||
|
|
||||||
let viewport = vk::Viewport::builder()
|
let viewport = vk::Viewport::builder()
|
||||||
|
@ -668,7 +726,7 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
|
|
||||||
data.pipeline_layout = device.create_pipeline_layout(&layout_info, None)?;
|
data.pipeline_layout = device.create_pipeline_layout(&layout_info, None)?;
|
||||||
|
|
||||||
let stages = &[vert_stage, frag_stage];
|
let stages = &[vert_stage, geo_stage, frag_stage];
|
||||||
let info = vk::GraphicsPipelineCreateInfo::builder()
|
let info = vk::GraphicsPipelineCreateInfo::builder()
|
||||||
.stages(stages)
|
.stages(stages)
|
||||||
.vertex_input_state(&vertex_input_state)
|
.vertex_input_state(&vertex_input_state)
|
||||||
|
@ -686,6 +744,7 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
vk::PipelineCache::null(), &[info], None)?.0[0];
|
vk::PipelineCache::null(), &[info], None)?.0[0];
|
||||||
|
|
||||||
device.destroy_shader_module(vert_shader_module, None);
|
device.destroy_shader_module(vert_shader_module, None);
|
||||||
|
device.destroy_shader_module(geo_shader_module, None);
|
||||||
device.destroy_shader_module(frag_shader_module, None);
|
device.destroy_shader_module(frag_shader_module, None);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -5,8 +5,8 @@ use std::mem::size_of;
|
||||||
|
|
||||||
use cgmath;
|
use cgmath;
|
||||||
|
|
||||||
type Vec2 = cgmath::Vector2<f32>;
|
pub type Vec2 = cgmath::Vector2<f32>;
|
||||||
type Vec3 = cgmath::Vector3<f32>;
|
pub type Vec3 = cgmath::Vector3<f32>;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
|
Loading…
Reference in a new issue