亚洲欧美日韩国产成人|亚洲中文字幕无码中字|HEYZO在线无码综合|久久久不卡精品国产一区二|久久精品亚洲无中文东京热|中文字幕乱码一区三区免费|亚洲国产欧美在线观看片不卡|国产精品久久一区二区三区97

深度揭秘(vulkan在哪里查看)vulkan support,Vukan Guide學(xué)習(xí)(4.4),家庭養(yǎng)花,

保健品 nanfang 2023-09-05 02:24 129 0

1.vulkan怎么查看

統(tǒng)一緩沖區(qū)非常適合小的只讀數(shù)據(jù)但是,如果您想要在著色器中的不知道大小為多少的數(shù)據(jù)或者可以寫的數(shù)據(jù)怎么辦?為此,您可以使用存儲緩沖區(qū)存儲緩沖區(qū)通常比統(tǒng)一緩沖區(qū)稍慢,但它們可以大得多如果你想把你的整個(gè)場景塞進(jìn)一個(gè)緩沖區(qū),你必須使用它們。

2.vulkan怎么看版本如的筆順

確保對其進(jìn)行分析以了解性能使用存儲緩沖區(qū),您可以在著色器中擁有一個(gè)大小不一的數(shù)組,其中包含您想要的任何數(shù)據(jù)它們的常見用途是存儲場景中所有對象的數(shù)據(jù)我們將使用它們來刪除對象矩陣的 使我們能夠在當(dāng)前幀的開始批量上傳矩陣的 推送常量,然后我們不再需要在每次繪制時(shí)進(jìn)行單獨(dú)的推送常量調(diào)用。

3.vulkan webgl

這也意味著我們將所有對象矩陣保存在一個(gè)數(shù)組中,這可以在計(jì)算著色器中做一些有趣的事情創(chuàng)建著色器存儲緩沖區(qū)我們繼續(xù)研究這個(gè)init_descriptors()函數(shù),因?yàn)樗俏覀優(yōu)橹鲄?shù)初始化所有緩沖區(qū)的地方。

4.vulkan viewport

在那里,我們將每幀初始化一個(gè)大的存儲緩沖區(qū),以保存如的筆順對象的數(shù)據(jù)這是因?yàn)槲覀兿M麑ο笕匀皇莿討B(tài)的如果我們有完全靜態(tài)的對象,我們就不需要每幀一個(gè)緩沖區(qū),總共一個(gè)就足夠了structFrameData{AllocatedBuffer

5.vulkan版本1.0.3安裝教程分享

objectBuffer;};structGPUObjectData{glm::mat4modelMatrix;}voidVulkanEngine::init_descriptors(){// other code ...

6.vulkan api headers & library

for(inti=0;i

7.vulkan如何查看

(GPUObjectData)*MAX_OBJECTS如的筆順,VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,VMA_MEMORY_USAGE_CPU_TO_GPU);//other code ....

8.vulkan在哪里打開

}}著色器存儲緩沖區(qū)的創(chuàng)建方式與統(tǒng)一緩沖區(qū)相同它們的工作方式也大致相同,只是具有不同的屬性,例如增加的最大大小和可在著色器中寫入的特性我們將保留每幀 10000 個(gè) ObjectData 的數(shù)組這意味著我們最多可以容納 10000 個(gè)對象矩陣,每幀渲染 10000 個(gè)對象。

9.vulkan版本

這是一個(gè)很小的數(shù)字,目前這不是問題當(dāng)引擎加載更多對象時(shí),虛幻引擎會根據(jù)需要增加它們的對象緩沖區(qū),但我們沒有任何可增長如的筆順的緩沖區(qū)抽象,因此我們預(yù)先保留雖然這里的大小是 10000,但您可以將其增加到任何您想要的大小。

10.vulkan版本在哪看

存儲緩沖區(qū)的最大大小相當(dāng)大,在大多數(shù) GPU 中,它們可以與 VRAM 一樣大,因此如果需要,您可以使用 1 億個(gè)矩陣來實(shí)現(xiàn)我們現(xiàn)在需要將它添加到描述符集我們已經(jīng)將所有內(nèi)容添加到 0 號描述符集,但為此,我們將使用 1 號描述符集。

這意味著我們需要另一個(gè)描述符集布局,并將其掛接到管道創(chuàng)建中新的描述符集structFrameData{AllocatedBufferobjectBuffer;VkDescriptorSetobjectDescriptor

;};classVulk如的筆順anEngine{VkDescriptorSetLayout_globalSetLayout;VkDescriptorSetLayout_objectSetLayout;}我們將采用與相機(jī)緩沖區(qū)類似的方法,其中我們將有一個(gè)描述符指向一個(gè)緩沖區(qū)。

因?yàn)檫@是一個(gè)新的描述符集,我們還需要存儲它的布局以連接到管道回到上面init_descriptors(),我們將需要在描述符池中為它保留空間std::vector

>sizes={{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,10},{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,10},{VK如的筆順_DESCRIPTOR_TYPE_STORAGE_BUFFER

,10}};在下面,我們將初始化 set 布局,它只有 1 個(gè)綁定用于大緩沖區(qū)VkDescriptorSetLayoutBindingobjectBind=vkinit::descriptorset_layout_binding。

(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,VK_SHADER_STAGE_VERTEX_BIT,0);VkDescriptorSetLayoutCreateInfoset2info

={};set2info.bindingCount=1;set2info.flags=0;set2i如的筆順nfo.pNext=nullptr;set2info.sType=VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO

;set2info.pBindings=&objectBind;vkCreateDescriptorSetLayout(_device,&set2info,nullptr,&_objectSetLayout

);與其他集合相同,我們?yōu)樾录蟿?chuàng)建一個(gè)布局,指向 1 個(gè)存儲緩沖區(qū)現(xiàn)在我們需要?jiǎng)?chuàng)建描述符集以指向緩沖區(qū)for(inti=0;i

//allocate the descriptor set that will point to 如的筆順object buffer VkDescriptorSetAllocateInfoobjectSetAlloc

={};objectSetAlloc.pNext=nullptr;objectSetAlloc.sType=VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;

objectSetAlloc.descriptorPool=_descriptorPool;objectSetAlloc.descriptorSetCount=1;objectSetAlloc.pSetLayouts

=&_objectSetLayout;vkAllocat如的筆順eDescriptorSets(_device,&objectSetAlloc,&_frames[i].objectDescriptor);VkDescriptorBufferInfo

cameraInfo;cameraInfo.buffer=_frames[i].cameraBuffer._buffer;cameraInfo.offset=0;cameraInfo.range=sizeof

(GPUCameraData);VkDescriptorBufferInfosceneInfo;sceneInfo.buffer=_sceneParameterBuffer._buffer;sceneInfo如的筆順

.offset=0;sceneInfo.range=sizeof(GPUSceneData);VkDescriptorBufferInfoobjectBufferInfo;objectBufferInfo

.buffer=_frames[i].objectBuffer._buffer;objectBufferInfo.offset=0;objectBufferInfo.range=sizeof(GPUObjectData

)*MAX_OBJECTS;VkWriteDescriptorSetcameraWrite=vkinit::write_descriptor_buffer(VK_DESCRIPT如的筆順OR_TYPE_UNIFORM_BUFFER

,_frames[i].globalDescriptor,&cameraInfo,0);VkWriteDescriptorSetsceneWrite=vkinit::write_descriptor_buffer

(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,_frames[i].globalDescriptor,&sceneInfo,1);VkWriteDescriptorSet

objectWrite=vkinit::write_descriptor_buffer(VK_DESCRIPTOR_TYPE_STOR如的筆順AGE_BUFFER,_frames[i].objectDescriptor

,&objectBufferInfo,0);VkWriteDescriptorSetsetWrites[]={cameraWrite,sceneWrite,objectWrite};vkUpdateDescriptorSets

(_device,3,setWrites,0,nullptr);}我們需要另一個(gè) DescriptorBufferInfo 和另一個(gè) WriteDescriptorSet 請注意,在這里,我們使用 1 次

vkUpdateDescriptorSets()調(diào)用來更新 2 個(gè)不同的描述符集這樣做是完全有如的筆順效的現(xiàn)在緩沖區(qū)已初始化并具有指向它的描述符,我們需要將其添加到著色器中我們將修改tri_mesh.vert著色器,從 SSBO 而不是從推送常量讀取對象數(shù)據(jù)。

我們?nèi)詫⒈3滞扑筒蛔?,但不會使用?version 460layout(location=0)invec3vPosition;layout(location=1)invec3vNormal;layout

(location=2)invec3vColor;layout(location=0)outvec3outColor;layout(set=0,binding=0)uniformCameraBuffer

{mat4view;mat4proj;如的筆順mat4viewproj;}cameraData;structObjectData{mat4model;};//all object matriceslayout(

std140,set=1,binding=0)readonlybufferObjectBuffer{ObjectDataobjects[];}objectBuffer;//push constants block

layout(push_constant)uniformconstants{vec4data;mat4render_matrix;}PushConstants;voidmain(){mat4modelMatrix

=objec如的筆順tBuffer.objects[gl_BaseInstance].model;mat4transformMatrix=(cameraData.viewproj*modelMatrix);gl_Position

=transformMatrix*vec4(vPosition,1.0f);outColor=vColor;}我們將 GLSL 版本更改為 460,因?yàn)槲覀兿M軌驅(qū)l_BaseInstance用于對轉(zhuǎn)換數(shù)組進(jìn)行索引。

(譯:為了使用gl_BaseInstance,必須在device相關(guān)的代碼中啟用VK_KHR_shader_draw_parameters,否則驗(yàn)證層會報(bào)錯(cuò) [ VUID-如的筆順VkShaderModuleCreateInfo-pCode-01091 ]。

找到選擇物理設(shè)備的那段程序,在.set_surface(_surface)后面加一句.add_required_extension(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME);或者你可以自己準(zhǔn)備一個(gè)vector extensions = {/*需要的擴(kuò)展名稱*/},然后用.add_required_extensions(extentions);)。

注意我們聲明 ObjectBuffer 的方式layout(std140,set=1,binding=0)readonlyb如的筆順ufferObjectBuffer{ObjectDataobjects[];}

objectBuffer;我們需要 std140 布局描述來使數(shù)組與數(shù)組在 cpp 中的工作方式相匹配std140 強(qiáng)制執(zhí)行一些關(guān)于內(nèi)存布局的規(guī)則,以及它的對齊方式該集合現(xiàn)在為 1,綁定為 0,表示它是一個(gè)新的描述符集合槽。

我們也在聲明它時(shí)使用了readonly buffer代替uniform著色器存儲緩沖區(qū)可以被讀取或?qū)懭?,所以我們需要?Vulkan 知道它們也被定義為buffer而不是uniform里面的數(shù)組也沒有大小。

您只能在存儲緩沖區(qū)中有未調(diào)整大小的數(shù)組這將使著色器縮放到我們擁有的任何緩沖區(qū)大小另一件事是我如的筆順們訪問正確對象矩陣的方式我們不再使用推送常量,而是這樣做mat4modelMatrix=objectBuffer。

.objects[gl_BaseInstance].model;我們正在使用gl_BaseInstance來訪問對象緩沖區(qū)這是由于 Vulkan 處理其正常繪制調(diào)用的方式Vulkan 中的所有繪制命令都請求“first Instance”和“instance count”。

我們沒有進(jìn)行實(shí)例化渲染,因此實(shí)例計(jì)數(shù)始終為 1但我們?nèi)匀豢梢愿摹暗谝粋€(gè)實(shí)例”參數(shù),這樣gl_BaseInstance就可以將其作為整數(shù)用于我們想要在著色器中進(jìn)行的任何用途這為我們提供了一種向著色器發(fā)送單個(gè)整數(shù)的如的筆順簡單方法,而無需設(shè)置推送常量或描述符。

我們現(xiàn)在需要將描述符布局掛鉤到管線在 init_pipelines(),我們在創(chuàng)建管線布局時(shí)將其添加到描述符列表中VkDescriptorSetLayoutsetLayouts[]={_globalSetLayout。

,_objectSetLayout};mesh_pipeline_layout_info.setLayoutCount=2;mesh_pipeline_layout_info.pSetLayouts=setLayouts

;我們現(xiàn)在已經(jīng)設(shè)置了管線,所以最后一件事是寫入緩沖區(qū)寫入著色器存儲緩沖區(qū)在 draw_objects(),我們將通過將渲染矩如的筆順陣從渲染對象復(fù)制到緩沖區(qū)中來寫入緩沖區(qū)這渲染循環(huán)之前,與其他內(nèi)存寫入操作一起進(jìn)行。

void*objectData;vmaMapMemory(_allocator,get_current_frame().objectBuffer._allocation,&objectData);GPUObjectData

*objectSSBO=(GPUObjectData*)objectData;for(inti=0;i

[i].modelMatrix=object.transformMatrix;}vmaUnmapMemory(_allocator,get_current_frame().objectBuffe如的筆順r._allocation

);而不是在memcpy這里使用,我們正在做一個(gè)不同的技巧可以將void*從映射緩沖區(qū)轉(zhuǎn)換為另一種類型,然后正常寫入這將完全正常工作,并且可以更輕松地將復(fù)雜類型寫入緩沖區(qū)現(xiàn)在緩沖區(qū)已滿,因此我們現(xiàn)在需要綁定描述符集并使用 draw 命令中的 firstIndex 參數(shù)來訪問著色器中的對象數(shù)據(jù)。

if(object.material!=lastMaterial){vkCmdBindPipeline(cmd,VK_PIPELINE_BIND_POINT_GRAPHICS,object.material

->pipeline);lastMaterial=object.mater如的筆順ial;//camera data descriptor uint32_tuniform_offset=pad_uniform_buffer_size

(sizeof(GPUSceneData))*frameIndex;vkCmdBindDescriptorSets(cmd,VK_PIPELINE_BIND_POINT_GRAPHICS,object.

material->pipelineLayout,0,1,&get_current_frame().globalDescriptor,1,&uniform_offset);//object data descriptor

vkCmdB如的筆順indDescriptorSets(cmd,VK_PIPELINE_BIND_POINT_GRAPHICS,object.material->pipelineLayout,1,1,&get_current_frame

().objectDescriptor,0,nullptr);}//more code .... //we can now draw vkCmdDraw(cmd,object.mesh->_vertices

.size(),1,0,i);我們在vkCmdDraw()調(diào)用時(shí)使用循環(huán)中的索引將實(shí)例索引發(fā)送到著色器現(xiàn)在我們在不同的描述符集上實(shí)現(xiàn)了多個(gè)不同類型如的筆順的緩沖區(qū)本教程的最后一步是紋理,這將進(jìn)入下一章但在去那里之前,我強(qiáng)烈建議您嘗試使用代碼庫做一些事情。

現(xiàn)在,我們?yōu)?Set 0(相機(jī)和場景緩沖區(qū))每幀設(shè)置了一個(gè)描述符嘗試重構(gòu)它,使其僅對相機(jī)和場景緩沖區(qū)使用 1 個(gè)描述符集和 1 個(gè)緩沖區(qū),將所有幀的結(jié)構(gòu)都打包到同一個(gè)統(tǒng)一緩沖區(qū)中,然后使用動態(tài)偏移量或者,嘗試創(chuàng)建另一個(gè)包含 ObjectColor 之類的 SSBO,以在每個(gè)對象的基礎(chǔ)上使用,并嘗試通過修改著色器以不同方式使用它為對象著色。

吳江:Vulkan Guide學(xué)習(xí)(5.1)3 贊同 · 0 評論文章

標(biāo)簽列表