ETH官方钱包

前往
大廳
主題

Vulkan基本渲染框架 + code

%%鼠 拒收病婿 | 2024-12-18 20:11:20 | 巴幣 1228 | 人氣 32

前言

重學Vulkan,並用所學大大提升專案的可攜性,此專案包含glm等套件,使用者只需安裝VulkanSDK就能直接跑。


為甚麼Vulkan要寫將近1000行程式才能畫出一個三角形?

Vulkan是一個低層次、高性能的圖形API,設計目的是給開發者更多的控制權和靈活性。與OpenGL和DirectX等高層次API不同,Vulkan要求開發者手動管理很多細節,如記憶體分配、資源同步和狀態變更。這意味著需要更多的代碼來設定和維護圖形管線和資源,從而提高性能和可擴展性。

成果:


主程式邏輯

main function如下,我有盡量將Swapchain,RenderPass,Instance物件模組化。
#include "./core/DisplayWindow.hpp"
#include "./core/CoreInstance.hpp"
#include "./core/SwapChain.hpp"
#include "./core/GraphicsPipeline.hpp"
#include "render/Renderer.hpp"
int main() {
    ltn::DisplayWindow main_window{};
    ltn::CoreInstance coreInstance{ *main_window.get_window() };
    ltn::SwapChain swapchain{coreInstance,main_window.SCR_WIDTH , main_window.SCR_HEIGHT};
    ltn::GraphicsPipeline pipeline{ coreInstance , swapchain };
    ltn::Renderer forward_renderer_pass{ coreInstance , swapchain };


    pipeline.create_pipleine(
        forward_renderer_pass.get_renderPass(),
        nullptr
        //gameobject.get_all_descriptorLayouts()
    );
    while (main_window.is_window_alive())
    {
        glfwPollEvents();
        forward_renderer_pass.reset_renderpass();
        forward_renderer_pass.begin_commandBuffer();

        //===========================
        //Draw commands
        //===========================
        vkCmdBindPipeline(
            forward_renderer_pass.get_current_cmdbuffer(),
            VK_PIPELINE_BIND_POINT_GRAPHICS,
            pipeline.get_pipeline());
        vkCmdDraw(forward_renderer_pass.get_current_cmdbuffer(), 3, 1, 0, 0);
        //------------------------------

        forward_renderer_pass.end_render();
        forward_renderer_pass.draw_frame();
    }
}



關聯

要用Vulkan渲染,需要有幾個大部件組成:

Instance

包含app資訊等等。Instance的生命週期應該要是最長的。

Surface

這邊用glfw提供window,而surface是我們會渲染上去的。
所以大部分情況surface 解析度=window size,但在某些超解析度的設備會出現兩者不相等的問題,這邊需要檢查設備支援的解析度來設定surface大小。

Physical device

硬體設備。
硬體決定了支援的framebuffer format(如R8G8B8A8、或R32G32B32A32、有無stencil等等)、swapchain模式(FIFO, mailbox等等,其中FIFO保證有支援)。

Logical device

Physical 與Logical device之間的橋樑是"Queue"。 其中必要的是graphic queue(表示你的硬體能計算圖元)與present queue (表示你的硬體支援把圖顯示出來)

SwapChain

定義並實作了數張frame buffer以及其交換的邏輯。(其交換邏輯將會影響FPS、耗電量、畫面撕裂。)

Command pool

通常一張framebuffer會有一個對應的command buffer,command buffer用來存放bind,draw等command,在結束時一次執行。

Pipeline

負責載入pipeline各階段的shader code,並存為shaderModule放入對應的layout中。bind pipeline後會依序進入。


ToDo:
  • Window resize
  • Texture

送禮物贊助創作者 !
0
留言

創作回應

更多創作