看板 GameDesign 關於我們 聯絡資訊
這問題比較是圖學相關問題, 所以我直接用圖學範例來敘述我的問題 如果有說明不清楚之處請再反映 問題: 假設有一個三角形, 每個節點上都有一個浮點數值, 我希望 這個浮點數值被編碼成代表著兩個或以上的正實數, 每個數字皆為 [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
LPH66: 我久遠以前的印象怎麼記得可以送不只一個浮點數過去? 10/26 01:08
LPH66: 如果你兩個 shader 都動得到, 有什麼原因要硬塞成一個? 10/26 01:11
Ninja5566: 因為有些平台不能送太多到pixel shader, 會無法編譯 10/26 01:24
Ninja5566: 像UE4中 安卓平台只能送6個 float, 送一個顏色過去 10/26 01:26
Ninja5566: 就去掉一半了 10/26 01:26
cjcat2266: 不是有辦法標註讓attribute不要被內插? 10/26 05:26
cjcat2266: 像HLSL有nointerpolation 10/26 05:27
cjcat2266: 還有100 * a + b,b = 1.0f的時候會被吃掉吧? 10/26 05:29
cjcat2266: 可能要用個sign或什麼把這個edge case編進去 10/26 05:30
Ninja5566: 1.f這種狀況就不討論了, 因為一定有誤差 10/26 05:45
Ninja5566: 就轉成 b - KINDA_SMALL_NUMBER 之類的就好 10/26 05:46
Ninja5566: 因為我是用UE4, 我目前找不到不被內插的方法 10/26 05:49
Ninja5566: 我的想法是解得出a應該可以倒回求b 10/26 06:17
Alimen: 可以考慮把兩浮點數編到一個 1D texture 傳進去 10/26 10:20
Alimen: 然後100a那招,你必須確保a只有小數下兩位,否則b會被吃掉 10/26 10:22
Ninja5566: 不是很想要把它弄進texture裡面, 因為安卓對 10/26 10:38
Ninja5566: texture sample數量也有所限制, 光基本貼圖可能 10/26 10:39
Ninja5566: 就有點吃緊了 10/26 10:39
Ninja5566: 我記得安卓只能一次讀4張, 當然可以考慮把檔案塞到一般 10/26 10:40
Ninja5566: 貼圖, 但是這真的有點費工, 因為這資料是動態的所以要 10/26 10:41
Ninja5566: 更新 10/26 10:41
Ninja5566: 至於數值的話, 0~0.99應該夠用了, 加上可以內插應該 10/26 10:43
Ninja5566: 不是問題 10/26 10:43
cjcat2266: UE4強制內插? 所有shader都可以明令不內插吧 10/26 15:55
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
cjcat2266: 網路上說int不會被內插的樣子 10/27 00:44
cjcat2266: 另外,看來shader graph也有interpolator node了 10/27 07:59
cjcat2266: http://bit.ly/2z3KN8I 應該表示有支援內插模式吧 10/27 07:59
Ninja5566: 那個node就跟我說的依樣, 除了你數值輸入外完全 10/27 22:14
Ninja5566: 沒有任何可供調整的參數 10/27 22:15
Ninja5566: 還有UE4除了custom node之外, 只能使用float或floatvec 10/27 22:16
cjcat2266: 那用int呢,論壇上說int不會被內插 10/28 00:04
Ninja5566: ue4 material在大部分情況沒法用int 10/28 01:44
※ 編輯: Ninja5566 (174.71.182.217), 10/28/2018 01:45:12
cjcat2266: 好吧...看來我這UE4外行真的無法亂猜答案,有請其他熟 10/28 08:04
cjcat2266: 悉的UE4的高手回答 10/28 08:04
ADF: 基本上這跟GPU裝置相關 我曾做過UE4在PS4上優化 像ati系列的 10/29 12:46
ADF: 有提供GetParameterPX GetViVjPerspCenter 可以在pixelShader 10/29 12:48
ADF: 可以在解碼後 自己做內插 10/29 12:49
Ninja5566: 請問這技術有關鍵字嗎? 感謝回答 10/30 02:24
ADF: 在pc上你可已查 amd shader explicit vertex parameter 10/30 16:58
ADF: 不過nvidia沒有這個擴展 10/30 17:00
kuma660224: 對UE4不熟,不過用貼圖傳值可不受限圖數吧 11/24 14:14
kuma660224: 就把一張圖分成上下,放兩張? 11/24 14:15
kuma660224: UV在PS再做scale offset,讀兩次不同位置 11/24 14:16