作者Ninja5566 (苦味)
看板GameDesign
标题[程式] 如何对浮点数编码
时间Fri Oct 26 00:59:14 2018
这问题比较是图学相关问题, 所以我直接用图学范例来叙述我的问题
如果有说明不清楚之处请再反映
问题:
假设有一个三角形, 每个节点上都有一个浮点数值, 我希望
这个浮点数值被编码成代表着两个或以上的正实数, 每个数字皆为 [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://webptt.com/cn.aspx?n=bbs/GameDesign/M.1540486756.A.050.html
1F:推 LPH66: 我久远以前的印象怎麽记得可以送不只一个浮点数过去? 10/26 01:08
2F:→ LPH66: 如果你两个 shader 都动得到, 有什麽原因要硬塞成一个? 10/26 01:11
3F:→ Ninja5566: 因为有些平台不能送太多到pixel shader, 会无法编译 10/26 01:24
4F:→ Ninja5566: 像UE4中 安卓平台只能送6个 float, 送一个颜色过去 10/26 01:26
5F:→ Ninja5566: 就去掉一半了 10/26 01:26
6F:推 cjcat2266: 不是有办法标注让attribute不要被内插? 10/26 05:26
7F:→ cjcat2266: 像HLSL有nointerpolation 10/26 05:27
8F:→ cjcat2266: 还有100 * a + b,b = 1.0f的时候会被吃掉吧? 10/26 05:29
9F:→ cjcat2266: 可能要用个sign或什麽把这个edge case编进去 10/26 05:30
10F:→ Ninja5566: 1.f这种状况就不讨论了, 因为一定有误差 10/26 05:45
11F:→ Ninja5566: 就转成 b - KINDA_SMALL_NUMBER 之类的就好 10/26 05:46
12F:→ Ninja5566: 因为我是用UE4, 我目前找不到不被内插的方法 10/26 05:49
13F:→ Ninja5566: 我的想法是解得出a应该可以倒回求b 10/26 06:17
14F:推 Alimen: 可以考虑把两浮点数编到一个 1D texture 传进去 10/26 10:20
15F:→ Alimen: 然後100a那招,你必须确保a只有小数下两位,否则b会被吃掉 10/26 10:22
16F:→ Ninja5566: 不是很想要把它弄进texture里面, 因为安卓对 10/26 10:38
17F:→ Ninja5566: texture sample数量也有所限制, 光基本贴图可能 10/26 10:39
18F:→ Ninja5566: 就有点吃紧了 10/26 10:39
19F:→ Ninja5566: 我记得安卓只能一次读4张, 当然可以考虑把档案塞到一般 10/26 10:40
20F:→ Ninja5566: 贴图, 但是这真的有点费工, 因为这资料是动态的所以要 10/26 10:41
21F:→ Ninja5566: 更新 10/26 10:41
22F:→ Ninja5566: 至於数值的话, 0~0.99应该够用了, 加上可以内插应该 10/26 10:43
23F:→ Ninja5566: 不是问题 10/26 10:43
24F:推 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
25F:推 cjcat2266: 网路上说int不会被内插的样子 10/27 00:44
26F:推 cjcat2266: 另外,看来shader graph也有interpolator node了 10/27 07:59
28F:→ Ninja5566: 那个node就跟我说的依样, 除了你数值输入外完全 10/27 22:14
29F:→ Ninja5566: 没有任何可供调整的参数 10/27 22:15
30F:→ Ninja5566: 还有UE4除了custom node之外, 只能使用float或floatvec 10/27 22:16
31F:推 cjcat2266: 那用int呢,论坛上说int不会被内插 10/28 00:04
32F:→ Ninja5566: ue4 material在大部分情况没法用int 10/28 01:44
※ 编辑: Ninja5566 (174.71.182.217), 10/28/2018 01:45:12
33F:推 cjcat2266: 好吧...看来我这UE4外行真的无法乱猜答案,有请其他熟 10/28 08:04
34F:→ cjcat2266: 悉的UE4的高手回答 10/28 08:04
35F:→ ADF: 基本上这跟GPU装置相关 我曾做过UE4在PS4上优化 像ati系列的 10/29 12:46
36F:→ ADF: 有提供GetParameterPX GetViVjPerspCenter 可以在pixelShader 10/29 12:48
37F:→ ADF: 可以在解码後 自己做内插 10/29 12:49
38F:→ Ninja5566: 请问这技术有关键字吗? 感谢回答 10/30 02:24
39F:推 ADF: 在pc上你可已查 amd shader explicit vertex parameter 10/30 16:58
40F:→ ADF: 不过nvidia没有这个扩展 10/30 17:00
41F:→ kuma660224: 对UE4不熟,不过用贴图传值可不受限图数吧 11/24 14:14
42F:→ kuma660224: 就把一张图分成上下,放两张? 11/24 14:15
43F:→ kuma660224: UV在PS再做scale offset,读两次不同位置 11/24 14:16