fixed!!
This commit is contained in:
@@ -12,3 +12,5 @@ shade_runner = "0.1.2"
|
|||||||
shaderc = "0.5.0"
|
shaderc = "0.5.0"
|
||||||
cgmath = "0.17"
|
cgmath = "0.17"
|
||||||
winit = "0.19"
|
winit = "0.19"
|
||||||
|
image = "0.22.0"
|
||||||
|
tobj = "0.1.8"
|
||||||
@@ -5,5 +5,5 @@ layout(location = 0) in vec3 pos;
|
|||||||
layout(location = 0) out vec4 f_color;
|
layout(location = 0) out vec4 f_color;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
f_color = vec4(pos, 1.0);
|
f_color = vec4(.3, .1, .8, 1.0);
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
#version 450
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
layout(location = 0) in vec3 position;
|
layout(location = 0) in vec3 position;
|
||||||
|
|
||||||
layout(location = 0) out vec3 pos;
|
layout(location = 0) out vec3 pos;
|
||||||
|
|
||||||
layout(push_constant) uniform push_constants {
|
layout(push_constant) uniform PushConstants {
|
||||||
float time;
|
float time;
|
||||||
mat4 model;
|
mat4 model;
|
||||||
mat4 view;
|
mat4 view;
|
||||||
@@ -12,6 +13,6 @@ layout(push_constant) uniform push_constants {
|
|||||||
} push;
|
} push;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = push.projection * push.view * push.model * vec4(position + vec3(sin(push.time / 10.), 0., 0.), 1.0);
|
gl_Position = push.projection * push.view * push.model * vec4(position, 1.0);
|
||||||
pos = gl_Position.xyz;
|
pos = gl_Position.xyz;
|
||||||
}
|
}
|
||||||
46
src/main.rs
46
src/main.rs
@@ -2,9 +2,10 @@ use crate::vulkan::{Vertex, GameData};
|
|||||||
use winit::{Event, WindowEvent, ElementState};
|
use winit::{Event, WindowEvent, ElementState};
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
use cgmath::{Matrix4, SquareMatrix, Rad, Point3, Vector3};
|
use cgmath::{Matrix4, SquareMatrix, Rad, Point3, Vector3, Deg};
|
||||||
|
|
||||||
mod vulkan;
|
mod vulkan;
|
||||||
|
use vulkan::vs::ty::PushConstants;
|
||||||
|
|
||||||
const PRINT_KEYBOARD_INPUT: bool = false;
|
const PRINT_KEYBOARD_INPUT: bool = false;
|
||||||
|
|
||||||
@@ -40,29 +41,40 @@ impl GameData<'_> {
|
|||||||
|
|
||||||
fn update_push_constants(self: &mut Self) {
|
fn update_push_constants(self: &mut Self) {
|
||||||
self.push_constants.time = self.start_time.elapsed().unwrap().as_millis() as f32 / 1000.0;
|
self.push_constants.time = self.start_time.elapsed().unwrap().as_millis() as f32 / 1000.0;
|
||||||
self.push_constants.model = Matrix4::identity();
|
|
||||||
self.push_constants.view = Matrix4::look_at(Point3::new(f32::sin(self.push_constants.time), 0.0, f32::cos(self.push_constants.time)), Point3::new(0.0, 0.0, 0.0), Vector3::new(0.0, 1.0, 0.0));
|
let model = Matrix4::from_angle_z(Rad::from(Deg(self.push_constants.time * 100.0)));
|
||||||
self.push_constants.projection = cgmath::perspective(Rad(std::f32::consts::FRAC_PI_2), self.aspect_ratio, 0.01, 100.0);
|
|
||||||
|
let view = Matrix4::look_at(
|
||||||
|
Point3::new(2.0, 2.0, 2.0),
|
||||||
|
Point3::new(0.0, 0.0, 0.0),
|
||||||
|
Vector3::new(0.0, 0.0, 1.0)
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut proj = cgmath::perspective(
|
||||||
|
Rad::from(Deg(45.0)),
|
||||||
|
self.aspect_ratio,
|
||||||
|
0.1,
|
||||||
|
10.0
|
||||||
|
);
|
||||||
|
|
||||||
|
proj.y.y *= -1.0;
|
||||||
|
|
||||||
|
self.push_constants.model = model.into();
|
||||||
|
self.push_constants.view = view.into();
|
||||||
|
self.push_constants.projection = proj.into();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub struct PushConstants {
|
|
||||||
pub time: f32,
|
|
||||||
pub model: Matrix4<f32>,
|
|
||||||
pub view: Matrix4<f32>,
|
|
||||||
pub projection: Matrix4<f32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut whatever = String::new();
|
// let mut whatever = String::new();
|
||||||
std::io::stdin().read_line(&mut whatever).unwrap();
|
// std::io::stdin().read_line(&mut whatever).unwrap();
|
||||||
|
|
||||||
let mut pc = PushConstants {
|
let mut pc = PushConstants {
|
||||||
time: 0.0,
|
time: 0.0,
|
||||||
model: Matrix4::identity(),
|
_dummy0: [0; 12],
|
||||||
view: Matrix4::identity(),
|
model: Matrix4::identity().into(),
|
||||||
projection: Matrix4::identity()
|
view: Matrix4::identity().into(),
|
||||||
|
projection: Matrix4::identity().into(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let data = GameData {
|
let data = GameData {
|
||||||
|
|||||||
@@ -298,11 +298,11 @@ pub fn init(mut game: GameData) {
|
|||||||
Err(err) => panic!("{:?}", err)
|
Err(err) => panic!("{:?}", err)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
game.update_push_constants();
|
||||||
|
|
||||||
// Specify the color to clear the framebuffer with i.e. blue
|
// Specify the color to clear the framebuffer with i.e. blue
|
||||||
let clear_values = vec!([0.0, 0.0, 1.0, 1.0].into(), 1f32.into());
|
let clear_values = vec!([0.0, 0.0, 1.0, 1.0].into(), 1f32.into());
|
||||||
|
|
||||||
game.update_push_constants();
|
|
||||||
|
|
||||||
// In order to draw, we have to build a *command buffer*. The command buffer object holds
|
// In order to draw, we have to build a *command buffer*. The command buffer object holds
|
||||||
// the list of commands that are going to be executed.
|
// the list of commands that are going to be executed.
|
||||||
//
|
//
|
||||||
@@ -409,6 +409,20 @@ fn window_size_dependent_setup(device: Arc<Device>, images: &[Arc<SwapchainImage
|
|||||||
}).collect::<Vec<_>>()
|
}).collect::<Vec<_>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod vs {
|
||||||
|
vulkano_shaders::shader!{
|
||||||
|
ty: "vertex",
|
||||||
|
path: "shaders/triangle.vert"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod fs {
|
||||||
|
vulkano_shaders::shader! {
|
||||||
|
ty: "fragment",
|
||||||
|
path: "shaders/triangle.frag"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn create_pipeline<T: RenderPassAbstract>(device: Arc<Device>, sub_pass: Subpass<Arc<T>>, vertex_shader_path: &str, fragment_shader_path: &str, is_line: bool) -> Option<Arc<GraphicsPipeline<SingleBufferDefinition<Vertex>, Box<dyn PipelineLayoutAbstract + Send + Sync>, Arc<T>>>> {
|
fn create_pipeline<T: RenderPassAbstract>(device: Arc<Device>, sub_pass: Subpass<Arc<T>>, vertex_shader_path: &str, fragment_shader_path: &str, is_line: bool) -> Option<Arc<GraphicsPipeline<SingleBufferDefinition<Vertex>, Box<dyn PipelineLayoutAbstract + Send + Sync>, Arc<T>>>> {
|
||||||
if let Some((shader, shader_data)) = read_shader(vertex_shader_path, fragment_shader_path) {
|
if let Some((shader, shader_data)) = read_shader(vertex_shader_path, fragment_shader_path) {
|
||||||
let vertex_shader_entry;
|
let vertex_shader_entry;
|
||||||
@@ -445,20 +459,13 @@ fn create_pipeline<T: RenderPassAbstract>(device: Arc<Device>, sub_pass: Subpass
|
|||||||
.build(device.clone())
|
.build(device.clone())
|
||||||
.unwrap());
|
.unwrap());
|
||||||
} else {
|
} else {
|
||||||
// Before we draw we have to create what is called a pipeline. This is similar to an OpenGL
|
|
||||||
// program, but much more specific.
|
|
||||||
pipeline = Arc::new(GraphicsPipeline::start()
|
pipeline = Arc::new(GraphicsPipeline::start()
|
||||||
.vertex_input_single_buffer::<Vertex>()
|
.vertex_input_single_buffer::<Vertex>()
|
||||||
// A Vulkan shader can in theory contain multiple entry points, so we have to specify
|
|
||||||
// which one. The `main` word of `main_entry_point` actually corresponds to the name of
|
|
||||||
// the entry point.
|
|
||||||
.vertex_shader(vertex_shader_entry.clone(), ())
|
.vertex_shader(vertex_shader_entry.clone(), ())
|
||||||
.triangle_list()
|
.triangle_list()
|
||||||
// Use a resizable viewport set to draw over the entire window
|
|
||||||
.viewports_dynamic_scissors_irrelevant(1)
|
.viewports_dynamic_scissors_irrelevant(1)
|
||||||
|
.depth_stencil_simple_depth()
|
||||||
.fragment_shader(fragment_shader_entry.clone(), ())
|
.fragment_shader(fragment_shader_entry.clone(), ())
|
||||||
// We have to indicate which subpass of which render pass this pipeline is going to be used
|
|
||||||
// in. The pipeline will only be usable from this particular subpass.
|
|
||||||
.render_pass(sub_pass.clone())
|
.render_pass(sub_pass.clone())
|
||||||
.build(device.clone())
|
.build(device.clone())
|
||||||
.unwrap());
|
.unwrap());
|
||||||
|
|||||||
Reference in New Issue
Block a user