请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 1062|回复: 5

如何在Compute shader上生产随机数 [复制链接]

Rank: 8Rank: 8

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

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

注册时间
2009-3-27
积分
4114
发表于 2017-3-22 11:36:15 |显示全部楼层
本帖最后由 Phantom 于 2017-3-22 11:38 编辑

弄张noise图,每次随机一个index(UV)

使用道具 举报

Rank: 8Rank: 8

注册时间
2016-6-21
积分
156
发表于 2017-3-22 14:19:19 |显示全部楼层
Phantom 发表于 2017-3-22 11:36
弄张noise图,每次随机一个index(UV)

所以问题就变成了如何生成好的随机index,UV也是0 - 1啊。并没有解决实际问题

使用道具 举报

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

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

UV 是索引图上的一个像素,UV是0-1,但是像素是什么数据类型就看你创建图的时候是怎么设置的了,DXGI_FORMAT 有很多数据格式可供你选择

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-9-17
积分
2690
发表于 2017-3-29 19:11:10 |显示全部楼层
一个全局种子加上localid不行吗

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-11-25
积分
2099
发表于 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|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-6-26 04:37 , Processed in 0.048825 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部