不要告訴別人(渲染色精)渲染畫(huà)法,Turing渲染著色器網(wǎng)格技術(shù)分析,茶卡鹽湖未來(lái)30天天氣,
圖靈體系結(jié)構(gòu)通過(guò)使用 網(wǎng)格著色器 引入了一種新的可編程幾何著色管道新的著色器將計(jì)算編程模型引入到圖形管道中,因?yàn)閰f(xié)同使用線程在芯片上直接生成緊湊網(wǎng)格( meshlets ),供光柵化器使用處理高幾何復(fù)雜度的應(yīng)用程序和游戲得益于兩階段方法的靈活性,該方法允許有效的剔除、詳細(xì)程度的技術(shù)以及程序生成。
本文介紹了新的管道,并給出了 GLSL 中用于 OpenGL 或 Vulkan 渲染的一些具體示例新功能可以通過(guò) OpenGL 和 Vulkan 中的擴(kuò)展以及使用 DirectX 12 旗艦版 來(lái)訪問(wèn)以下大部分內(nèi)容摘自此 錄制的演示文稿。
1網(wǎng)格著色管線2網(wǎng)格和網(wǎng)格著色3預(yù)計(jì)算網(wǎng)格3.1數(shù)據(jù)結(jié)構(gòu)3.2呈現(xiàn)武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格資源和數(shù)據(jù)流3.3使用任務(wù)著色器進(jìn)行簇消隱4Conclusion5References目標(biāo)現(xiàn)實(shí)世界是一個(gè)視覺(jué)豐富、幾何復(fù)雜的地方尤其是室外場(chǎng)景可以由數(shù)十萬(wàn)種元素(巖石、樹(shù)木、小植物等)組成。
CAD 模型在復(fù)雜形狀的表面以及由許多小零件組成的機(jī)械上都存在類(lèi)似的挑戰(zhàn)在視覺(jué)效果中,大型結(jié)構(gòu),例如宇宙飛船,通常都用“ greebles ”來(lái)詳細(xì)說(shuō)明圖 1 顯示了幾個(gè)例子,其中,具有頂點(diǎn)、細(xì)分和幾何體著色器的圖形管道、實(shí)例化和間接多重繪制雖然非常有效,但當(dāng)全分辨率幾何體達(dá)到數(shù)億個(gè)三角形和數(shù)十萬(wàn)個(gè)對(duì)象時(shí),仍然會(huì)受到限制。
圖 1. 對(duì)增加真實(shí)感的需求推動(dòng)了幾何復(fù)雜性的大量增加上面未顯示的其他用例包括在科學(xué)計(jì)武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格算中發(fā)現(xiàn)的幾何圖形(粒子、字形、代理對(duì)象、點(diǎn)云)或程序形狀( ele CTR ic 工程布局、 vfx 粒子、帶狀和軌跡、路徑渲染)。
本文研究了 網(wǎng)格著色器 來(lái)加速重三角形網(wǎng)格的渲染原始網(wǎng)格被分割成更小的 meshlets ,如圖 2 所示理想情況下,每個(gè)網(wǎng)格都可以優(yōu)化其中的頂點(diǎn)重用使用新的硬件階段和這種分割方案,可以并行地繪制更多的幾何圖形,同時(shí)獲取較少的總體數(shù)據(jù)。
Figure 2. : Large meshes can be decomposed into meshlets, which are rendered by mesh shaders.
例如, 武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格CAD 數(shù)據(jù)可以達(dá)到幾千萬(wàn)到數(shù)億個(gè)三角形即使在 遮擋篩選 之后,也可以存在大量的三角形在這種情況下,管道中的某些固定函數(shù)步驟可能會(huì)造成浪費(fèi)的工作和內(nèi)存負(fù)載:通過(guò)硬件的原始分配器每次掃描 indexbuffer 來(lái)批量創(chuàng)建頂點(diǎn),即使拓?fù)浣Y(jié)構(gòu)沒(méi)有改變。
獲取不可見(jiàn)數(shù)據(jù)的頂點(diǎn)和屬性(背面、視錐體或亞像素剔除)網(wǎng)格著色器 為開(kāi)發(fā)人員提供了避免此類(lèi)瓶頸的新可能性(例如,在第 4 個(gè)緩存中,與第 4 個(gè)緩存相對(duì)應(yīng))的方法(例如,在第 4 個(gè)緩存中,直接讀取第 4 個(gè)三角形)。
網(wǎng)格著色器階梯為光柵化器生成三角形,但在內(nèi)部使用協(xié)作線程模型,而不是使用單線程程序模型,類(lèi)似于計(jì)算著色器管道中網(wǎng)格著色器前面是任務(wù)著色武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格器任務(wù)著色器的操作類(lèi)似于細(xì)分的控制階段,因?yàn)樗軌騽?dòng)態(tài)生成工作但是,與網(wǎng)格著色器一樣,它使用協(xié)作線程模型,而不是將面片作為輸入,將細(xì)分決策作為輸出,而是用戶定義其輸入和輸出。
這簡(jiǎn)化了片上幾何體的創(chuàng)建,與之前嚴(yán)格且有限的細(xì)分和幾何體著色器相比,后者只需將線程用于特定任務(wù),如圖 3 所示。
圖 3. 網(wǎng)格著色器表示處理幾何復(fù)雜性的下一步網(wǎng)格著色管線一個(gè)新的兩階段管道替代方案補(bǔ)充了經(jīng)典的屬性獲取頂點(diǎn)、細(xì)分、幾何體著色器 管道這條新管道由 任務(wù)著色器 和 網(wǎng)格著色器: 組成任務(wù)著色器 :可編程單元,在工作組中工作,允許每個(gè)單元發(fā)射(或不發(fā)射)網(wǎng)格著色器工作組
網(wǎng)格著色器 :一種可編程單元,在工作組中運(yùn)行,武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格允許每個(gè)工作組生成原語(yǔ)mesh shader stage 在內(nèi)部使用上述協(xié)作線程模型為光柵化器生成三角形任務(wù)著色器的操作類(lèi)似于細(xì)分的外殼著色器階段,因?yàn)樗軌騽?dòng)態(tài)生成工作。
但是,與網(wǎng)格著色器一樣,任務(wù)著色器也使用協(xié)作線程模式它的輸入和輸出是用戶定義的,而不必將面片作為輸入,將細(xì)分決策作為輸出與 像素/片段著色器 的接口不受影響傳統(tǒng)的管道仍然可用,并且可以根據(jù)用例提供非常好的結(jié)果。
圖 4 突出顯示了管道樣式的差異
圖 4. 傳統(tǒng)與任務(wù)/網(wǎng)格幾何管道的區(qū)別新的網(wǎng)格著色器管道為開(kāi)發(fā)人員提供了許多好處:更高的可擴(kuò)展性 通過(guò)著色器單元來(lái)減少原語(yǔ)處理中的固定函數(shù)影響現(xiàn)代 GPUs 的通用用途有助于更多種類(lèi)的武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格應(yīng)用程序添加更多內(nèi)核,并提高著色器的通用內(nèi)存和算術(shù)性能。
Bandwidth-reduction,因?yàn)轫旤c(diǎn)的重復(fù)數(shù)據(jù)消除(頂點(diǎn)重用)可以預(yù)先完成,并且可以在多個(gè)幀上重復(fù)使用當(dāng)前的 API 模型意味著每次硬件都必須掃描索引緩沖區(qū)較大的網(wǎng)格意味著更高的頂點(diǎn)重用率,也降低了帶寬要求。
此外,開(kāi)發(fā)人員可以提出自己的壓縮或過(guò)程生成方案通過(guò)任務(wù)著色器 進(jìn)行可選的擴(kuò)展/篩選允許跳過(guò)完全獲取更多數(shù)據(jù)Flexibility 定義網(wǎng)格拓?fù)浜蛣?chuàng)建圖形工作以前的 細(xì)分著色器 僅限于固定的鑲嵌模式,而 。
幾何著色器 則存在線程效率低下、編程模型不友好的問(wèn)題,每個(gè)線程都會(huì)創(chuàng)建三角形條帶網(wǎng)格著色遵循 計(jì)算著色器 的編程模型,使武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格開(kāi)發(fā)人員可以自由地將線程用于不同的用途,并在線程之間共享數(shù)據(jù)當(dāng)光柵化被禁用時(shí),這兩個(gè)階段還可以用于執(zhí)行具有一個(gè)級(jí)別擴(kuò)展的通用計(jì)算工作。
圖 5. 網(wǎng)格著色器的行為類(lèi)似于使用協(xié)作線程模型計(jì)算著色器這兩個(gè) 網(wǎng)格和任務(wù)著色器 都遵循 計(jì)算著色器 的編程模型,使用協(xié)作線程組來(lái)計(jì)算結(jié)果,并有 除工作組索引外沒(méi)有其他輸入 它們?cè)趫D形管道上執(zhí)行;因此硬件直接管理在級(jí)之間傳遞并保存在芯片上的內(nèi)存。
將展示一個(gè)例子,說(shuō)明如何使用它來(lái)進(jìn)行基本體剔除,因?yàn)榫€程稍后可以訪問(wèn)工作組中的所有頂點(diǎn)。圖 6 說(shuō)明了任務(wù)著色器處理早期剔除的能力。
圖 6. 盡管可選,任務(wù)著色器啟用早期剔除以提高吞吐量通過(guò) 任務(wù)著色器 進(jìn)行的可選擴(kuò)展武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格允許對(duì)一組原語(yǔ)進(jìn)行早期篩選或預(yù)先做出 LOD 決策該機(jī)制在 GPU 上縮放,因此取代了小網(wǎng)格的實(shí)例化或多重繪制間接。
此配置類(lèi)似于 細(xì)分控制著色器 設(shè)置細(xì)分補(bǔ)丁(~ task workgroup )的數(shù)量,然后影響創(chuàng)建的 細(xì)分評(píng)估 調(diào)用(~ mesh workgroups )的數(shù)量單個(gè) 任務(wù)工作組 可以發(fā)射的 工作網(wǎng)格組。
數(shù)量是有限制的第一代硬件支持最多 64K 個(gè)子級(jí),可以生成 每個(gè)任務(wù)在同一個(gè)繪制調(diào)用中,所有任務(wù)的網(wǎng)格子對(duì)象的總數(shù)沒(méi)有限制同樣,如果不使用 任務(wù)著色器 ,則對(duì) draw 調(diào)用生成的網(wǎng)格工作組的數(shù)量沒(méi)有限制。
圖 7 說(shuō)明了這是如何工作的
圖 7. 網(wǎng)武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格格著色器工作組流任務(wù) T 的子任務(wù)保證在任務(wù) T-1 的子任務(wù)之后啟動(dòng)但是, task 和 mesh 工作組是完全流水線的,因此不需要等待以前的子任務(wù)或任務(wù)的完成任務(wù)著色器 應(yīng)用于動(dòng)態(tài)工作生成或過(guò)濾。
靜態(tài)設(shè)置得益于單獨(dú)使用 網(wǎng)格著色器 網(wǎng)格及其內(nèi)部圖元的柵格化輸出順序保持不變禁用光柵化后,任務(wù)著色器和網(wǎng)格著色器都可以用于實(shí)現(xiàn)基本計(jì)算樹(shù)網(wǎng)格和網(wǎng)格著色每個(gè)網(wǎng)格單元表示數(shù)量可變的頂點(diǎn)和基本體對(duì)于這些原語(yǔ)的連接性沒(méi)有限制。
但是,必須保持在著色器代碼中指定的最大值以下建議最多使用 64 個(gè)頂點(diǎn)和 126 個(gè)基本體126 中的“ 6 ”不是打字錯(cuò)誤第一代硬件以 128 字節(jié)的粒度分配原始索引,并且需要為基武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格元計(jì)數(shù)預(yù)留 4 個(gè)字節(jié)。
因此 3 * 126 + 4 最大化了 3 * 128 = 384 字節(jié)塊的大小超過(guò) 126 個(gè)三角形將分配接下來(lái)的 128 個(gè)字節(jié)84 和 40 是其他適用于三角形的最大值在每個(gè) GLSL mesh-shader
代碼中,每個(gè)工作組在圖形管道中為每個(gè)工作組分配固定數(shù)量的網(wǎng)格內(nèi)存最大尺寸和原始輸出定義如下:每個(gè)網(wǎng)格單元的分配大小取決于編譯時(shí)大小信息以及著色器引用的輸出屬性分配越小,可以在硬件上并行執(zhí)行的工作組越多與 。
compute 一樣,工作組共享可以訪問(wèn)的片上內(nèi)存的公共部分因此,建議盡可能高效地使用所有輸出或共享內(nèi)存對(duì)于當(dāng)前著色器,這已經(jīng)是正確的但是,內(nèi)存占用可能會(huì)更武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格高,因?yàn)樵试S比當(dāng)前編程中更多的頂點(diǎn)和基元// Set the number of threads per
workgroup (always one-dimensional).// Thelimitations may be different than in actual compute shaders.
layout(local_size_x=32) in;// the primitivetype (points,lines or triangles)layout(triangles) out;// maximum
allocation size for each meshletlayout(m武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格ax_vertices=64, max_primitives=126) out;// the actualamount of primitives the workgroup
outputs ( <= max_primitives)outuint gl_PrimitiveCountNV;// an indexbuffer, using list type indices (strips are not supported here
)outuint gl_PrimitiveIndicesNV[]; // [max_primitives * 3 for triangles]圖靈支持另一個(gè)新的 GLS武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格L 擴(kuò)展, NV_fragment_shader_barycentric ,它使片段著色器能夠獲取構(gòu)成一個(gè)基本體的三個(gè)頂點(diǎn)的原始數(shù)據(jù),并手動(dòng)對(duì)其進(jìn)行插值。
這種原始訪問(wèn)意味著可以輸出“ uint ”頂點(diǎn)屬性,但是使用各種 pack / unpack 函數(shù)將浮點(diǎn)存儲(chǔ)為 fp16 、 unorm8 或 snorm8 這可以大大減少法線、紋理坐標(biāo)和基本顏色值的逐頂點(diǎn)占用空間,并有利于標(biāo)準(zhǔn)和網(wǎng)格著色管道。
頂點(diǎn)和基本體的其他屬性定義如下:out gl_MeshPerVertexNV {vec4 gl_Position;float gl_PointSize; floatgl_ClipDistance[];
f武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格loatgl_CullDistance[]; }gl_MeshVerticesNV[]; //[max_vertices]// define yourown vertex output blocks
as usualout Interpolant {vec2 uv; }OUT[]; //[max_vertices]// specialpurpose per-primitive outputs
perprimitiveNV out gl_MeshPerPrimitiveNV {int gl_PrimitiveID;int gl_Layer;int gl_ViewportIndex; intgl_Vi武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格ewportMask[];
// [1] }gl_MeshPrimitivesNV[]; //[max_primitives]一個(gè)目標(biāo)是擁有最小數(shù)量的網(wǎng)格,從而最大限度地提高網(wǎng)格中頂點(diǎn)的重用率,從而減少分配的浪費(fèi)。
在生成 meshlet 數(shù)據(jù)之前,在 indexbuffer 上應(yīng)用頂點(diǎn)緩存優(yōu)化器是有益的例如, Tom Forsyth 的線性速度優(yōu)化器 可用于此優(yōu)化頂點(diǎn)位置和索引緩沖區(qū)也是有益的,因?yàn)槭褂?網(wǎng)格著色器
時(shí),原始三角形的順序?qū)⒈3植蛔僀AD 模型通常是用條帶“自然”生成的,因此可以具有良好的數(shù)據(jù)局部性更改索引緩沖區(qū)可能會(huì)對(duì)此類(lèi)數(shù)據(jù)的 meshlet 的簇剔除屬性產(chǎn)生負(fù)面影響(請(qǐng)參見(jiàn)任務(wù)武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格級(jí)消隱)預(yù)計(jì)算網(wǎng)格
例如,呈現(xiàn)靜態(tài)內(nèi)容,其中 索引緩沖區(qū) 在許多幀中沒(méi)有變化因此,在將頂點(diǎn)/索引上載到設(shè)備內(nèi)存期間,生成網(wǎng)格數(shù)據(jù)的成本可以隱藏起來(lái)當(dāng) vertex 數(shù)據(jù)也是靜態(tài)的(沒(méi)有逐頂點(diǎn)動(dòng)畫(huà);頂點(diǎn)位置沒(méi)有變化)時(shí),還可以獲得額外的好處,允許預(yù)先計(jì)算對(duì)快速剔除整個(gè)網(wǎng)格單元有用的數(shù)據(jù)。
數(shù)據(jù)結(jié)構(gòu)在以后的示例中,將提供一個(gè) meshlet 構(gòu)建器,它包含一個(gè)基本實(shí)現(xiàn),該實(shí)現(xiàn)掃描所提供的索引,并在每次遇到大小限制(頂點(diǎn)或基元計(jì)數(shù))時(shí)創(chuàng)建一個(gè)新的 meshlet 對(duì)于輸入三角形網(wǎng)格,它將生成以下數(shù)據(jù):。
structMeshletDesc {uint32_tvertexCount; // number o武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格f vertices useduint32_t primCount; // number ofprimitives (triangles) used
uint32_t vertexBegin; // offset into vertexIndicesuint32_t primBegin; // offset intoprimitiveIndices
}std::vector meshletInfos;std::vector primitiveIndices;// use uint16_twhen shorts are sufficient
std::vector vertexIndices;為什么有武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格兩個(gè)索引緩沖區(qū)?以下原始三角形索引緩沖區(qū)序列// lets look at the first two triangles
of a batch of many more triangleIndices = { 4,5,6, 8,4,6, ...}分為兩個(gè)新的索引緩沖區(qū)當(dāng)?shù)切嗡饕龝r(shí),建立了一組唯一的頂點(diǎn)索引此過(guò)程也稱為 。
頂點(diǎn)重復(fù)數(shù)據(jù)消除 vertexIndices = { 4,5,6, 8, ...}// For the second triangle only vertex 8must be added// and the other vertices are re-used.。
原始索武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格引相對(duì)于 vertexIndices 項(xiàng)進(jìn)行調(diào)整// original datatriangleIndices = { 4,5,6, 8,4,6, ...}// new dataprimitiveIndices = { 。
0,1,2, 3,0,2, ...}// the primitive indices are local permeshlet一旦達(dá)到適當(dāng)?shù)拇笮∠拗疲ㄒ词俏ㄒ豁旤c(diǎn)太多,要么是基本體太多),就會(huì)啟動(dòng)一個(gè)新的網(wǎng)格單元。
隨后的網(wǎng)格將創(chuàng)建自己的唯一頂點(diǎn)集 呈現(xiàn)資源和數(shù)據(jù)流在渲染期間,使用原始頂點(diǎn)緩沖區(qū)但是,使用了三個(gè)新的緩沖區(qū),而不是原來(lái)的三角形索引緩沖區(qū),如下圖 8 所示:頂點(diǎn)索武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格引緩沖區(qū) 如上所述每個(gè)網(wǎng)格單元引用一組唯一的頂點(diǎn)。
這些頂點(diǎn)的索引按順序存儲(chǔ)在所有網(wǎng)格單元的緩沖區(qū)中原始索引緩沖區(qū) 如上所述每個(gè)網(wǎng)格單元表示不同數(shù)量的基本體每個(gè)三角形需要三個(gè)原始索引,這些索引存儲(chǔ)在一個(gè)緩沖區(qū)中Note :可以在每個(gè) meshlet 之后添加額外的索引以獲得四字節(jié)對(duì)齊。
Meshlet Desc 緩沖區(qū) 存儲(chǔ)每個(gè)網(wǎng)格單元的工作負(fù)載和緩沖區(qū)偏移信息,以及集群剔除信息這三個(gè)緩沖區(qū)實(shí)際上比原始索引緩沖區(qū)小,因?yàn)榫W(wǎng)格著色允許更高的頂點(diǎn)重用注意到,通常會(huì)將索引緩沖區(qū)大小減少到原始索引緩沖區(qū)大小的 75% 左右。
圖 8. 網(wǎng)狀緩沖結(jié)構(gòu)網(wǎng)格頂點(diǎn): vertexBegin 存儲(chǔ)開(kāi)始獲取頂點(diǎn)索引的起武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格始位置vertexCount 存儲(chǔ)所涉及的連續(xù)頂點(diǎn)的數(shù)量頂點(diǎn)在網(wǎng)格單元中是唯一的;沒(méi)有重復(fù)的索引值網(wǎng)格元素: primBegin 存儲(chǔ)原始索引的起始位置,將從那里開(kāi)始獲取索引。
primCount 存儲(chǔ) meshlet 中涉及的基本體數(shù)量注意,索引的數(shù)量取決于基本體類(lèi)型(這里:3 表示三角形)注意,索引引用的是相對(duì)于 vertexBegin 的頂點(diǎn),這意味著索引“ 0 ”將引用位于 vertexBegin 的頂點(diǎn)索引。
下面的偽代碼描述了每個(gè) 網(wǎng)格著色器 工作組在原則上執(zhí)行的操作它是串行的,僅用于說(shuō)明目的// This code is just a serial pseudocode,// and武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格 doesntreflect actual GLSL code that would。
// leverage theworkgroups local thread invocations.for (int v = 0; v
texelFetch(vertexIndexBuffer, meshlet.vertexBegin + v).x;vec4 vertex = texelFetch(vertexBuffer, vertexIndex);
gl_MeshVerticesNV[v].gl_Position = transform * vertex; }for (int p = 0; p
p);gl_P武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格rimitiveIndicesNV[p * 3 + 0] = triangle.x;gl_PrimitiveIndicesNV[p * 3 + 1] = triangle.y;gl_PrimitiveIndicesNV[p *
3 + 2] = triangle.z; }// one threadwrites the output primitives gl_PrimitiveCountNV= meshlet.primCount;
當(dāng)以并行方式編寫(xiě)時(shí),網(wǎng)格著色器可能看起來(lái)如下所示:void main() {...// As theworkgoupSize may be less than the 武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格max_vertices/max_primitives
// we stillrequire an outer loop. Given their static nature// they shouldbe unrolled by the compiler in the end.
// Resolved atcompile timeconstuint vertexLoops=(MAX_VERTEX_COUNT + GROUP_SIZE - 1) / GROUP_SIZE;for (
uint loop = 0;loop < vertexLoops; loop++){// distributeexec武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格ution across threadsuint v = gl_LocalInvocationID.x + loop * GROUP_SIZE;
// Avoidbranching to get pipelined memory loads.// Downside iswe may redundantly compute the last// vertex
several timesv = min(v, meshlet.vertexCount-1);{int vertexIndex =texelFetch( vertexIndexBuffer,int(meshlet.vertexBegin
+ v)武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格).x;vec4 vertex = texelFetch(vertexBuffer, vertexIndex);gl_MeshVerticesNV[v].gl_Position = transform * vertex;
} }// Lets pack 8indices into RG32 bit textureuint primreadBegin = meshlet.primBegin / 8;uint primreadIndex = meshlet.primCount *
3 - 1;uint primreadMax = primreadIndex/ 8;// resolved atcompi武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格le time and typically just 1constuint primreadLoops
=(MAX_PRIMITIVE_COUNT * 3 + GROUP_SIZE * 8 - 1)/ (GROUP_SIZE * 8);for (uint loop = 0;loop < primreadLoops; loop++){
uint p = gl_LocalInvocationID.x + loop * GROUP_SIZE;p = min(p, primreadMax); uvec2topology = texelFetch(primitiveIndexBuffer,
int(primr武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格eadBegin +p)).rg;// use abuilt-in function, we took special care before when// sizing themeshlets to ensure we don
t exceed the //gl_PrimitiveIndicesNV array herewritePackedPrimitiveIndices4x8NV(p * 8 + 0, topology.x);
writePackedPrimitiveIndices4x8NV(p * 8 + 4, topology.y); } if(gl_LocalInvocationID.武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格x == 0) {gl_PrimitiveCountNV = meshlet.primCount;
}這是一個(gè)直接的例子由于所有數(shù)據(jù)獲取都是由開(kāi)發(fā)人員完成的,自定義編碼、通過(guò)子組內(nèi)部函數(shù)或共享內(nèi)存進(jìn)行解壓縮,或者暫時(shí)使用頂點(diǎn)輸出,都可以節(jié)省額外的帶寬使用任務(wù)著色器進(jìn)行簇消隱嘗試將更多的信息壓縮到一個(gè) meshlet 描述符中以執(zhí)行早期剔除。
已經(jīng)嘗試使用 128 位描述符對(duì)前面提到的值進(jìn)行編碼,以及 G.Wihlidal 提出的用于背面聚類(lèi)剔除的相對(duì) bbox 和一個(gè)圓錐體在生成網(wǎng)格時(shí),需要在良好的簇剔除特性和改進(jìn)的頂點(diǎn)重用之間取得平衡一方可能對(duì)另一方產(chǎn)生負(fù)面影響。
下面的任務(wù)著色器最多可剔除 32武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格 個(gè)網(wǎng)格layout(local_size_x=32) in;taskNV out Task {uint baseID;uint8_t subIDs[GROUP_SIZE];。
} OUT;voidmain(){// we padded thebuffer to ensure we dont access it out of boundsuvec4 desc = meshletDescs[gl_GlobalInvocationID.x];
// implementsome early culling functionbool render =gl_GlobalInvocationID.x < me武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格shletCount && !earlyCull(desc);
uvec4 vote =subgroupBallot(render);uint tasks =subgroupBallotBitCount(vote);if(gl_LocalInvocationID.x ==
0) {// write thenumber of surviving meshlets, i.e.// meshworkgroups to spawngl_TaskCountNV = tasks;// where the
meshletIDs started from forthis task workgroupOUT.base武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格ID = gl_WorkGroupID.x * GROUP_SIZE; } {// write which
children survived into a compact arrayuint idxOffset = subgroupBallotExclusiveBitCount(vote);if (render) {
OUT.subIDs[idxOffset] =uint8_t(gl_LocalInvocationID.x);} }}相應(yīng)的網(wǎng)格著色器現(xiàn)在使用來(lái)自任務(wù)著色器的信息來(lái)標(biāo)識(shí)要生成的網(wǎng)格taskNV 。
in Task {uint baseID;uint8_t subIDs[GROUP_S武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格IZE];} IN;voidmain() {// We can nolonger use gl_WorkGroupID.x directly
// as it nowencodes which child this workgroup is.uint meshletID = IN.baseID + IN.subIDs[gl_WorkGroupID.x];
uvec4 desc = meshletDescs[meshletID];...}在渲染大三角形模型的上下文中剔除任務(wù)著色器中的網(wǎng)格其他場(chǎng)景可能涉及到根據(jù)細(xì)節(jié)決策的級(jí)別選擇不同的 meshlet 數(shù)據(jù),或者完全生成幾何體(粒子、色帶等)。
下面的圖武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格 9 來(lái)自一個(gè)使用任務(wù)著色器進(jìn)行詳細(xì)級(jí)別計(jì)算的演示
圖 9. NVIDIA 小行星演示使用網(wǎng)格著色 Conclusion一些主要的感受:通過(guò)掃描索引緩沖區(qū)一次,可以將三角形網(wǎng)格轉(zhuǎn)換為網(wǎng)格頂點(diǎn)緩存優(yōu)化器有助于經(jīng)典渲染,也有助于提高網(wǎng)格填充效率更復(fù)雜的聚類(lèi)允許改進(jìn)任務(wù)著色器階段的早期排斥(更緊密的邊界框、一致的三角形法線等)。
在硬件需要為片上 網(wǎng)格著色器 調(diào)用分配頂點(diǎn)/基元內(nèi)存之前, 任務(wù)著色器 允許提前跳過(guò)一組原語(yǔ)如果需要,還可以生成多個(gè)子調(diào)用頂點(diǎn)在工作組的線程中并行處理,就像原始的 頂點(diǎn)渲染 一樣頂點(diǎn)著色器 可以與 網(wǎng)格著色器
兼容,并帶有一些預(yù)處理器插入由于更高的頂點(diǎn)重用,需要提取的數(shù)據(jù)更少(武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格經(jīng)典頂點(diǎn)著色器的操作限制為 max _ vertices = 32 , max _ primitives = 32 )平均三角形網(wǎng)格價(jià)意味著使用兩倍數(shù)量的三角形作為頂點(diǎn)是有益的。
所有數(shù)據(jù)加載都是通過(guò)著色器指令來(lái)處理的,而不是經(jīng)典的固定函數(shù)原語(yǔ) fetch ,因此使用更多的 流式多處理器 可以更好地伸縮它還允許更容易地使用自定義頂點(diǎn)編碼來(lái)進(jìn)一步減少帶寬對(duì)于頂點(diǎn)屬性的大量使用,同樣并行操作的基本消隱階段可能是有益的。
可以剔除掉頂點(diǎn)數(shù)據(jù)然而,最好的收獲是在任務(wù)級(jí)別進(jìn)行有效的篩選往期精選Unity3D游戲開(kāi)發(fā)中100+效果的實(shí)現(xiàn)和源碼大全 - 收藏起來(lái)肯定用得著Shad武漢房產(chǎn)網(wǎng)最新樓盤(pán)價(jià)格er學(xué)習(xí)應(yīng)該如何切入?喵的Unity游戲開(kāi)發(fā)之路 - 從入門(mén)到精通的學(xué)習(xí)線路和全教程。
聲明:發(fā)布此文是出于傳遞更多知識(shí)以供交流學(xué)習(xí)之目的若有來(lái)源標(biāo)注錯(cuò)誤或侵犯了您的合法權(quán)益,請(qǐng)作者持權(quán)屬證明與我們聯(lián)系,我們將及時(shí)更正、刪除,謝謝作者:吳建明wujianming原文:https://www.cnblogs.com/wujianming-110117/p/14147702.html。
More:【微信公眾號(hào)】 u3dnotes