2017-12-27 980 views
0

我們通常使用常量在C++中暗示值沒有改變(只讀),在他們選擇的着色器或資源定義爲什麼在GLSL/VK字制服? Wodn`t更加一致,並使用從C/C++福爾康着色器和資源:爲什麼統一,而不是常量資源

借來的關鍵字旁邊,可能在着色器定義了統一的關鍵字提供線索編譯器對這些資源的附加爲接近硬件越好,大概共享內存寄存器?不確定。

這也可能是爲什麼他們在VkSpec中提到。我們需要少量的這些資源類型的數據。就像例如:宇宙常數的值..等

是我遺失的東西,還是一些過去的歷史?

回答

2

GPU編程中的制服和C++中的const都集中在不同的事情上。

C++ const記錄了一個變量不打算被改變,並且執行了一些編譯器。因此,更重要的是使用類型系統來提高清晰度並強制實現預期用途 - 這對於大型項目軟件工程很重要。你仍然可以用const_cast或其他技巧繞過它,編譯器不能假設你沒有,所以它不是嚴格執行。

制服的重要之處在於它們是統一的。這意味着只要他們在平局中被讀取,它們就具有相同的值。由於在單次繪圖調用中可能會有數百到數百萬次的該值讀取,因此可以將其緩存起來,並且只需將其一個副本緩存起來,或者可以在着色器運行之前將其預加載到寄存器(或緩存)中,它可以緩存在非連貫的緩存中,單個讀取結果可以在覈心中的所有SIMD通道上廣播等。爲此,內容不能改變的事實必須嚴格執行(與內存別名你可以解決這個問題,現在,但結果是非常不確定的,如果你這樣做)。如此統一的真正意義不在於向其他程序員聲明軟件工程的好處,如const,它是向編譯器和驅動程序聲明意圖,以便它們可以基於它進行優化。

D3D使用「常量」和「常量緩衝區」而不是統一的,所以很明顯存在一些重疊。儘管這樣做的確會導致像「每次更新常量多少次?」這樣的說法。當你想到這件事時,這是一種奇怪的事情:)。這些值在着色器代碼中是恆定的,但在API級別上非常不穩定。

2

這個詞的詞源在這裏很重要。術語「統一」來源於GLSL,它受Renderman標準着色器術語的啓發。 In Renderman,「統一」用於「其值在表面的任何部分開始陰影處恆定」的值。這是「變化」的替代方法,它表示在表面上插值的值。

「常量」意味着值從來沒有的變化。統一的價值確實發生了變化他們根本不會像其他值那樣改變頻率。輸入值每次調用更改,統一值更改每次繪製調用,常量值不更改。請注意,在GLSL中,const通常意味着「編譯時常量」:編譯時設置的值,永遠不會更改。

Vulkan中的統一變量最終來自存在於着色器之外的資源。由緩衝區饋送的統一變量塊,由常量狀態饋送的常量中的統一都是由用戶設置的外部資源。這與編譯時常量struct有個根本不同的概念。

由於它與常量結構不同,它需要一個不同的術語來請求它。