2016-05-12 8 views
2

Ich erzeuge 2D Perlin Noise und mache es Terrain. Aber ich habe ein Problem damit. Es ist zu langsam.Wie kann ich meine Heightmap glatter machen? (Perlin Noise, OpenGL)

Here it is

And polygon

ich versuchte x, z Koordinaten unterteilt sind oder vervielfacht aber nicht funktioniert. Wie kann ich dieses Problem ohne Tessellation-Shader lösen?

EDIT:

Fragment Shader-Code:

#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; 
    } 
} 

Vertex-Shader-Code:

#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

Ohne Code, um weiterzumachen, ist es schwer, sinnvolle Vorschläge zu machen. Schau dir die einzelnen Teile an, die deine endgültige Farbe ausmachen. Ohne zu wissen, wie deine Shader aussehen ... nein, das war's. Ich kann nichts Genaueres posten. Schau dir die einzelnen Elemente an, die deine endgültige Farbe ausmachen, und finde heraus, welche nicht ganz richtig funktionieren. – Aumnayan

+0

Sie könnten einen Pass machen, um die Punkte so zu verändern, dass sie einen Durchschnitt der Punkte bilden (vielleicht mit etwas Variabilität). – vu1p3n0x

+0

Aumnayan - Beitrag bearbeiten mit Fragman und Vertex Shader –

Antwort

1

Es sieht aus wie Sie einen 8bit heightmap verwenden, die Ihnen nur gibt 256 verschiedene Höhenlage. Sie könnten versuchen, 16bit Graustufen zu verwenden oder die Höhe in rgb zu kodieren.

+0

Nein. Ich lade die Heightmap nicht. Perlin Lärm erzeugt von der Höhe. Aber es ist wahr, dass das Perlin-Rauschen zwischen -1 und 1 zurückkehrt. Ich ändere das zum Beispiel auf 0 ... 255: heightMap [i] [j] = noise.perlinNoise_2D (i, j) * 128 + 128 –

+0

Welcher Typ? ist 'Heightmap' und wie erstellst du dein Mesh aus dieser Map. – ChrisBFX

+0

Perlin Rauschen auf Basis der http://freespace.virgin.net/hugo.elias/models/m_perlin.htm implementiert Diese und for (int i = 0; i <500; i ++) { \t \t \t für (int j = 0; j <500; j ++) \t \t { Höhe [i] [j] = noise.perlinNoise_2D (i, j) * 128 + 128; } } Und jetzt haben wirklich 256 verschiedene Höhe. –

Verwandte Themen