您如何在HLSL中生成一个随机数?
我问是因为我想尝试gpu射线跟踪。您需要在像素着色器中生成随机方向。所以我想要randFloat()
,结果是-1和+1之间的随机数。
另外,hlsl 噪声指令有何处理?文档说它已从HLSL 2.0及更高版本中删除。为什么呢
我读到一种方法,其中用随机值填充纹理,然后在每个具有该纹理索引的顶点中都有一个纹理坐标。但这是每个顶点,我需要一条可以在像素着色器中调用的指令。另外,如果您希望每个帧使用不同的值,则此方法需要“重新播种”每个顶点的texcoord,并且需要每个帧都更新一个顶点缓冲区(这可能很昂贵!)
详细介绍一下,如何便宜地在GPU上生成随机数?
1
您所说的每个顶点是指,在像素着色器中插值了tex坐标,并对其随机纹理的每个像素进行了查找。
—
Kikaimaru
我的意思是,如果2个纹理值恰好彼此靠得太近,就会有这种依赖性(您将获得一个“混合”值)。假设一个顶点的u,v值为(0.5,0.5),相邻顶点的值为(0.51,0.52),并且在该线段上有500个片段..那么输出将是2或3个实际随机值(从纹理),但其余部分将沿着脸部进行线性插值,而并非真正随机。我想消除这种可能性,并拥有一个可以在像素着色器中调用的rand()函数
—
bobobobo 2012年
您为什么要说一个顶点有0.5,而另一个顶点有0.51,这听起来根本不是随机的,您还需要“随机化”这些tex坐标,如果需要,也可以在像素着色器中进行,但这要多得多。这些tex坐标不需要从它们的位置生成,因此它们彼此之间有多近也无所谓。您可以在顶点着色器中对随机纹理进行一次采样(使用位置,法线,texcoords *一些参数作为texcoords),这将为您提供传递给像素着色器的texcoords
—
Kikaimaru 2012年
@Kikaimaru我的意思是偶然的情况,有可能..
—
bobobobo
是的,以随机顺序出现,可能彼此之后具有两个相同的值
—
Kikaimaru