1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-22 20:17:46 +00:00

Properly set camera so model is visible

There's still a long way to go, but now it finally works :-)
This commit is contained in:
Joshua Goins 2022-04-12 02:06:16 -04:00
parent 92c52e358a
commit eb13fbbb64
4 changed files with 31 additions and 10 deletions

View file

@ -1,5 +1,13 @@
find_package(Vulkan REQUIRED)
FetchContent_Declare(
glm
GIT_REPOSITORY https://github.com/g-truc/glm.git
GIT_TAG 0.9.9.8
)
FetchContent_MakeAvailable(glm)
add_library(renderer src/renderer.cpp)
target_include_directories(renderer PUBLIC include)
target_link_libraries(renderer PUBLIC Vulkan::Vulkan fmt::fmt libxiv)
target_link_libraries(renderer PUBLIC Vulkan::Vulkan fmt::fmt libxiv glm::glm)

View file

@ -2,6 +2,10 @@
layout(location = 0) in vec3 inPosition;
layout( push_constant ) uniform PushConstant {
mat4 mvp;
};
void main() {
gl_Position = vec4(inPosition, 1.0);
gl_Position = mvp * vec4(inPosition, 1.0);
}

Binary file not shown.

View file

@ -6,6 +6,8 @@
#include <vector>
#include <valarray>
#include <fstream>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/transform.hpp>
Renderer::Renderer() {
VkApplicationInfo applicationInfo = {};
@ -383,6 +385,12 @@ void Renderer::render(std::vector<RenderModel> models) {
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &model.vertexBuffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, model.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
glm::mat4 p = glm::perspective(glm::radians(90.0f), 1.0f, 0.1f, 100.0f);
glm::mat4 v = glm::lookAt(glm::vec3(2), glm::vec3(0), glm::vec3(0, 1, 0));
glm::mat4 mvp = p * v;
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &mvp);
vkCmdDrawIndexed(commandBuffer, model.numIndices, 1, 0, 0, 0);
}
@ -562,13 +570,12 @@ void Renderer::initPipeline() {
inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
VkViewport viewport = {};
viewport.width = 640;
viewport.height = 480;
viewport.width = swapchainExtent.width;
viewport.height = swapchainExtent.height;
viewport.maxDepth = 1.0f;
VkRect2D scissor = {};
scissor.extent.width = 640;
scissor.extent.height = 489;
scissor.extent = swapchainExtent;
VkPipelineViewportStateCreateInfo viewportState = {};
viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
@ -595,15 +602,17 @@ void Renderer::initPipeline() {
colorBlending.attachmentCount = 1;
colorBlending.pAttachments = &colorBlendAttachment;
std::array<VkDynamicState, 2> dynamicStates = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
VkPipelineDynamicStateCreateInfo dynamicState = {};
dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
dynamicState.dynamicStateCount = static_cast<uint32_t>(dynamicStates.size());
dynamicState.pDynamicStates = dynamicStates.data();
VkPushConstantRange pushConstantRange = {};
pushConstantRange.size = sizeof(glm::mat4);
pushConstantRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
VkPipelineLayoutCreateInfo pipelineLayoutInfo{};
pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pipelineLayoutInfo.pushConstantRangeCount = 1;
pipelineLayoutInfo.pPushConstantRanges = &pushConstantRange;
vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout);