从瓷砖创建随机性?

时间:2016-05-13 21:10:32

标签: opengl math random glsl

我正在尝试根据tile输入应用一个带有数字的随机纹理。到目前为止,我的努力导致模式出现在所选的数字中。

我的方法是将每个tile值乘以一个随机标量,然后将它们相乘或相加。将我所做的操作称为每个瓷砖“盐”。

示例:

float seed = fract(fract((tile.x+23.42f)*189.28148f) + (tile.y*92001.302+1.235801f));

当我将两个“盐渍”瓷砖值加在一起时,会出现一个模式。对角线的数字是相同的。

当我将两个“盐渍”瓦片值相乘时,数字沿对角线镜像。

我希望从这些平铺值中获得更多随机性,有人在数学方面有所帮助吗?

着色器代码段:

vec2 tile = vec2(floor(texCoord_vs.x), floor(texCoord_vs.y));
float seed = fract(fract((tile.x+23.42f)*189.28148f) + (tile.y*92001.302+1.235801f));
vec2 offset = offset_vs;
offset.x += floor(seed*7.0f)*TYPE_UNIT_SIZE;
vec3 diffuseColor = materialDiffuseColor * texture(
    typesheet, vec2((texCoord_vs.x - tile.x)*TYPE_UNIT_SIZE, 
    (texCoord_vs.y - tile.y)*TYPE_UNIT_SIZE) + offset);

照片: https://gyazo.com/aada74e81fdc3dbd0220263993ed7d01

1 个答案:

答案 0 :(得分:0)

您可以使用this question for hashing 2D vectors中描述的技术,而后者又来自Optimized Spatial Hashing for Collision Detection of Deformable Objects

index = (x p1 xor y p2) mod n

p1,& p2是大素数(它们使用73856093,& 83492791),n是哈希表大小,或者在这种情况下是你想要生成的最大随机索引。