中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 2181|回复: 5

如何在Compute shader上生产随机数

[复制链接]
发表于 2017-3-22 02:36:45 | 显示全部楼层 |阅读模式
想用Compute shader(dx11)做简单的路径追踪,每个线程都需要大量随机数模拟半球积分,我尝试着把一些cpu上的随机数算法搬运到shader中,但存在以下几个问题,1、我找到的几个随机数算法参数的数值都很大,hlsl 整数只有32位。2、这些算法在串行下表现不错,但在cs下并行产生的数值很糟糕,因为线程是并发的,如何为不同的线程设置合适的种子呢?谢谢大家
发表于 2017-3-22 11:36:15 | 显示全部楼层
本帖最后由 Phantom 于 2017-3-22 11:38 编辑

弄张noise图,每次随机一个index(UV)
 楼主| 发表于 2017-3-22 14:19:19 | 显示全部楼层
Phantom 发表于 2017-3-22 11:36
弄张noise图,每次随机一个index(UV)

所以问题就变成了如何生成好的随机index,UV也是0 - 1啊。并没有解决实际问题
发表于 2017-3-23 13:12:17 | 显示全部楼层
MonsterENT 发表于 2017-3-22 14:19
所以问题就变成了如何生成好的随机index,UV也是0 - 1啊。并没有解决实际问题 ...

UV 是索引图上的一个像素,UV是0-1,但是像素是什么数据类型就看你创建图的时候是怎么设置的了,DXGI_FORMAT 有很多数据格式可供你选择
发表于 2017-3-29 19:11:10 | 显示全部楼层
一个全局种子加上localid不行吗
发表于 2017-4-7 12:17:50 | 显示全部楼层
在OpenCL上用这个函数貌似效果还是很不错的:

float get_random_0_1_ul (unsigned int* seed) //uniform between 0-1
{
  *seed = ((*seed) * 16807 ) % 2147483647;
  return  (float)(*seed) * 4.6566129e-10; //(4.6566129e-10 = 1/(2^31-1) = 1/2147483647)
}

seed 就用 work item 的索引 id
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-5-22 01:03 , Processed in 0.038837 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表