国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Direct3D 12——計算著色器——計算著色器概念

這篇具有很好參考價值的文章主要介紹了Direct3D 12——計算著色器——計算著色器概念。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

計算著色器雖然是一種可編程的著色器,但Direct3D并沒有將它直接歸為渲染流水線中的一部分。雖然如此,但位于流水線之外的計算著色器卻可以讀寫GPU資源。從本質(zhì)上來說,計算著 色器能夠使我們訪問GPU來實現(xiàn)數(shù)據(jù)并行算法,而不必渲染出任何圖形。由于計算著色器是Direct3D的組成部分,也可以讀寫Direct3D資源, 由此我們就可以將其輸出的數(shù)據(jù)直接綁定到渲染流水線上。

線程與線程組

在GPU編程的過程中,根據(jù)程序具體的執(zhí)行需求,可將線程劃分為由線程組(thread group )構(gòu)成 的網(wǎng)格(grid )o 一個線程組運行于一個多處理器之上。因此,對于擁有16個多處理器的GPU來說,我 們至少應(yīng)將任務(wù)分解為16個線程組,以此令每個多處理器都充分地運轉(zhuǎn)起來。但是,要獲得更佳的性能, 我們還應(yīng)當(dāng)令每個多處理器至少擁有兩個線程組,使它能夠切換到不同的線程組進行處理,以連續(xù)不停地 工作[FunglO](線程組在運行的過程中可能會發(fā)生停頓,例如,著色器在繼續(xù)執(zhí)行下一個指令之前會等待 紋理的處理結(jié)果,此時即可切換至另一個線程組)。
每個線程組中都有一塊共享內(nèi)存,供組內(nèi)的線程訪問。但是,線程并不能訪問其他組中的共享內(nèi)存。 同理,同組內(nèi)的線程間能夠進行同步操作,不同組的線程間卻不能實現(xiàn)這一點。事實上,我們也無法控 制不同線程組間的處理W序,因為這些線程組可能正運行在不同的多處理器上。
一個線程組中含有n個線程。硬件實際上會將這些線程分為多個warp (每個warp中有32個線程), 而且多處理器會以SIMD32的方式(即32個線程同時執(zhí)行相同的指令序列)來處理warpo每個CUDA核 心都可處理一個線程,前面也提到了,“Fermi”架構(gòu)中的每個多處理器都具有32個CUDA核心(因此, CUDA核匚、就像一條專設(shè)的SIMD “計算通道” (lane))o在Direct3D中,我們能夠以非32的倍數(shù)值來指 定線程組的大小。但是出于性能的原因,我們應(yīng)當(dāng)總是將線程組的大小設(shè)置為warp尺寸的整數(shù)倍[FunglO]。
對于各種型號的圖形硬件來說,線程數(shù)為256的線程組是一種普遍適于工作的初始設(shè)置。我們可以 以此值為基礎(chǔ),再根據(jù)具體需求嘗試將其調(diào)整為其他大小。值得注意的是,修改每個線程組中的線程數(shù) 量也會對線程組的分派(dispatch,調(diào)度)次數(shù)產(chǎn)生影響。

NVIDIA公司生產(chǎn)的圖形硬件所用的warp單位共有32個線程。而ATI公司(已被AMD公司收購)采用的 "wavefront”單位則具有64個線程,且建議為其分配的線程組大小應(yīng)總為wavefront尺寸 的整數(shù)倍[Bilodeau 10]。另夕卜,值得一提的是,不管是warp還是wavefront,它們的大小在 未來幾代中都有可能發(fā)生改變。

在Direct3D中可通過調(diào)用下列方法來啟動線程組:

void ID3D12GraphicsCommandList::Dispatch(
UINT ThreadGroupCountX,
UINT ThreadGroupCountY,
UINT ThreadGroupCountZ);

此方法可開啟一個由線程組構(gòu)成的3D網(wǎng)格,但是我們在本書中僅關(guān)注線程組2D網(wǎng)格。下面的調(diào)用 示例會分派一個在x方向上為3、y方向上為2,即總數(shù)為3x2 = 6個線程組的網(wǎng)格(見圖13.3)。

cmdList->Dispatch(3, 2, 1);

Direct3D 12——計算著色器——計算著色器概念

分派一個規(guī)模為3x2的線程組。此例假設(shè)每個線程組都有8x8條線程

一個簡單的計算著色器

以下是將兩個紋理進行簡單累加的計算著色器示例,假設(shè)所有的紋理都具有相同的大小。雖然該著 色器有點索然無味,卻五臟俱全,能詳細(xì)地展示出計算著色器的基本套路語法。

cbuffer cbSettings
{
//計算著色器能訪問的常量緩沖區(qū)數(shù)據(jù)
);
//數(shù)據(jù)源及著色器的輸出
Texture2D glnputA;
Texture2D glnputB;
RWTexture2D<float4> gOutput;
//線程組中的線程數(shù)。組中的線程可以被設(shè)置為ID、2D或3D的網(wǎng)格布局
[numthreads(16, 16, 1)]
void CS(int3 dispatchThreadID : SV_DispatchThreadID) // 線程 ID
{
//對兩種源像素中橫縱坐標(biāo)分別為x、y處的紋素進行求和,并將結(jié)果保存到相應(yīng)的gOutput紋素中 
gOutput[dispatchThreadID.xy]=glnputA[dispatchThreadID.xy] + glnputB[dispatchThreadlD.xy];
}

可見,一個計算著色器由下列要素構(gòu)成:

1.通過常量緩沖區(qū)訪問的全局變量。
2. 輸入與輸出資源。
3. [numthreads (X, Y, Z)]屬性,指定3D線程網(wǎng)格中的線程數(shù)量。
4. 每個線程都要執(zhí)行的著色器指令。
5. 線程ID系統(tǒng)值參數(shù)。

不難看出,我們能夠根據(jù)需求定義岀不同的線程組布局。例如,可以定義一個具有X個線程的單行 線程組[numthreads (X, 1, 1)]或內(nèi)含Y個線程的單列線程組[numthreads (1 ,Y, 1)]。抑或通 過將維度z設(shè)為1來定義規(guī)模為X x Y的2D線程組,形如[numthreads (X, Y, 1) ] 。我們應(yīng)結(jié)合所遇到的具體問題來選擇適當(dāng)?shù)木€程組布局。如同前一節(jié)中提到的那樣:針對NVIDIA品牌的顯卡來說, 線程組中的總線程數(shù)應(yīng)為warp大小(32 )的整數(shù)倍,而ATI公司生產(chǎn)的顯卡應(yīng)為wavefront尺寸(64 ) 的整數(shù)倍庁又因wavefront大小的倍數(shù)(64x?)必為warp尺寸的倍數(shù)(32xm),因此,以前者的線程數(shù) 為基礎(chǔ)進行設(shè)置對兩種顯卡都適用。

計算流水線狀態(tài)對象

為了開啟計算著色器,我們還需使用其特定的“計算流水線狀態(tài)描述”。此描述中的字段遠(yuǎn)少于 D3D12_GRAPHICS_PIPELINE_STATE_DESC結(jié)構(gòu)體。這是因為計算著色器位列圖形流水線之外,因 此所有的圖形流水線狀態(tài)都不適用于計算著色器,也就無須以此對它進行設(shè)置。下面給岀一個創(chuàng)建計算流水線狀態(tài)對象的示例:

	D3D12_COMPUTE_PIPELINE_STATE_DESC wavesUpdatePSO = {};
	wavesUpdatePSO.pRootSignature = mWavesRootSignature.Get();
	wavesUpdatePSO.CS =
	{
		reinterpret_cast<BYTE*>(mShaders["wavesUpdateCS"]->GetBufferPointer()),
		mShaders["wavesUpdateCS"]->GetBufferSize()
	};
	wavesUpdatePSO.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
	ThrowIfFailed(md3dDevice->CreateComputePipelineState(&wavesUpdatePSO, IID_PPV_ARGS(&mPSOs["wavesUpdate"])));

根簽名定義了什么參數(shù)才是著色器所期望的輸入(CBV、SRV等)。而cs (即compute shader的縮 寫)字段就是所指定的計算著色器。下列代碼展示了一個將著色器編譯為字節(jié)碼的示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-437611.html

	mShaders["wavesUpdateCS"] = d3dUtil::CompileShader(L"Shaders\\WaveSim.hlsl", nullptr, "UpdateWavesCS", "cs_5_0");
	mShaders["wavesDisturbCS"] = d3dUtil::CompileShader(L"Shaders\\WaveSim.hlsl", nullptr, "DisturbWavesCS", "cs_5_0");

到了這里,關(guān)于Direct3D 12——計算著色器——計算著色器概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    查看龍書時發(fā)現(xiàn), 第四章介紹預(yù)備知識的代碼不太利于學(xué)習(xí) 。因為它不像是LearnOpenGL那樣從頭開始一步一步教你敲代碼,導(dǎo)致你沒有一種整體感。 如果你把它當(dāng)作某一塊的代碼進行學(xué)習(xí),你跟著敲會發(fā)現(xiàn),總有幾個變量是沒有定義的。這是因為書上的代碼都是把框架里的某

    2024年02月08日
    瀏覽(28)
  • Direct3D光照

    Direct3D光照

    光照的組成 環(huán)境光:這種類型的光經(jīng)其他表面反射到達物體表面,并照亮整個場景,要想以較低代價粗略模擬這類反射光,環(huán)境光是一個很好的選擇 漫射光:這種類型光沿著特定的方向傳播。當(dāng)它到達某一表面時,將沿著各個方向均勻反射,無論從哪個方位觀察,表面亮度

    2024年02月09日
    瀏覽(20)
  • Direct3D融合技術(shù)

    該技術(shù)能使我們將當(dāng)前要進行光柵化的像素的顏色與先前已已光柵化并處于同一位置的像素的顏色進行合成,即將正在處理的圖元顏色值與存儲在后臺緩存中的像素顏色值進行合成(混合),利用該技術(shù)我們可得到各種各樣的效果,尤其是透明效果。 在融合運算時需要遵循:首

    2024年02月07日
    瀏覽(28)
  • Direct3D繪制旋轉(zhuǎn)立方體例程

    Direct3D繪制旋轉(zhuǎn)立方體例程

    初始化文件見Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp 運行結(jié)果

    2024年02月09日
    瀏覽(18)
  • Character Animation With Direct3D 讀書筆記

    2D動畫:循環(huán)播放多張圖片 3D動畫: 骨骼動畫、變形動畫 Win32 應(yīng)用程序 Application類:處理主程序循環(huán),圖形設(shè)備的初始化 Init:加載資源并創(chuàng)建圖形設(shè)備 Update:更新游戲世界,移動對象,更新物理引擎 Render:渲染所有對象,并將結(jié)果呈現(xiàn)給屏幕 Quit Cleanup DirectX 渲染循環(huán):

    2024年02月12日
    瀏覽(21)
  • 三維引擎基礎(chǔ)概述(Direct3D、OpenGL、UE、U3D、threejs等)

    三維引擎基礎(chǔ)概述(Direct3D、OpenGL、UE、U3D、threejs等)

    一般而言,三維引擎是在三維底層圖形技術(shù)的基礎(chǔ)上,封裝硬件操作與三維圖形算法,形成普遍意義上的三維交互引擎,提供給開發(fā)者一個簡單易用、功能豐富的三維圖形環(huán)境,在此基礎(chǔ)上進行虛擬現(xiàn)實、三維交互、可視化管理平臺二次開發(fā)等,極大提高開發(fā)效率。 【底層圖

    2024年02月11日
    瀏覽(31)
  • web3D三維引擎(Direct3D、OpenGL、UE、U3D、threejs)基礎(chǔ)掃盲

    web3D三維引擎(Direct3D、OpenGL、UE、U3D、threejs)基礎(chǔ)掃盲

    三維引擎是指用于創(chuàng)建和渲染三維圖形的軟件框架。它們通常提供了圖形處理、物理模擬、光照、碰撞檢測等功能,幫助開發(fā)者構(gòu)建逼真的三維場景和交互體驗。在這里,我將為您詳細(xì)介紹一些常見的三維引擎,包括Direct3D、OpenGL、Unreal Engine、Unity3D和Three.js。 Direct3D是由微軟

    2024年02月11日
    瀏覽(22)
  • 【C/C++】使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進行縮放圖片大小

    【C/C++】使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進行縮放圖片大小

    目錄 一,函數(shù)清單 1.Direct3DCreate9?函數(shù) 2.IDirect3D9::CreateDevice 方法 3.IDirect3DDevice9::GetDisplayMode?方法 4.IDirect3DDevice9::CreateOffscreenPlainSurface?方法 5.IDirect3DDevice9::GetFrontBufferData?方法 6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法 7.?D3DXSaveSurfaceToFile 函數(shù) 二,關(guān)鍵代碼實現(xiàn) 三,最終實現(xiàn)

    2024年01月18日
    瀏覽(30)
  • 在direct3D中,透明度處理和D2D1_ALPHA_MODE_PREMULTIPLIED含義?

    D2D1_ALPHA_MODE_PREMULTIPLIED 是 Direct2D 中定義的一種 Alpha 模式,用于描述像素顏色值和其 Alpha 通道(透明度)之間的關(guān)系。 在非預(yù)乘 Alpha (Straight or Unpremultiplied Alpha) 圖像中,每個顏色分量(紅、綠、藍(lán))是獨立于 Alpha 值的。而在預(yù)乘 Alpha 圖像中,每個顏色分量已經(jīng)被其對應(yīng)的

    2024年01月25日
    瀏覽(27)
  • direct3d-msaa-抗鋸齒算法-教程-涉及概念解析

    交換鏈(Swap Chain)在計算機圖形學(xué)和窗口系統(tǒng)中是一個核心概念,它主要用于管理一組緩沖區(qū)(通常是幀緩沖區(qū)),這些緩沖區(qū)用于存儲渲染的圖像,并且有序地與屏幕顯示進行交替更新。 窗口系統(tǒng)中的交換鏈: 在Windows、Linux等操作系統(tǒng)上的窗口環(huán)境中,交換鏈與圖形API(

    2024年01月24日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包