永久在线亚洲观看|亚洲日韩久久AV无码|亚洲无码视频在线免费看|欧美亚洲一区二区三区视频|人人澡人人澡人人看添AV|动漫精品视频一区二区三区|亚洲国产另类久久久精品极度|极品美女熟妇又黄又爽视频一区



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

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

    1.vulkan怎么查看

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

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

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

    3.vulkan webgl

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

    4.vulkan viewport

    在那里,我們將每幀初始化一個(gè)大的存儲(chǔ)緩沖區(qū),以保存如的筆順對(duì)象的數(shù)據(jù)這是因?yàn)槲覀兿M麑?duì)象仍然是動(dòng)態(tài)的如果我們有完全靜態(tài)的對(duì)象,我們就不需要每幀一個(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在哪里打開(kāi)

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

    9.vulkan版本

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

    10.vulkan版本在哪看

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

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

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

    因?yàn)檫@是一個(gè)新的描述符集,我們還需要存儲(chǔ)它的布局以連接到管道回到上面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è)存儲(chǔ)緩沖區(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 請(qǐng)注意,在這里,我們使用 1 次

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

    我們?nèi)詫⒈3滞扑筒蛔儯粫?huì)使用它#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用于對(duì)轉(zhuǎn)換數(shù)組進(jìn)行索引。

    (譯:為了使用gl_BaseInstance,必須在device相關(guān)的代碼中啟用VK_KHR_shader_draw_parameters,否則驗(yàn)證層會(huì)報(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 布局描述來(lái)使數(shù)組與數(shù)組在 cpp 中的工作方式相匹配std140 強(qiáng)制執(zhí)行一些關(guān)于內(nèi)存布局的規(guī)則,以及它的對(duì)齊方式該集合現(xiàn)在為 1,綁定為 0,表示它是一個(gè)新的描述符集合槽。

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

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

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

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

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

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

    ;我們現(xiàn)在已經(jīng)設(shè)置了管線,所以最后一件事是寫(xiě)入緩沖區(qū)寫(xiě)入著色器存儲(chǔ)緩沖區(qū)在 draw_objects(),我們將通過(guò)將渲染矩如的筆順陣從渲染對(duì)象復(fù)制到緩沖區(qū)中來(lái)寫(xiě)入緩沖區(qū)這渲染循環(huán)之前,與其他內(nèi)存寫(xiě)入操作一起進(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)換為另一種類型,然后正常寫(xiě)入這將完全正常工作,并且可以更輕松地將復(fù)雜類型寫(xiě)入緩沖區(qū)現(xiàn)在緩沖區(qū)已滿,因此我們現(xiàn)在需要綁定描述符集并使用 draw 命令中的 firstIndex 參數(shù)來(lái)訪問(wèn)著色器中的對(duì)象數(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);我們?cè)趘kCmdDraw()調(diào)用時(shí)使用循環(huán)中的索引將實(shí)例索引發(fā)送到著色器現(xiàn)在我們?cè)诓煌拿枋龇蠈?shí)現(xiàn)了多個(gè)不同類型如的筆順的緩沖區(qū)本教程的最后一步是紋理,這將進(jìn)入下一章但在去那里之前,我強(qiáng)烈建議您嘗試使用代碼庫(kù)做一些事情。

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

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

    標(biāo)簽列表

      苗栗市| 子长县| 海安县| 阿鲁科尔沁旗| 炎陵县| 错那县| 辉南县| 五常市| 台北市| 乐都县| 舞阳县| 昌黎县| 成都市| 香港| 石林| 泽库县| 西贡区| 铜川市| 准格尔旗| 遂昌县| 汤阴县| 南城县| 华安县| 云阳县| 奉化市| 特克斯县| 乌兰浩特市| 凭祥市| 长沙市| 依安县| 临潭县| 柳河县| 余江县| 囊谦县| 博野县| 虞城县| 唐河县| 万盛区| 安丘市| 博爱县| 乌什县|