2016-05-12 6 views
2

Я создаю 2D-шум перлина, и я делаю это рельеф. Но у меня проблема с этим. Это слишком постепенное.Как я могу сделать плавность моей карты роста? (Perlin noise, openGL)

Here it is

And polygon

Я попытался x, z координаты разделены или умножаются, но не работает. Как я могу решить эту проблему без tessellation shader?

EDIT:

фрагмент кода шейдера:

#version 430 

in vec3 pos; 
in vec2 text; 
in vec3 norm; 

layout(binding=3) uniform sampler2D texture_1; 
layout(binding=4) uniform sampler2D texture_2; 
layout(binding=5) uniform sampler2D texture_3; 

vec3 lightPosition = vec3(-200, 700, 50); 
vec3 lightAmbient = vec3(0,0,0); 
vec3 lightDiffuse = vec3(1,1,1); 
vec3 lightSpecular = vec3(1,1,1); 

out vec4 fragColor; 
vec4 theColor; 

void main() 
{ 

    vec3 lightVector = normalize(lightPosition) - normalize(pos); 
    float cosTheta = clamp(dot(normalize(lightVector), normalize(norm)), 0.5, 1.0); 

    if(pos.y <= 120){ 
     fragColor = texture2D(texture_2, text*0.05) * cosTheta; 
    } 
    if(pos.y > 120 && pos.y < 150){ 
     fragColor = (texture2D(texture_2, text*0.05) * (1 - (pos.y-120)/30) + texture2D(texture_3, text*0.05) * ((pos.y-120)/30))*cosTheta; 
    } 
    if(pos.y >= 150) 
    { 
     fragColor = texture2D(texture_3, text*0.05) * cosTheta; 
    } 
} 

вершина код шейдера:

#version 430 

in layout(location=0) vec3 position; 
in layout(location=1) vec2 textCoord; 
in layout(location=2) vec3 normal; 

out vec3 pos; 
out vec2 text; 
out vec3 norm; 


uniform mat4 transformation; 

void main() 
{ 
    gl_Position = transformation * vec4(position, 1.0); 
    norm = normal; 
    pos = position; 
    text = position.xz; 
} 
+0

Без кода, чтобы продолжить, сделать какие-либо содержательные предложения нелегко. Посмотрите на отдельные части, которые составляют ваш последний цвет. Не зная, как выглядят ваши шейдеры ... нет, вот и все. Я не могу опубликовать ничего более конкретного. Посмотрите на отдельные элементы, составляющие ваш последний цвет, и выясните, какие из них не работают совершенно правильно. – Aumnayan

+0

Вы можете сделать проход, чтобы изменить точки так, чтобы они были средними по точкам вокруг него (возможно, с некоторой изменчивостью) – vu1p3n0x

+0

Aumnayan - отредактировать сообщение с fragman и vertex shader –

ответ

1

Похоже, вы используете 8bit, который высот только дает вам 256 различных возвышений. Вы можете попробовать использовать 16-битный оттенок серого или закодировать высоту в rgb.

+0

Нет. Я не загружаю карту высот. Шум Perlin, генерируемый высотой hte. Но верно, что шум перлина возвращается между -1 и 1. Я изменяю это на 0 ... 255, например: heightMap [i] [j] = noise.perlinNoise_2D (i, j) * 128 + 128 –

+0

Итак, какой тип это 'heightmap' и как вы создаете свою сетку с этой карты. – ChrisBFX

+0

Перлин шум реализован на базах http://freespace.virgin.net/hugo.elias/models/m_perlin.htm это, и для (INT I = 0; я <500; я ++) { \t \t \t для (int j = 0; j <500; j ++) \t \t { heightMap [i] [j] = noise.perlinNoise_2D (i, j) * 128 + 128; } } И теперь реальность имеет 256 различных высот. –