diff --git a/engine/assets/file_resource.meta b/engine/assets/file_resource.meta index cef1942..3909059 100644 --- a/engine/assets/file_resource.meta +++ b/engine/assets/file_resource.meta @@ -1,8 +1,8 @@ -/engine/assets/shader/simple.vert: - - 020486aa-8987-4bd1-9de9-eeb7ab82c437 /engine/assets/asset/mesh1.asset: - 0a2ef3e8-db70-4d3f-94b1-09f9f92519cd - 7a01231c-c35d-4b74-b20f-4ca6823995d9 +/engine/assets/shader/simple.vert: + - 020486aa-8987-4bd1-9de9-eeb7ab82c437 /engine/assets/models/cube.obj: - 3f6a5afc-2f21-47c4-86ba-9ddb9852d8f4 - b91ca918-6b3c-4647-8773-d93d2807cb98 diff --git a/engine/assets/shader/simple.frag b/engine/assets/shader/simple.frag index 61415cf..23398b2 100644 --- a/engine/assets/shader/simple.frag +++ b/engine/assets/shader/simple.frag @@ -1,8 +1,7 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable - -layout(location = 0) out vec4 outColor; - +layout (location = 0) in vec4 vColor; +layout (location = 0) out vec4 oColor; void main() { - outColor = vec4(0.0, 1.0, 0.0, 1.0); + oColor = vColor; } \ No newline at end of file diff --git a/engine/assets/shader/simple.vert b/engine/assets/shader/simple.vert index 6f220d5..c8d3930 100644 --- a/engine/assets/shader/simple.vert +++ b/engine/assets/shader/simple.vert @@ -1,7 +1,11 @@ #version 450 -layout (location = 0) in vec2 aPos; +layout (location = 0) in vec3 iPos; +layout (location = 1) in vec2 iTex; + +layout (location = 0) out vec4 vColor; void main() { - gl_Position = vec4(aPos, 0.0, 1.0); + gl_Position = vec4(iPos.x, iPos.y, iTex.x, 1.0); + vColor = vec4(gl_Position.x, gl_Position.y, gl_Position.z, 1.0); } diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp index 02aefa1..61efc9e 100644 --- a/engine/src/engine/app.cpp +++ b/engine/src/engine/app.cpp @@ -12,7 +12,7 @@ namespace engineapi { const char* name = "zengine"; SystemList.push_back(new FileManager()); SystemList.push_back(new ResourceManager()); - SystemList.push_back(RenderAPI::API(GraphicsAPI::OpenGL)); + SystemList.push_back(RenderAPI::API(GraphicsAPI::Vulkan)); SystemList.push_back(Window::MakeInstance(3, 640, 720, name)); SystemList.push_back(new SceneManager()); } diff --git a/engine/src/engine/openglapi/openglapi.cpp b/engine/src/engine/openglapi/openglapi.cpp index d2136f7..b91e041 100644 --- a/engine/src/engine/openglapi/openglapi.cpp +++ b/engine/src/engine/openglapi/openglapi.cpp @@ -82,8 +82,7 @@ namespace openglapi { glVertexMeta v_meta = field_meta.CastTo(); GLvoid* offset = reinterpret_cast(field.GetOffset()); glVertexAttribPointer(count, v_meta.size, v_meta.type, v_meta.normalized, size, offset); - glEnableVertexAttribArray(count); - count++; + glEnableVertexAttribArray(count++); break; } } diff --git a/engine/src/engine/render/asset/material.h b/engine/src/engine/render/asset/material.h index 9cd8a92..a4808f1 100644 --- a/engine/src/engine/render/asset/material.h +++ b/engine/src/engine/render/asset/material.h @@ -7,6 +7,7 @@ namespace engineapi { REFL_FRIEND(Material) UPROPERTY() RscHandle mShader; + friend class Scene; public: Material(); diff --git a/engine/src/engine/render/asset/vertex.h b/engine/src/engine/render/asset/vertex.h index 7962e4a..998437b 100644 --- a/engine/src/engine/render/asset/vertex.h +++ b/engine/src/engine/render/asset/vertex.h @@ -15,12 +15,12 @@ namespace engineapi { UPROPERTY_gl({}, glVertexMeta{ 3, GL_FLOAT, GL_FALSE }) UPROPERTY_vk({}, uint32_t{ VK_FORMAT_R32G32B32_SFLOAT }) Vector3 Position = {}; - UPROPERTY_gl({}, glVertexMeta{ 3, GL_FLOAT, GL_FALSE }) - UPROPERTY_vk() - Vector3 Normal = {}; UPROPERTY_gl({}, glVertexMeta{ 2, GL_FLOAT, GL_FALSE }) UPROPERTY_vk() Vector2 TexCoords = {}; + UPROPERTY_gl({}, glVertexMeta{ 3, GL_FLOAT, GL_FALSE }) + UPROPERTY_vk() + Vector3 Normal = {}; }; struct BoneVertex : public Vertex { diff --git a/engine/src/engine/render/tool/glsl_to_spirv.cpp b/engine/src/engine/render/tool/glsl_to_spirv.cpp index ae9aeeb..14c26ae 100644 --- a/engine/src/engine/render/tool/glsl_to_spirv.cpp +++ b/engine/src/engine/render/tool/glsl_to_spirv.cpp @@ -1,6 +1,7 @@ #include "glsl_to_spirv.h" #include #include "meta/hash.h" +#include "zlog.h" using meta::string_hash; namespace engineapi { @@ -13,8 +14,12 @@ namespace engineapi options.SetOptimizationLevel(shaderc_optimization_level_performance); options.SetTargetEnvironment(shaderc_target_env::shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_3); auto result = compiler.CompileGlslToSpv(glsl, kind, code_id.data(), options); - if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success) + if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success) { + auto err_m = result.GetErrorMessage(); + auto err_msg = err_m.c_str(); + zlog::error("load spirv failed!!! {}", err_msg); return spirv_out; + } spirv_out = vector{ result.cbegin(),result.cend() }; } return spirv_out; diff --git a/engine/src/engine/vulkanapi/thread/worker.cpp b/engine/src/engine/vulkanapi/thread/worker.cpp index e7eb3ac..70d7cd1 100644 --- a/engine/src/engine/vulkanapi/thread/worker.cpp +++ b/engine/src/engine/vulkanapi/thread/worker.cpp @@ -10,7 +10,7 @@ namespace vulkanapi { ,mWork(name, 64) ,mImmediateExeCmd(mCommandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY) { - + mImmediateExeCmd.Fence() = mCommandPool.AllocateFence(); } void CommandWorker::Invoke(voidFn fn) { diff --git a/engine/src/engine/vulkanapi/vulkan_context.h b/engine/src/engine/vulkanapi/vulkan_context.h index e44e96e..8209efe 100644 --- a/engine/src/engine/vulkanapi/vulkan_context.h +++ b/engine/src/engine/vulkanapi/vulkan_context.h @@ -9,9 +9,10 @@ namespace vulkanapi { public: static RenderVulkanAPI* API; RenderPass* Pass{ nullptr }; - uint32_t frame; + uint32_t frame{0}; + uint32_t presentFrame{0}; + VkFence surfaceFence; VkSemaphore surfaceSemaphore; - VkSemaphore renderSemaphore; public: VulkanContext(RenderVulkanAPI* _API){ API = _API; diff --git a/engine/src/engine/vulkanapi/vulkanapi.cpp b/engine/src/engine/vulkanapi/vulkanapi.cpp index 39522ee..18429c4 100644 --- a/engine/src/engine/vulkanapi/vulkanapi.cpp +++ b/engine/src/engine/vulkanapi/vulkanapi.cpp @@ -77,7 +77,7 @@ namespace vulkanapi { meshBuffer.vertexCount = Vertices.size(); // ----------------------------------------------- Vertex Buffer ----------------------------------------------- - VkDeviceSize vertexBufferSize = Vertices.capicty(); + VkDeviceSize vertexBufferSize = Vertices.data_size(); VmaAllocationCreateInfo vertexVmaStagingInfo = {}; VmaAllocation vertexVmaStagingAlloc; VkBuffer vertexStagingBuffer = Buffer::CreateStageBuffer(vertexVmaStagingInfo, vertexVmaStagingAlloc, vertexBufferSize); @@ -148,7 +148,7 @@ namespace vulkanapi { vkCmdBindIndexBuffer(ptr, vulkanVAO.indexBuffer, 0, VK_INDEX_TYPE_UINT32); vkCmdBindPipeline(ptr, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipeline); vkCmdBindDescriptorSets(ptr, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipelineLayout, 0, 1, &pipeline.descriptorSet, 0, VK_NULL_HANDLE); - vkCmdDrawIndexed(ptr, 3, 1, 0, 0, 0); + vkCmdDrawIndexed(ptr, vulkanVAO.indexCount, 1, 0, 0, 0); context.Pass->EndPass(cmd); }); Backend::RenderWorker->Flush(); diff --git a/engine/src/engine/vulkanapi/wrapper/swapchain.cpp b/engine/src/engine/vulkanapi/wrapper/swapchain.cpp index 7503ea4..8423f44 100644 --- a/engine/src/engine/vulkanapi/wrapper/swapchain.cpp +++ b/engine/src/engine/vulkanapi/wrapper/swapchain.cpp @@ -44,18 +44,19 @@ namespace vulkanapi { args.Sharing = VK_SHARING_MODE_EXCLUSIVE; for (int i = 0; i < Creator.frames;i++) { mSurfaces.push_back(new Image(Creator.device,"swapchain" + to_string(i), swapchain_images[i], args)); + mSemaphores.push_back(Creator.device.CreateSemaphore()); + mFences.push_back(Creator.device.CreateFence()); } mFrames = Creator.frames; - mSurfaceSemaphore = Creator.device.CreateSemaphore(); - mRenderSemaphore = Creator.device.CreateSemaphore(); } void Swapchain::Aquire(VulkanContext& ctx) { - ctx.surfaceSemaphore = mSurfaceSemaphore; - vkAcquireNextImageKHR(mDevice.Ptr(), mPtr, UINT64_MAX, ctx.surfaceSemaphore, VK_NULL_HANDLE, &ctx.frame); - if (ctx.frame >= mFrames) { - ctx.frame = 0; - } + ctx.surfaceFence = mFences[ctx.frame]; + ctx.surfaceSemaphore = mSemaphores[ctx.frame]; + //if (vkWaitForFences(mDevice.Ptr(), 1, &ctx.surfaceFence, VK_TRUE, UINT64_MAX) != VK_SUCCESS) + //throw std::runtime_error("Failed to wait for fence!"); + vkAcquireNextImageKHR(mDevice.Ptr(), mPtr, UINT64_MAX, ctx.surfaceSemaphore, VK_NULL_HANDLE, &ctx.presentFrame); + vkResetFences(mDevice.Ptr(), 1, &ctx.surfaceFence); } void Swapchain::Present(VulkanContext& ctx) { @@ -67,8 +68,9 @@ namespace vulkanapi { presentInfo.waitSemaphoreCount = 1; presentInfo.pSwapchains = swapChains; presentInfo.swapchainCount = 1; - presentInfo.pImageIndices = &ctx.frame; + presentInfo.pImageIndices = &ctx.presentFrame; presentInfo.pResults = VK_NULL_HANDLE; Backend::RenderWorker->Present(presentInfo); + ctx.frame = (ctx.frame + 1) % mFrames; } } diff --git a/engine/src/engine/vulkanapi/wrapper/swapchain.h b/engine/src/engine/vulkanapi/wrapper/swapchain.h index c82833e..de4c63c 100644 --- a/engine/src/engine/vulkanapi/wrapper/swapchain.h +++ b/engine/src/engine/vulkanapi/wrapper/swapchain.h @@ -13,8 +13,8 @@ namespace vulkanapi { Device& mDevice; int mFrames; vector mSurfaces; - VkSemaphore mSurfaceSemaphore; - VkSemaphore mRenderSemaphore; + vector mFences; + vector mSemaphores; public: Swapchain(SwapchainCreator& Creator); void Aquire(VulkanContext& ctx);