2013-04-09 48 views
5

tI'm努力理解DirectX中恆緩衝區。我已經看到了兩種語法如何使用着色器常量緩衝器?

float4 myVar; 

在着色器文件的頂層聲明,並

cbuffer myBuffer 
{ 
    float4 myVar; 
} 

http://msdn.microsoft.com/en-gb/library/windows/desktop/bb509581(v=vs.85).aspx

我的理解是恆定的緩衝器需要被分配到插槽詳見(零基於索引),並可以在代碼中設置。

兩個框架我已經看了(SlimDX VS SharpDX)似乎有不同的習慣來設置他們 - 通過字符串名稱由插槽號SlimDX(通過着色器反射?)和SharpDX - 儘管它不清楚的地方插槽號是從哪裏獲得的?

任何人都可以闡明兩種語法之間的差異,如果它們實際上不同,如何將槽號分配給.fx文件中的聲明以及槽號之間的共享如何在着色器之間共享?

任何幫助表示讚賞

回答

10

在使用原始Direct3D10/Direct3D11 API(通過Direct3D10.Device.XXX.SetConstantBuffers和Direct3D11.DeviceContext.XXX.SetConstantBuffers)時,SharpDX和SlimDX都使用相同的約定。

以上,在MSDN文檔的鏈接表示,部分「默認常量緩衝區」,據解釋變量不是一個常量緩衝區內定義將結束-up的名爲「$全球」默認全局常量緩衝區。另一方面,傳統效果框架(與RAW Direct3D10 + API交互)通過名稱提供對各個變量的訪問。在內部,他們正在使用ShaderReflection查詢恆緩衝區的內容,並自動處理分配這些常數緩衝區/更新/上傳。最後,這是將上傳到GPU的常量緩衝區,而不是單個變量(不存在於常量緩衝區之外)。傳統效果框架通過使用ShaderReflection查詢綁定槽來動態處理將哪個槽綁定到常量緩衝區。

插槽編號由編譯器在編譯時分配。如果您沒有明確指定一個寄存器(請參閱MSDN文檔中的cbuffer寄存器),編譯器將影響所用第一個cbuffer的第一個可用插槽。不能保證編譯器會影響相同常量緩衝區中着色器之間的相同插槽,除非您明確設置了寄存器。

+0

謝謝 - 如果可以的話,一個跟進 - 你在這裏說效果框架是遺留的 - 是否應該避免效果11?我無法在http://msdn.microsoft.com/en-us/library/windows/desktop/ff476136(v=vs.85).aspx上看到提及的內容,但http://blogs.msdn.com/b /chuckw/archive/2012/10/24/effects-for-direct3d-11-update.aspx提到它主要是爲了從效果10中輕鬆移植而來。是否建議完全跳過它的使用? – AnonDev 2013-04-10 09:43:19

+2

Effects11/Effects/FX文件已過時,不再由Microsoft維護(這就是爲什麼整個Effects11甚至只能從舊版DirectX 2010 SDK或博客文章訪問)。因此,他們不會再改進它以支持下一個Direct3D功能。從Windows RT應用程序使用它也是不可能的。 – xoofx 2013-04-10 14:18:09

0

你引用的文檔是純D3D着色器模型API。您將需要諮詢每個單獨的中間件(SlimDX或SharpDX)對於理解它們的語法和基礎測繪之間的對應關係。

我就斷言,任何第三方的分佈是完全自由地定義自己的語法(和它可以在任何過於複雜的方式來實現),但是這是你必須接受的東西。您需要查閱每個第三方供應商的相應文檔以瞭解映射,因爲詳細信息也可能因版本而異。如果源代碼可用,您可以檢查它以瞭解自己的映射。並給出了一些框架的「黑盒子」的性質,你可能期望簡單地接受該框架的documenation - 在這種情況下,指的是規範/基礎庫的文件將是一個錯誤或抽象泄漏。

最後的問題是:爲什麼你關心的執行/映射?這些圖書館的重點是以一種方便的方式將細節抽象出來。就個人而言,我可以看到爲什麼這可能是令人沮喪的(特別是如果你採取規範的文件,而不是該平臺無論何種原因),但是你付出的相關費用,以代替使用核心的選擇這樣一個平臺的後果/權衡圖書館直接。

+0

感謝,我不認爲他們的抽象從常數緩衝器具有插槽硬件模型了。這兩種語法和how-slots-are-編號的問題是獨立於包裝的,我認爲呢? – AnonDev 2013-04-09 09:57:45

+0

是的,它只是似乎你的問題實際上引發了核心庫vs包裝庫的問題。有很多常見問題是由於選擇一個包裝庫而產生的,這些問題不一定與問題域綁定或唯一。如果有幫助,那就是我正在接近的方向。您引用的框架的真正問題是否沒有足夠的文檔? – 2013-04-09 09:59:57

+0

我不認爲它是 - 它們都是圍繞DirectX的薄包裝 - 緩衝槽的概念是DirectX概念而不是包裝庫概念。儘管我相信這是一個文檔(或者我沒有找到文檔)的問題。 – AnonDev 2013-04-09 10:05:36

1

第一語法:

float4 myVar; 

是微軟的效果語法,其中作爲第二是直的HLSL。效果語法通過爲您自動分配常量緩衝區來簡化一些事情,但這是以靈活性爲代價的。

使用SharpDX你會恆定的緩衝區分配給插槽1,像這樣:

cbuffer myBuffer: register(b1) 
{ 
    float4 myVar; 
} 
相關問題