这问题比较是图学相关问题, 所以我直接用图学范例来叙述我的问题
如果有说明不清楚之处请再反映
问题:
假设有一个三角形, 每个节点上都有一个浮点数值, 我希望
这个浮点数值被编码成代表着两个或以上的正实数, 每个数字皆为 [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 内插值?
如果有的话, 请问一个浮点数可以塞进多少个该数值?
作者:
LPH66 (-6.2598534e+18f)
2018-10-26 01:08:00我久远以前的印象怎么记得可以送不只一个浮点数过去?如果你两个 shader 都动得到, 有什么原因要硬塞成一个?
因为有些平台不能送太多到pixel shader, 会无法编译像UE4中 安卓平台只能送6个 float, 送一个颜色过去就去掉一半了
不是有办法标注让attribute不要被内插?像HLSL有nointerpolation还有100 * a + b,b = 1.0f的时候会被吃掉吧?可能要用个sign或什么把这个edge case编进去
1.f这种状况就不讨论了, 因为一定有误差就转成 b - KINDA_SMALL_NUMBER 之类的就好因为我是用UE4, 我目前找不到不被内插的方法我的想法是解得出a应该可以倒回求b
作者:
Alimen (狂人)
2018-10-26 10:20:00可以考虑把两浮点数编到一个 1D texture 传进去然后100a那招,你必须确保a只有小数下两位,否则b会被吃掉
不是很想要把它弄进texture里面, 因为安卓对texture sample数量也有所限制, 光基本贴图可能就有点吃紧了我记得安卓只能一次读4张, 当然可以考虑把档案塞到一般贴图, 但是这真的有点费工, 因为这资料是动态的所以要更新至于数值的话, 0~0.99应该够用了, 加上可以内插应该不是问题
UE4强制内插? 所有shader都可以明令不内插吧
那个node就跟我说的依样, 除了你数值输入外完全没有任何可供调整的参数还有UE4除了custom node之外, 只能使用float或floatvec
好吧...看来我这UE4外行真的无法乱猜答案,有请其他熟悉的UE4的高手回答
作者: ADF (............ NN) 2018-10-29 12:46:00
基本上这跟GPU装置相关 我曾做过UE4在PS4上优化 像ati系列的有提供GetParameterPX GetViVjPerspCenter 可以在pixelShader可以在解码后 自己做内插
作者: ADF (............ NN) 2018-10-30 16:58:00
在pc上你可已查 amd shader explicit vertex parameter
对UE4不熟,不过用贴图传值可不受限图数吧就把一张图分成上下,放两张?UV在PS再做scale offset,读两次不同位置