2015-01-22 4 views
2

Perlin Noise 제너레이터가 제대로 작동하는지 확실하지 않습니다. 생성되는 노이즈는 온라인에서 볼 수있는 이미지와 크게 다릅니다.2D Perlin 노이즈가 이상하게 보입니다.

enter image description here

내 코드는 기본적으로 :

/* Get the coord of the top-left gradient of the grid (y, x) falls in */ 
int j = floor(x); 
int i = floor(y); 
/* Get the distance (y, x) is from it */ 
double dx = x-j; 
double dy = y-i; 
/* Influence of (g)radient(i)(j) (starting at the top-left one) */ 
double g00 = dot(grad(hashes, hsize, grads, i, j), dy, dx); 
double g01 = dot(grad(hashes, hsize, grads, i, j+1), dy, dx-1); 
double g10 = dot(grad(hashes, hsize, grads, i+1, j), dy-1, dx); 
double g11 = dot(grad(hashes, hsize, grads, i+1, j+1), dy-1, dx-1); 
/* Interpolate the influences using the blending function */ 
/* Linear interpol the top 2 */ 
double lt = lerp(g00, g01, fade(dx)); 
/* Linear interpol the bottom 2 */ 
double lb = lerp(g10, g11, fade(dx)); 
/* Linear interpol lb lt, completing the bilienear interpol */ 
return lerp(lt, lb, fade(dy)); 

enter image description here 나는 보통 무엇을보고 반면 enter image description hereenter image description here

뭔가 같다 : 광산 (이 세 가지 다른 이미지가) 너무 균일 보인다

Complete code. 주로 this 자습서를 기반으로합니다. 나는 this script을 사용하여 csv 파일을 그립니다.

나는 기본적인 것들을 이해하지만, 보통 서로를 모순으로 삼는 몇 가지 "튜토리얼"을 읽은 후에는 읽을 수없는 "참조 구현"에 대해 약간의 의문이있다. 보간되는 (x, y) 점은 어떤 간격에 있어야합니까? 이 값을 이해하면 [0, GRID_SIZE-1]이어야합니다 (예 : 256 임의의 값으로 미리 계산 된 테이블을 사용하는 경우 [0, 255]). 그러나 내 코드는 에 (x, y)이 매핑 될 때보기 좋은 이미지 만 표시하며 그리드 크기에 관계없이 [0, 255]에 매핑하는 일부 구현을 온라인에서 볼 수 있습니다. 내가 테이블에서 그래디언트를 올바르게 선택하고 있는지 확신 할 수 없습니다.

+0

페린 노이즈처럼 보입니다. M Oehm 대답을보십시오. – lisyarus

답변

4

픽셀 좌표를 전체 이미지로 정규화합니다. 이것을 단색 격자의 크기로 정규화해야합니다.

그래서 대신 내부 루프에 대한 코드 :

double x = j/(double)w; 
    double y = i/(double)h; 

할 :

격자 크기는 예를 들어, 추가 매개 변수입니다
double x = j/gridsize; 
    double y = i/gridsize; 

:

double gridsize = 32.0; 

(이미지 크기에 고르게 맞춰야합니다.)

관련 문제