2016-04-14 54 views
0

Bir OpenGL fragman gölgelendiricisi kullanarak Perlin gürültüsünü hesaplamaya çalışırken bir sorunla karşılaştım. Sonuç bloklu ve sürekli değil. enter image description herePerlin Gürültü bloku ızgarası

ben uygulanması bu tür kullanmaya çalışıyorum:

#version 330 core 
out vec3 color; 
in vec4 p; 
in vec2 uv; 

// random value for x gradiant coordinate 
float randx(vec2 co){ 
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); 
} 


// random value for y gradaint coordiante 
float randy(vec2 co){ 
    return fract(cos(dot(co.xy ,vec2(4.9898,78.233))) * 68758.5453); 
} 


// smooth interpolation funtion 
float smoothInter(float x){ 
    return 6*x*x*x*x*x -15*x*x*x*x + 10*x*x*x; 
} 


float grid_dim = 10.0f; 


void main() { 
    // Get coloumn and row of the bottom left 
    //point of the square in wich the point is in the grid 
    int col = int(uv.x * grid_dim); 
    int row = int(uv.y * grid_dim); 



// Get the 4 corner coordinate of the square, 
//divided by the grid_dim to have value between [0,1] 
vec2 bl = vec2(col, row)/10.0f; 
vec2 br = vec2(col+1, row)/10.0f; 
vec2 tl = vec2(col, row+1)/10.0f; 
vec2 tr = vec2(col+1, row+1)/10.0f; 

// Get vectors that goes from the corner to the point 
vec2 a = normalize(uv - bl); 
vec2 b = normalize(uv - br); 
vec2 c = normalize(uv - tl); 
vec2 d = normalize(uv - tr); 

// Compute the dot products 
float q = dot(vec2(randx(tl),randy(tl)), c); 
float r = dot(vec2(randx(tr),randy(tr)), d); 
float s = dot(vec2(randx(bl),randy(bl)), a); 
float t = dot(vec2(randx(br),randy(br)), b); 

// interpolate using mix and our smooth interpolation function 
float st = mix(s, t, smoothInter(uv.x)); 
float qr = mix(q, r, smoothInter(uv.x)); 
float noise = mix(st, qr, smoothInter(uv.y)); 

// Output the color 
color = vec3(noise, noise, noise); 

}

cevap

1
: Burada, enter image description here

Sorunu çözemiyorum benim parça gölgelendirici kodudur

Son birkaç satırda, yerelde aramanız gerektiğinde, global x ve y koordinatlarında smoothInter() öğesini çağırıyorsunuz al koordinatları. senin ızgara hücreleri birim genişlik değildir çünkü

float st = mix(s, t, smoothInter((uv.x - col) * grid_dim)); 
float qr = mix(q, r, smoothInter((uv.x - col) * grid_dim)); 
float noise = mix(st, qr, smoothInter((uv.y - row) * grid_dim)); 

burada grid_dim tarafından çarpımı. smoothInter() 0 ile 1 arasında bir değer almalı ve bu dönüşüm bunu sağlar.

Ayrıca normalize() çağrılarını kaldırmam ve sonucu [0,1] aralığına "normalleştir" zorunda kaldım. Bu zordu, ızgara köşe noktalarındaki rasgele gradyan vektörlerini oluşturma yönteminizden dolayı farz ediyorum. Bu haliyle, kodunuz yaklaşık olarak -2500 ile +2500 arasında değerler veriyor gibi görünüyor. Bunu doğru aralığa ölçeklediğimde, istenmeyen bir düzenlilik ortaya çıktı. Bunu tekrar prn seçimine bıraktım.