在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Vulkan API的一般使用模式及使用需要的基本元素說明

Dbwd_Imgtec ? 來源:未知 ? 作者:微信公眾號:Ima ? 2019-09-14 08:32 ? 次閱讀

Vulkan是Khronos Group(OpenGL標(biāo)準(zhǔn)的維護(hù)組織)開發(fā)的一個(gè)新API,它提供了對現(xiàn)代顯卡的一個(gè)更好的抽象,與OpenGL和Direct3D等現(xiàn)有api相比,Vulkan可以更詳細(xì)的向顯卡描述你的應(yīng)用程序打算做什么,從而可以獲得更好的性能和更小的驅(qū)動開銷。Vulkan的設(shè)計(jì)理念與Direct3D 12和Metal基本類似,但Vulkan作為OpenGL的替代者,它設(shè)計(jì)之初就是為了跨平臺實(shí)現(xiàn)的,可以同時(shí)在Windows、LinuxAndroid開發(fā)。甚至在Mac OS系統(tǒng)上,Khronos也提供了Vulkan的SDK,雖然這個(gè)SDK底層其實(shí)是使用MoltenVK實(shí)現(xiàn)的。

MoltenVK實(shí)際上是一個(gè)將Vulkan API映射到Metal API的一個(gè)框架,Vulkan這里只是相當(dāng)于一個(gè)抽象層。

然而,為了得到一個(gè)更好的性能,Vulkan引入了一個(gè)非常冗余的API。相比于OpenGL驅(qū)動幫我們做了大量的工作,Vulkan與圖像api相關(guān)的每一個(gè)細(xì)節(jié),都需要從頭設(shè)置,包括初始幀緩沖區(qū)的創(chuàng)建與緩沖、紋理內(nèi)存的管理等等。因此,哪怕只畫一個(gè)三角形,我們都要寫數(shù)倍于OpenGL的代碼。

而Google在Android 7.0后提供了對Vulkan的支持,并且提供了一系列工具鏈與Validation Layers(后面會進(jìn)行說明)。在Android Studio中,只要將Shader代碼放在src/main/shaders文件夾下面,項(xiàng)目編譯時(shí)會自動被編譯成.spv字節(jié)碼,可以作為assets使用。

由于Vulkan的使用非常冗長,這篇文章將主要介紹Vulkan API的一般使用模式以及畫一個(gè)三角形所需要的基本元素。

Vulkan畫三角形的各個(gè)步驟

1. Instance and physical device selection

Vulkan程序需要創(chuàng)建一個(gè)VkInstance來啟用vulkan API.在創(chuàng)建Instance時(shí)你需要準(zhǔn)確的描述你的應(yīng)用程序的一些屬性,以及你需要使用的各種API。在創(chuàng)建Instance之后,你需要查詢硬件對vulkan的支持,并選擇一個(gè)或者多個(gè)VkPhysicalDevices。你會查詢各種硬件參數(shù),比如顯存和顯卡兼容性,來選取最理想的設(shè)備。舉個(gè)例子,相比集顯,咱們更喜歡獨(dú)顯。

2. Logical device and queue families

在決定使用哪塊顯卡之后,你需要創(chuàng)建一個(gè)VkDevice (logical device),在創(chuàng)建過程中你還要更詳細(xì)的描述你用到的硬件特性(VkPhysicalDeviceFeatures),比如multi viewport rendering(該特性VR渲染非常有用)和64位浮點(diǎn)支持(科學(xué)計(jì)算和HDR都需要),你還需要制定你要使用的queue families。

大部分Vulkan操作, 比如繪制命令和內(nèi)存/顯存操作, 都需要通過提交到VkQueue之后異步執(zhí)行。Queue是從queue family分配的,每個(gè)queue family中的Queue只支持某個(gè)特定集合的操作。舉個(gè)例子,對于顯卡,執(zhí)行圖形渲染、并行計(jì)算和內(nèi)存交換可能是不同的queue family。在選擇physical device時(shí)queue family的支持也是重要的參考之一。只支持科學(xué)計(jì)算不支持圖形渲染的顯卡有可能存在(事實(shí)上繪圖相關(guān)的queue family是vulkan的擴(kuò)張而非核心功能),但是這年頭支持vulkan但不支持繪圖的設(shè)備,其實(shí)也不多。

3. Window surface and swap chain

除非你不想顯示圖形(比如你只想離屏渲染),不然你還是需要創(chuàng)建一個(gè)窗口來顯示的。你可以用各個(gè)平臺native的API(win32,xlib,xcb,mir,wayland),或者GLFW、SDL等申請window。如果真的想渲染到一個(gè)窗口,還需要兩樣?xùn)|西: window surface (VkSurfaceKHR) 和 swap chain (VkSwapChainKHR)。注意 KHR 后綴,有openGL開發(fā)經(jīng)驗(yàn)的同學(xué)可能清楚,這個(gè)后綴表示一個(gè)KHR擴(kuò)展。Vulkan API 是平臺無關(guān)的, 所以需要一個(gè)標(biāo)準(zhǔn)化的 WSI (Window System Interface) 擴(kuò)展來和窗口系統(tǒng)進(jìn)行交互。Surface是一個(gè)window渲染目標(biāo)的抽象,創(chuàng)建時(shí)需要一個(gè)native窗口的句柄(和openGL完全一樣)。Swap chain是渲染一系列渲染目標(biāo)(render target)的集合。他本來是保證我們渲染的image和屏幕上顯示的image不是同一個(gè)(openGL雙緩沖模型,目的是減少渲染時(shí)屏幕閃爍)。除了經(jīng)典的雙緩沖模型,還有三緩沖模型等。

4. Image views and framebuffers

在從swap chain獲得image之后,我們應(yīng)該繪制它。為了繪制image,我們需要把這個(gè)image用 VkImageView 以及 VkFramebuffer進(jìn)行包裝。VkImageView 指向被使用的 image ,而 VkFramebuffer 指向具體作為顏色、模板、深度目標(biāo)的VkImageView。Swap chain中可能存在很多iamge,每個(gè)都需要創(chuàng)建image view還有framebuffer。在渲染時(shí),我們需要選擇正確的image進(jìn)行繪制。

5. Render passes

Vulkan中的Render Pass描述了渲染過程中的image類型以及這些image包括他們的內(nèi)容會如何被使用,在我們這個(gè)Hello Triangle程序中,我們只使用一個(gè)image作為顏色目標(biāo),并且在渲染前這個(gè)image的類型會被清除成一個(gè)固定的顏色。Render Pass只描述了image的類型,而VkFramebuffer才是真正綁定該image的對象。

6. Graphics pipeline

Vulkan中通過創(chuàng)建VkPipeline對象來創(chuàng)建graphics pipeline,它用來描述顯卡各個(gè)渲染階段的參數(shù),比如viewport的長寬、如何使用深度緩沖,以及用VkShaderModule詳細(xì)描述的可編程管線的狀態(tài)。Vulkan和其他圖形API有個(gè)顯著區(qū)別,就是的幾乎所有配置都需要提前創(chuàng)建。即便是更換一個(gè)shader或者改變定點(diǎn)參數(shù)的布局(vertex layout),你都需要完全從新graphics pipeline創(chuàng)建一個(gè)graphics pipeline。這也意味著你需要創(chuàng)建大量的VkPipeline對象,來覆蓋你渲染過程中的各種graphics pipeline變化,只有改變viewport或者改變clear color不需要重新生成graphics pipeline。但是正因?yàn)殇秩竟芫€各階段都提前準(zhǔn)備了,而不是運(yùn)行時(shí)生成,驅(qū)動可以更好的執(zhí)行優(yōu)化。

7. Command pools and command buffers

前文中已經(jīng)提到了,Vulkan中的各種操作,都需要靠提交到一個(gè)命令隊(duì)列(queue)的方式進(jìn)行異步執(zhí)行。而在提交到命令隊(duì)列之前,需要在VkCommandBuffer中進(jìn)行記錄。命令緩沖和一個(gè)VkCommandPool關(guān)聯(lián),而VkCommandPool又和queue family關(guān)聯(lián)。即便只畫一個(gè)簡單的三角形,我們也需要生成如下的command buffer:
Begin the render pass Bind the graphics pipeline Draw 3 vertices End the render pass 因?yàn)閒ramebuffer中的image由swap chain決定,每個(gè)可能的iamge都需要一個(gè)command buffer,這就需要創(chuàng)建大量的command buffer。也可以每幀重新生成command buffer,但是效率會低很多。

8. Main loop

在command buffer準(zhǔn)備好了之后,主循環(huán)就簡單多了。我們先使用vkAcquireNextImageKHR方法得到一個(gè)image。然后選擇合適的command buffer再使用vkQueueSubmit執(zhí)行。最后使用vkQueuePresentKHR方法向swap chain傳遞我們準(zhǔn)備在屏幕上顯示的image。另外需要注意的是提交到命令隊(duì)列的命令是異步的,因此保證運(yùn)行順序,就是開發(fā)者的工作了。vulkan提供了用來同步的對象,比如semaphore,fence等。我們可以使用這些同步對象來保證運(yùn)行的正確順序。

總結(jié)

總而言之,畫三角需要如下的步驟:

創(chuàng)建 VkInstance

創(chuàng)建 VkPhysicalDevice

創(chuàng)建 VkDevice 以及 VkQueue

創(chuàng)建 window, window surface 以及 swap chain

使用 VkImageView 包裝swap chain中的images

創(chuàng)建 render pass

創(chuàng)建 framebuffers

創(chuàng)建 graphics pipeline

為每個(gè)可能用到的image創(chuàng)建command buffer,并記錄draw commands

通過獲取image,向image繪制,提交到swap chain的方式來繪制一幀

Vulkan Layers

Vulkan作為高性能API,為了降低驅(qū)動開銷,只提供了非常有限的錯(cuò)誤檢查。如果默認(rèn)情況下,它只包含非常有限的錯(cuò)誤檢查和調(diào)試功能。如果發(fā)生了錯(cuò)誤,驅(qū)動會直接崩潰,而不是返回錯(cuò)誤信息,或者顯示異常等。

Vulkan允許您通過一個(gè)名為Validation Layer的特性進(jìn)行通用的檢查。Validation Layer是可以插入到API和圖形驅(qū)動程序之間的代碼片段,用于執(zhí)行額外的函數(shù)參數(shù)檢查和跟蹤內(nèi)存管理問題。好處是,您可以在開發(fā)過程中啟用它們,然后在釋放應(yīng)用程序時(shí)完全禁用它們,而開銷為零。任何人都可以編寫自己的驗(yàn)證層,但是LunarG的Vulkan SDK提供了一組標(biāo)準(zhǔn)的驗(yàn)證層,另外還需要注冊一個(gè)回調(diào)函數(shù)來接收來自Validation Layer的調(diào)試消息。

因?yàn)閂ulkan實(shí)際上對于每一個(gè)步驟是非常明確的,所以相比于OpenGL,我們可以更快速的找出出錯(cuò)的地方。

而Google也提供了一些Validation Layers幫助我們做這些事情,如果要在項(xiàng)目中使用它們,只要修改gradle的構(gòu)建,或者將二進(jìn)制文件手動的添加到項(xiàng)目的JNI庫目錄里,這些so可以在ndk的以下目錄找到:

${your-ndk-dir}/sources/third_party/vulkan/src/build-android/jniLibs
sourceSets {
main {
jniLibs {
srcDir "${your-ndk-dir}/sources/third_party/vulkan/src/build-android/jniLibs"
}
}
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3967

    瀏覽量

    129673
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11469

    瀏覽量

    212933
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1563

    瀏覽量

    63613

原文標(biāo)題:Vulkan入門流程

文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    文解讀Vulkan圖形系統(tǒng)究竟是什么?

    Vulkan圖形系統(tǒng)是什么?Vulkan個(gè)圖形和計(jì)算硬件的API。這個(gè)API由很多命令組成,它們允許程序員指定著色器程序,計(jì)算內(nèi)核,對象
    的頭像 發(fā)表于 04-22 09:30 ?1.2w次閱讀

    Qualcomm宣布Adreno 530 GPU支持Vulkan API

    Qualcomm Incorporated (NASDAQ: QCOM)今日宣布,其子公司Qualcomm Technologies, Inc.在集成于高通驍龍? 820處理器的Qualcomm? Adreno? 530 GPU上,實(shí)現(xiàn)了對Khronos?最新圖形和計(jì)算API——
    發(fā)表于 02-19 11:24 ?6184次閱讀

    款支持Vulkan的Android OS問世

    上周,款最新的Android操作系統(tǒng)(7.0 Nougat)在英國發(fā)布,該產(chǎn)品支持Vulkan? API,集合了多種新型功能和特性,并可以次在同
    發(fā)表于 02-09 12:14 ?372次閱讀

    Vulkan vs OpenGL ES:PowerVR 3D衛(wèi)星導(dǎo)航APP

    PowerVR架構(gòu)能快速支持最新的技術(shù),Vulkan API便是實(shí)證。Vulkan款現(xiàn)代的API,使開發(fā)人員能夠獲得底層圖像硬件的“低級
    發(fā)表于 03-30 10:30 ?781次閱讀
     <b class='flag-5'>Vulkan</b> vs OpenGL ES:PowerVR 3D衛(wèi)星導(dǎo)航APP

    暢快開黑 加6T開通王者榮耀Vulkan模式

    更加極致的游戲體驗(yàn)。 圖:加6T現(xiàn)已開通Vulkan模式 Vulkan是Khronos 標(biāo)準(zhǔn)組織退出的新代圖形處理接口(
    的頭像 發(fā)表于 11-09 09:30 ?2134次閱讀

    如何使用Vulkan Graphics API

    本視頻將幫助您開始使用Vulkan
    的頭像 發(fā)表于 11-01 06:19 ?4776次閱讀

    英特爾圖形上Vulkan API的實(shí)時(shí)演示

    在GDC 2015上記錄了來自Khronos?的OpenGL與Vulkan?API的實(shí)時(shí)演示。使用Vulkan?的Kishonti原型也進(jìn)行了演示。 Vulkan?
    的頭像 發(fā)表于 11-07 06:56 ?3148次閱讀

    Vulkan編程接口的特征

    的,所以在極大程度上Vulkan里的計(jì)算模型是基于并行計(jì)算的。Vulkan還可以訪問運(yùn)行應(yīng)用程序的主處理器上的共享或非共享內(nèi)存。Vulkan也會給開發(fā)人員提供這個(gè)內(nèi)存。 Vulkan
    的頭像 發(fā)表于 03-15 17:17 ?2199次閱讀

    Vulkan API 基本類型介紹

    Vulkan 基本類型,Vulkan 開發(fā)需要設(shè)計(jì)的類型非常多,整理其基本類型如下,主要包含設(shè)備、隊(duì)列、命令緩沖、隊(duì)列家族、渲染通,管線等……
    的頭像 發(fā)表于 02-12 16:19 ?2118次閱讀

    Vulkan API 基本類型 小結(jié)

    Vulkan 基本類型,Vulkan 開發(fā)需要設(shè)計(jì)的類型非常多,整理其基本類型如下,主要包含設(shè)備、隊(duì)列、命令緩沖、隊(duì)列家族、渲染通,管線等……
    發(fā)表于 02-23 06:02 ?5次下載
    <b class='flag-5'>Vulkan</b> <b class='flag-5'>API</b> 基本類型 小結(jié)

    表面貼裝元件的熱管理一般應(yīng)用說明

    表面貼裝元件的熱管理一般應(yīng)用說明
    發(fā)表于 04-29 18:41 ?11次下載
    表面貼裝元件的熱管理<b class='flag-5'>一般</b>應(yīng)用<b class='flag-5'>說明</b>

    高效電流模式同步降壓PWM DC-直流調(diào)節(jié)器FP6165一般說明

    電子發(fā)燒友網(wǎng)站提供《高效電流模式同步降壓PWM DC-直流調(diào)節(jié)器FP6165一般說明》資料免費(fèi)下載
    發(fā)表于 12-08 11:45 ?0次下載

    FS4070:同步開關(guān)模式鋰離子電池充電器一般說明

    電子發(fā)燒友網(wǎng)站提供《FS4070:同步開關(guān)模式鋰離子電池充電器一般說明.pdf》資料免費(fèi)下載
    發(fā)表于 12-18 10:41 ?0次下載

    FP7152電流模式感應(yīng)式降壓變頻器一般說明

    電子發(fā)燒友網(wǎng)站提供《FP7152電流模式感應(yīng)式降壓變頻器一般說明》資料免費(fèi)下載
    發(fā)表于 01-12 16:06 ?0次下載

    一般繼電器需要多少電流才能驅(qū)動

    一般繼電器所需的驅(qū)動電流會根據(jù)其型號、規(guī)格和額定工作電壓等因素有所不同。通常,繼電器需要定的電流來驅(qū)動其線圈產(chǎn)生磁場,從而使觸點(diǎn)閉合或斷開。以下是對繼電器驅(qū)動電流的一般
    的頭像 發(fā)表于 09-05 15:18 ?6519次閱讀
    主站蜘蛛池模板: 久久99精品久久久久久久不卡 | 五月天婷婷一区二区三区久久 | 日本精品三级 | 国产玖玖 | 亚洲综合五月天欧美 | 国产一级大片在线观看 | 成人在线网| 中文字幕一区2区 | 看黄免费在线 | 日本午夜色 | 91高清在线成人免费观看 | 国产操视频| 欧美xxxxxbbbb | 亚洲国产精品久久久久婷婷老年 | 免费视频国产 | 美女三级网站 | 俺来也俺去啦久久综合网 | 亚久久 | 天天操夜夜操狠狠操 | 天天躁夜夜躁狠狠躁2024 | 免费看片免 | 高h细节肉爽文bl文 高h细节肉爽文男男 | 99香蕉国产 | 国产免费人成在线视频视频 | 午夜欧美成人久久久久久 | 国产视频每日更新 | 亚洲综合激情丁香六月 | 亚洲一区欧美日韩 | 一色屋免费视频 | 丁香花在线观看免费观看 | 亚洲va久久久噜噜噜久久 | 亚洲国产精品国产自在在线 | 天天做天天爱夜夜爽女人爽宅 | 国产三级毛片视频 | 精品久久天干天天天按摩 | 国产精品久久久久久久久久妇女 | 国产午夜人做人视频羞羞 | 57pao强力打造免费高清高速 | 九九国产在线观看 | 18性夜影院午夜寂寞影院免费 | 国产性片在线 |