作者doasgloria (青柳立夏)
看板GameDesign
标题[程式] ComputeShader传送整数阵列的奇怪问题
时间Mon Jul 20 12:36:05 2020
最近尝试使用unity compute shader中
传送 Array 的操作~
遇到一个奇怪的问题
以下是做一个简单的渐层
https://i.imgur.com/YVuXH3l.png
这是一个 200*200的 RawImage
然後用Compute Shader输出的RenderTexture贴上
Shader 内容只要这样:
https://i.imgur.com/CYxEU2a.png
只要三行就能完成
主要就是这一行:
color[0] =
float(id.x)
/
200 ;
就可以使RGB的R 从(0/200)渐层到(199/200)
-----------------------------------------
而我想传送一个整数Array进去操作
於是放一个长度=200的
int[200]
MyArray 的内容就是整数 0 到 199
并将上色那行的程式码变成
color[0] =
float(MyArray[id.x]) / 200;
照理来说 也要有类似的效果才是
结果却变成这样:
https://i.imgur.com/AyN1vJb.png
不知道有没有大大知道 是哪边写法有问题 >///<
实在想不透~~T.T
以下是比较完成的程式码:
**C#的部分(准备Shader, 制作Array):
https://i.imgur.com/ESuPM8T.png
**Shader的部分:
https://i.imgur.com/OX9jEz0.png
------------------------------------
另外我也做很多关於 SetInts传送整数阵列的尝试
感觉常常会有奇怪的错误
不知道使用这个方法的时候
有没有特别需要注意的地方呢~~ Q__Q
感谢 !!
--
如果我们要把磁铁棒放进线圈,
线圈会说「不!!不要过来!!」而发出阻力不让磁铁棒靠近。
但是如果我们要把放进去的磁铁棒从线圈拿走, 「傲娇是一种
线圈反而会说「我…我又没有叫你走!!」而发出阻力不让磁铁棒离开。 自然现象」
这种现象不就是傲娇吗! 新科科人杂志
所以傲娇这东西根本不是新梗,19世纪就有科学家发现傲娇了。 /民明书房
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.161.51.182 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1595219769.A.51F.html
※ 编辑: doasgloria (118.161.51.182 台湾), 07/20/2020 12:37:48
1F:推 cjcat2266: 网路上好像不少人说Unity的SetInts有问题 07/20 17:45
2F:→ cjcat2266: 我用SetInts设定int4的时候没问题,大阵列就有问题 07/20 17:45
3F:→ cjcat2266: 改用ComputeBuffer试试吧,这个一直都没问题 07/20 17:45
4F:推 a4s5d6999: 有人似乎 遇到相同的bug 所有data只有前1/4有成功送到s 07/20 17:57
5F:→ a4s5d6999: hader 07/20 17:57
7F:→ a4s5d6999: ts-failing-or-me-failing.669829/ 07/20 17:58
8F:→ doasgloria: > /// < 07/21 09:02
9F:→ doasgloria: 原来如此 是个坑 0..0 07/21 09:02
10F:推 zxc9764315: 跟GPU memory的alignment好像有点关系,你在C#端用四 07/21 09:11
11F:→ zxc9764315: 倍大的阵列,每隔四个int存一个,就可以正确作用 07/21 09:11
12F:→ doasgloria: 我来试试看楼上大大的方法 XD 07/21 11:22
一开始没试成功 乱TRY几次後可以
大概是:
1. 将原本传送 int[200] 变成 int[800] , 把原本 0-199 间隔着放
2. Shader那边 原本取第 id.x个 变成int(id.x/4) << 这个不知道为何要这样
但是这样可以成功 = =
** C#:
https://i.imgur.com/e2YmxGD.png
** Shader:
https://i.imgur.com/ku1Bw8X.png
如果 id.x 不 /4 就会跟原本一样结果
如果 id.x *4 那个有效着色范围又变小成1/4的感觉
Q.Q !!
※ 编辑: doasgloria (118.161.51.182 台湾), 07/21/2020 12:13:22
13F:→ doasgloria: 但是这样会造成操作上的困难 看来传送阵列还是buffer 07/21 12:15
14F:推 cjcat2266: Unity文件没有写清楚,但DirectX的文件有提到 07/21 12:16
16F:→ cjcat2266: 这样用int4 array或compute buffer才不会浪费记忆体 07/21 12:16
17F:→ cjcat2266: 但int4 array又得写条件式,不如用compute buffer 07/21 12:17
18F:→ doasgloria: 没错 XD 改用compute buffer了 反而比较好做 ^0^ 07/21 12:43