我正在尝试找出一个将生成纹理的脚本(然后可以将其乘以灰度图像以“应用”它)。到目前为止,我的方法涉及对 RNG 进行播种,然后随机生成范围 [0,3] 内的 8x8 整数矩阵,然后使用某种级别的插值将该矩阵放大为 256x256 图像。
这是一个示例输出(种子值 24):
(来源:adamhaskell.net)
左边是用最近邻插值缩放的矩阵。右边是我对双线性插值的尝试。在大多数情况下,它似乎没问题,但随后你会得到类似靠近中左的结构,其中有两个对角相邻的橙色方 block 面对两个对角相邻的红色方 block ,结果是该区域没有插值。此外,它更像是一个热图(如左上角大量橙色所示),这导致了更多问题。
这是我的“双线性插值”代码:
<?php
$matrix = Array();
srand(24);
$dim = 256;
$scale = 32;
for($y=0;$y<=$dim/$scale;$y++) for($x=0;$x<=$dim/$scale;$x++) $matrix[$y][$x] = rand(0,3);
$img = imagecreate($dim,$dim);
imagecolorallocate($img,255,255,255);
$cols = Array(
imagecolorallocate($img,128,0,0),
imagecolorallocate($img,128,64,32),
imagecolorallocate($img,128,128,0),
imagecolorallocate($img,64,64,64)
);
for($y=0;$y<$dim;$y++) {
for($x=0;$x<$dim;$x++) {
$xx = floor($x/$scale); $yy = floor($y/$scale);
$x2 = $x%$scale; $y2 = $y%$scale;
$col = $cols[round((
$matrix[$yy][$xx]*($scale-$x2)*($scale-$y2)
+ $matrix[$yy][$xx+1]*$x2*($scale-$y2)
+ $matrix[$yy+1][$xx]*($scale-$x2)*$y2
+ $matrix[$yy+1][$xx+1]*$x2*$y2
)/($scale*$scale))];
imagesetpixel($img,$x,$y,$col);
}
}
header("Content-Type: image/png");
imagepng($img);
exit;
实际上,这可能有点像 XY 问题。我特别想做的是为我正在计划的游戏中的生物生成“毛皮图案”。特别是我希望能够拥有它,以便育种混合来自两个 parent 的元素(无论是颜色还是图案元素),所以仅仅拥有一个随机种子并不会真正削减它。理想情况下,我需要某种基于矢量的方法,但我已经超出了我的理解范围,因此非常感谢任何帮助。
最佳答案
我想到了几件事:
您没有插入颜色值。要扩展 zakinster 的评论,您要插入颜色索引,然后四舍五入到最接近的索引。这样做的一个影响是,您最终会在橙色(索引 1)和灰色(索引 3)区域之间看到一片黄色(索引 2)。如果改为对颜色值进行插值,最终可能会变成灰橙色?
最终图像中黄色和橙色较多,红色和灰色较少。这是因为使用 round() 捕捉到颜色索引。您的计算(在 round() 之前)可能会产生在 0 到 3 之间均匀分布的 float ,但四舍五入不会保留它。
所以,这里有一些建议:
如果不限于 4 种颜色,请使用更多。插入颜色值(即 (128,0,0) 与 (64,64,64) 混合产生 (91,32,32))而不是索引。
如果您仅限于这 4 种颜色,请尝试某种抖动。一种对代码进行最少更改的简单方法是为所选的颜色索引添加一些随机性。因此,不使用 round(...),而是执行如下操作:假设您的计算结果为 1.7。然后,以 70% 的概率四舍五入到 2,其余 30% 的概率四舍五入到 1。这将混合颜色,但可能会产生非常嘈杂的图像。如果您准备更大幅度地更改代码,请查看 Floyd-Steinberg dithering .
关于php - 程序生成纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882756/