我正在創建幾何映射地形。到目前爲止,我的工作還算不錯。相機附近的地形曲面細分非常高,因此幾何圖形越遠越差。地形的幾何形狀基本上沿着相機並基於頂點的位置對高度貼圖紋理進行採樣。由於幾何曲面細分非常高,因此有時可以在紋理採樣時看到每個像素。它會產生明顯的像素顛簸。我想我可以通過平滑高度圖的採樣來解決這個問題。不過,我似乎有一個與某些雙線性採樣代碼有關的奇怪問題。我通過根據高度貼圖紋理移動每個頂點來渲染地形。爲了得到一個頂點的高度,在給定的UV座標,我可以使用:GLSL頂點着色器雙線性採樣高度圖
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
}
將會產生這種(注意如何可以看到每個像素):
這裏是一個線框:
我想使地形採樣平滑。所以我想我可以使用一些雙線性取樣而不是標準的texture2D函數。因此,這裏是我的雙線性採樣函數:
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被計算爲1 /高度圖大小:
vec2 texel = vec2(1.0/tHeightSize);
和textureSize是高度圖的寬度和高度。然而,當我使用這個功能我得到這樣的結果:??
float coarseHeight = texture2DBilinear(heightfield, heightUv, texel, tHeightSize).r;
現在似乎更糟:(任何想法我可能是做錯了或者怎麼樣,我可以得到更流暢的地形採樣
編輯
這裏是一個垂直的屏幕截圖地勢往下看,可以看到該層很好地工作。但是請注意,對具有較少三角外層看起來更平滑,而具有更高曲面細分的則顯示每個像素。我試圖找到一種方法來平滑紋理採樣。
爲什麼您首先使用自定義雙線性插值?如果每個頂點在高度圖中都有一個像素,則應該在紋理上使用高斯模糊以使其「平滑」。如果你有更多的頂點比像素內置的紋理插值將做的工作。 – dari 2014-09-30 22:10:21
嗨達裏,我將不得不編輯我的問題來澄清。原因是因爲我正在使用geoclipmapping技術。相機附近的地形是非常高的曲面細分。因爲曲面細分非常高,所以有更多的三角形比像素更多。所以它不是1比1。即採樣需要更精細,或者確實需要在像素值之間插值。 – Mat 2014-09-30 22:19:15
爲什麼你不使用內插插件? HTTPS://www.opengl。org/wiki/Sampler_Object#Sampling_parameters – dari 2014-09-30 22:26:37