[程式] 如何對浮點數編碼

看板GameDesign (遊戲設計)作者 (苦味)時間6年前 (2018/10/26 00:59), 6年前編輯推噓9(9034)
留言43則, 6人參與, 6年前最新討論串1/1
這問題比較是圖學相關問題, 所以我直接用圖學範例來敘述我的問題 如果有說明不清楚之處請再反映 問題: 假設有一個三角形, 每個節點上都有一個浮點數值, 我希望 這個浮點數值被編碼成代表著兩個或以上的正實數, 每個數字皆為 [0, 1] 區間 不考慮誤差且在 vertex shader中, 這些數字可以很容易的被解/編碼 例如說 float = 100 * a + b, a, b皆介於0 1 之間 要解出a 以及b是相當容易的事情, a, b再送到pixel shader就可以得到a, b 這兩數之內插值 但是如果這數字沒有在vertex shader被解開, 而是整個浮點數被送進 pixel shader做內插, 請問有沒有一個編碼方式可以在pixel shader 還原出a, b 內插值? 如果有的話, 請問一個浮點數可以塞進多少個該數值? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 174.71.182.217 ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1540486756.A.050.html

10/26 01:08, 6年前 , 1F
我久遠以前的印象怎麼記得可以送不只一個浮點數過去?
10/26 01:08, 1F

10/26 01:11, 6年前 , 2F
如果你兩個 shader 都動得到, 有什麼原因要硬塞成一個?
10/26 01:11, 2F

10/26 01:24, 6年前 , 3F
因為有些平台不能送太多到pixel shader, 會無法編譯
10/26 01:24, 3F

10/26 01:26, 6年前 , 4F
像UE4中 安卓平台只能送6個 float, 送一個顏色過去
10/26 01:26, 4F

10/26 01:26, 6年前 , 5F
就去掉一半了
10/26 01:26, 5F

10/26 05:26, 6年前 , 6F
不是有辦法標註讓attribute不要被內插?
10/26 05:26, 6F

10/26 05:27, 6年前 , 7F
像HLSL有nointerpolation
10/26 05:27, 7F

10/26 05:29, 6年前 , 8F
還有100 * a + b,b = 1.0f的時候會被吃掉吧?
10/26 05:29, 8F

10/26 05:30, 6年前 , 9F
可能要用個sign或什麼把這個edge case編進去
10/26 05:30, 9F

10/26 05:45, 6年前 , 10F
1.f這種狀況就不討論了, 因為一定有誤差
10/26 05:45, 10F

10/26 05:46, 6年前 , 11F
就轉成 b - KINDA_SMALL_NUMBER 之類的就好
10/26 05:46, 11F

10/26 05:49, 6年前 , 12F
因為我是用UE4, 我目前找不到不被內插的方法
10/26 05:49, 12F

10/26 06:17, 6年前 , 13F
我的想法是解得出a應該可以倒回求b
10/26 06:17, 13F

10/26 10:20, 6年前 , 14F
可以考慮把兩浮點數編到一個 1D texture 傳進去
10/26 10:20, 14F

10/26 10:22, 6年前 , 15F
然後100a那招,你必須確保a只有小數下兩位,否則b會被吃掉
10/26 10:22, 15F

10/26 10:38, 6年前 , 16F
不是很想要把它弄進texture裡面, 因為安卓對
10/26 10:38, 16F

10/26 10:39, 6年前 , 17F
texture sample數量也有所限制, 光基本貼圖可能
10/26 10:39, 17F

10/26 10:39, 6年前 , 18F
就有點吃緊了
10/26 10:39, 18F

10/26 10:40, 6年前 , 19F
我記得安卓只能一次讀4張, 當然可以考慮把檔案塞到一般
10/26 10:40, 19F

10/26 10:41, 6年前 , 20F
貼圖, 但是這真的有點費工, 因為這資料是動態的所以要
10/26 10:41, 20F

10/26 10:41, 6年前 , 21F
更新
10/26 10:41, 21F

10/26 10:43, 6年前 , 22F
至於數值的話, 0~0.99應該夠用了, 加上可以內插應該
10/26 10:43, 22F

10/26 10:43, 6年前 , 23F
不是問題
10/26 10:43, 23F

10/26 15:55, 6年前 , 24F
UE4強制內插? 所有shader都可以明令不內插吧
10/26 15:55, 24F
UE4 的shader 與其說是shader不如說是一個封裝好的shader編輯器, 在材質 裡面你做的絕大部分操作都在pixel shader, 唯二的例外是使用custom uv 還有vertex interpolator, 如果使用此兩者功能的話就會把你的操作轉換到 vertex shader, 除此之外我找不到任何可以控制 vertex 和 pixel之間溝通 的方法, 包含關掉內插 UE4 不像 unity 可以亂搞你的shader 程式, 除非你直接去更改轉換出來的 程式碼 ※ 編輯: Ninja5566 (174.71.182.217), 10/26/2018 21:51:43

10/27 00:44, 6年前 , 25F
網路上說int不會被內插的樣子
10/27 00:44, 25F

10/27 07:59, 6年前 , 26F
另外,看來shader graph也有interpolator node了
10/27 07:59, 26F

10/27 07:59, 6年前 , 27F
http://bit.ly/2z3KN8I 應該表示有支援內插模式吧
10/27 07:59, 27F

10/27 22:14, 6年前 , 28F
那個node就跟我說的依樣, 除了你數值輸入外完全
10/27 22:14, 28F

10/27 22:15, 6年前 , 29F
沒有任何可供調整的參數
10/27 22:15, 29F

10/27 22:16, 6年前 , 30F
還有UE4除了custom node之外, 只能使用float或floatvec
10/27 22:16, 30F

10/28 00:04, 6年前 , 31F
那用int呢,論壇上說int不會被內插
10/28 00:04, 31F

10/28 01:44, 6年前 , 32F
ue4 material在大部分情況沒法用int
10/28 01:44, 32F
※ 編輯: Ninja5566 (174.71.182.217), 10/28/2018 01:45:12

10/28 08:04, 6年前 , 33F
好吧...看來我這UE4外行真的無法亂猜答案,有請其他熟
10/28 08:04, 33F

10/28 08:04, 6年前 , 34F
悉的UE4的高手回答
10/28 08:04, 34F

10/29 12:46, 6年前 , 35F
基本上這跟GPU裝置相關 我曾做過UE4在PS4上優化 像ati系列的
10/29 12:46, 35F

10/29 12:48, 6年前 , 36F
有提供GetParameterPX GetViVjPerspCenter 可以在pixelShader
10/29 12:48, 36F

10/29 12:49, 6年前 , 37F
可以在解碼後 自己做內插
10/29 12:49, 37F

10/30 02:24, 6年前 , 38F
請問這技術有關鍵字嗎? 感謝回答
10/30 02:24, 38F

10/30 16:58, 6年前 , 39F
在pc上你可已查 amd shader explicit vertex parameter
10/30 16:58, 39F

10/30 17:00, 6年前 , 40F
不過nvidia沒有這個擴展
10/30 17:00, 40F

11/24 14:14, 6年前 , 41F
對UE4不熟,不過用貼圖傳值可不受限圖數吧
11/24 14:14, 41F

11/24 14:15, 6年前 , 42F
就把一張圖分成上下,放兩張?
11/24 14:15, 42F

11/24 14:16, 6年前 , 43F
UV在PS再做scale offset,讀兩次不同位置
11/24 14:16, 43F
文章代碼(AID): #1RqVPa1G (GameDesign)
文章代碼(AID): #1RqVPa1G (GameDesign)