【发布时间】:2020-08-08 23:34:52
【问题描述】:
我通过松散地遵循 C# 中的 java 教程创建了一个 Perlin 噪声函数。 然后我使用 Unity 对其进行可视化(我认为问题不在于统一,因为它们的内置函数可以完美运行)
问题是有太多的大黑点。 Here is a photo
This is how I would like it to look
如您所见,这些点似乎没有很好地融合。
这是我的噪音代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PerlinNoise
{
public PerlinNoise()
{
}
public double GetPixel(double x, double y)
{
int xint = (int)Math.Floor(x) & 255;
int yint = (int)Math.Floor(y) & 255; //gets what cube the input coords are
int g1 = p[p[xint] + yint];
int g2 = p[p[xint + 1] + yint];
int g3 = p[p[xint] + yint + 1];
int g4 = p[p[xint + 1] + yint + 1]; //gets the gradient vector's vaule on the permutation table
double xdec = x - Math.Floor(x);
double ydec = y - Math.Floor(y); //gets the pixel inside the cube
double d1 = grad(g1, xdec, ydec);
double d2 = grad(g2, xdec - 1, ydec);
double d3 = grad(g3, xdec, ydec - 1);
double d4 = grad(g4, xdec - 1, ydec - 1);
double u = fade(xdec);
double v = fade(ydec);
double x1Inter = lerp(u, d1, d2);
double x2Inter = lerp(u, d3, d4);
double yInter = lerp(v, x1Inter, x2Inter);
return yInter;
}
private static double lerp(double amount, double left, double right)
{
return ((1 - amount) * left + amount * right);
}
private static double fade(double t)
{
return t * t * t * (t * (t * 6 - 15) + 10);
}
private static double grad(int hash, double x, double y)
{
switch (hash & 3)
{
case 0: return x + y;
case 1: return -x + y;
case 2: return x - y;
case 3: return -x - y;
default: return 0;
}
}
private static readonly int[] p = { 151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
};
}
这里是统一纹理代码:
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices.ComTypes;
// Create a texture and fill it with Perlin noise.
// Try varying the xOrg, yOrg and scale values in the inspector
// while in Play mode to see the effect they have on the noise.
public class TextureApply : MonoBehaviour
{
// Width and height of the texture in pixels.
public int pixWidth;
public int pixHeight;
// The origin of the sampled area in the plane.
public float xOrg;
public float yOrg;
// The number of cycles of the basic noise pattern that are repeated
// over the width and height of the texture.
public float scale = 1.0F;
private Texture2D noiseTex;
private Color[] pix;
private Renderer rend;
void Start()
{
rend = GetComponent<Renderer>();
// Set up the texture and a Color array to hold pixels during processing.
noiseTex = new Texture2D(pixWidth, pixHeight);
pix = new Color[noiseTex.width * noiseTex.height];
rend.material.mainTexture = noiseTex;
CalcNoise();
}
void CalcNoise()
{
// For each pixel in the texture...
float y = 0.0F;
while (y < noiseTex.height)
{
float x = 0.0F;
while (x < noiseTex.width)
{
double xCoord = xOrg + x / noiseTex.width * scale;
double yCoord = yOrg + y / noiseTex.height * scale;
PerlinNoise perlin = new PerlinNoise();
double sample = perlin.GetPixel(xCoord, yCoord);
pix[(int)y * noiseTex.width + (int)x] = new Color((float)sample, (float)sample, (float)sample);
x++;
}
y++;
}
// Copy the pixel data to the texture and load it into the GPU.
noiseTex.SetPixels(pix);
noiseTex.Apply();
}
void OnValidate()
{
CalcNoise();
}
}
以上只是来自docs.unity3d.com的修改代码
我认为问题可能出在置换表上,我没有采取一些复杂的方法将值的数量加倍,而是复制并粘贴了它。
编辑: [这是我将其更改为 Simplex Noise 时得到的图片][1] [1]:https://i.stack.imgur.com/jfxNr.png
【问题讨论】:
标签: c# unity3d perlin-noise