总结一下:(大佬们可以指正)
1.向shader里传递数组,3.x是传递vec4[],2.x是传递Float32Array(需要是4的倍数);
2.vec4的值精度为双精度浮点数,float32为单精度浮点数,传递位数太高的值会损失精度;
3.单精度浮点数在6位数10进制的情况下,可以无损储存;为了传递更多的值,可以通过位运算合并数据,并在shader中将数据解析分离;
4.uniform中vec4 data[num];pc实测num最大设置1023,手机实测num最大为255,分组传递也能不能超出这个值(被坑麻了,电脑上跑得好好的,手机上就歇菜 )。
如果大佬们有别的方法,可以给点提示(ai给出的是思路是用纹理代替数组)
1赞
emmm, 理论上是可以设置一个纹理变量,
然后给自己给纹理数据设值,
纹理取出来的值是vec4,
在effect文件里, 自己根据index,转换成uv,使用采样函数取得值color,
但是我没试过
听AI的,它说的没错
思路是这个思路,我先试试
确实只有这个方法了
在for循环里采样40*40的纹理都很卡,放弃了
看来是你姿势不对。
确实是有问题 在片元着色器中遍历纹理所有坐标实在是很蠢了,提前处理一下纹理,只遍历周边坐标纹理就行了。
补充5.uniform中vec4中数组最大数量会随设备机型限制改变的,如果是IOSiphone8或安卓晓龙6之类的老机型,这个值会更低!!!
你大可先说下你的场景需求。 任何优化和设置都是要围绕具体的需求来实现的。
0.有1000个数据,打在1600*1600的显示区域内;
1.一开始是向shader中传递250个数组,然后根据uv去选择遍历25个长度的数据与uv计算,然后受机型影响,数组长度可能受限,排除;
2.选择将数据位运算后写入纹理rgba,然后根据uv采样rgba去计算,然后就出现了采样区域的问题,一开始选择采样全部,那就卡;采样部分区域就需要数据先和uv作判断再写入纹理。
- 你是每个片元每次都要用到全部1000个数据吗?
- 能否数据计算前置到CPU端,只将需要的结果传递过去呢
可行,只要不传递复杂纹理计算量也就没那么大了,