Tworzę geomip odwzorowany terenu. Do tej pory mam to działa dość dobrze. Tesselacja terenu w pobliżu kamery jest bardzo wysoka i zmniejsza się, więc dalsza geometria jest. Geometria terenu zasadniczo podąża za kamerą i pobiera teksturę wysokości mapy na podstawie położenia wierzchołków. Ponieważ tesselacja geometrii jest bardzo wysoka, możesz czasami zobaczyć każdy piksel w fakturze, gdy jest próbkowany. Tworzy oczywiste uderzenia piksela. Pomyślałem, że mógłbym to obejść, wygładzając próbkowanie mapy wysokości. Jednak wydaje mi się, że mam dziwny problem związany z pewnym bileterowym kodem do pobierania próbek. Odwzorowuję teren, przesuwając każdy wierzchołek zgodnie z teksturą wysokości mapy. Aby uzyskać wysokość wierzchołka w danym UV koordynować mogę użyć:GLSL Vertex Shader dwuliniowe próbkowanie wysokość mapa
vec2 worldToMapSpace(vec2 worldPosition) {
return (worldPosition/worldScale + 0.5);
}
float getHeight(vec3 worldPosition)
{
#ifdef USE_HEIGHTFIELD
vec2 heightUv = worldToMapSpace(worldPosition.xz);
vec2 tHeightSize = vec2(HEIGHTFIELD_SIZE_WIDTH, HEIGHTFIELD_SIZE_HEIGHT); //both 512
vec2 texel = vec2(1.0/tHeightSize);
//float coarseHeight = texture2DBilinear(heightfield, heightUv, texel, tHeightSize).r;
float coarseHeight = texture2D(heightfield, vUv).r;
return altitude * coarseHeight + heightOffset;
#else
return 0.0;
#endif
}
która produkuje ten (zauważ, jak widać każdy piksel):
Oto szkielet:
chciałem zrobić próbkowanie teren gładsza. Pomyślałem więc, że zamiast standardowej funkcji texture2D mogę użyć próbkowania bilinearnego. Więc tutaj jest moja funkcja próbkowania bilinear:
vec4 texture2DBilinear(sampler2D textureSampler, vec2 uv, vec2 texelSize, vec2 textureSize)
{
vec4 tl = texture2D(textureSampler, uv);
vec4 tr = texture2D(textureSampler, uv + vec2(texelSize.x, 0.0));
vec4 bl = texture2D(textureSampler, uv + vec2(0.0, texelSize.y));
vec4 br = texture2D(textureSampler, uv + vec2(texelSize.x, texelSize.y));
vec2 f = fract(uv.xy * textureSize); // get the decimal part
vec4 tA = mix(tl, tr, f.x);
vec4 tB = mix(bl, br, f.x);
return mix(tA, tB, f.y);
}
texelSize oblicza się jako wielkości 1/heightmap:
vec2 texel = vec2(1.0/tHeightSize);
i textureSize jest szerokość i wysokość mapy wysokości. Jednak, kiedy korzystać z tej funkcji uzyskać ten wynik:?
float coarseHeight = texture2DBilinear(heightfield, heightUv, texel, tHeightSize).r;
który wydaje się teraz gorzej :(Jakieś pomysły co mogę robić źle Albo jak mogę uzyskać gładszą próbkowanie terenu
EDIT
Oto pionowe ekranu patrzy na terenie. można zobaczyć warstwy działać prawidłowo. Odnotuj jednak, że zewnętrzne warstwy, które mają mniej triangulacji i wyglądają gładko, podczas gdy te z wyższą tesselacją pokazują każdy piksel. Próbuję znaleźć sposób na wygładzenie próbkowania tekstur.
Dlaczego używasz niestandardowej interpolacji dwuliniowej? Jeśli każdy wierzchołek ma jeden piksel na mapie wysokości, powinieneś użyć tekstury Gauss-Blur na fakturze, aby uczynić ją "gładką". Jeśli masz więcej punktów niż pikseli, wbudowana interpolacja tekstur wykonałaby pracę. – dari
Cześć, będę musiała edytować moje pytanie, aby wyjaśnić. Powodem jest to, że używam techniki geoklipowania. Teren w pobliżu kamery to bardzo wysoka tesselacja. Ponieważ teselacja jest tak duża, jest więcej trójkątów niż pikseli. Więc nie jest to stosunek 1 do 1. tj. próbkowanie musi być dokładniejsze, lub raczej musi interpolować między wartościami pikseli. – Mat
A dlaczego nie używasz interpolacji kompilacji? https: //www.opengl.org/wiki/Sampler_Object # Sampling_parameters – dari