Это действительно не так сложно понять, позвольте мне провести вас через логику.
В вашем случае вы не хотите использовать карту смещения.Итак, вам нужно установить varying height
на вашем vertexShader для сопоставления ваших верхних координат [0,1] с вашим фрагментом.
//vertexShader:
varying vec2 vUV;
varying float height;
void main() {
vUV = uv;
float maxPosition = 30.0; // this is an example value.
height = max( 0.0, min(1.0, position.y/maxPosition ) ); // assuming +y is up
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
Теперь вы можете получить доступ к height
из вашего фрагментаShader ииспользуйте эту информацию, чтобы выбрать, где вы хотите, чтобы ваши переходы происходили.
uniform sampler2D grassTexture;
uniform sampler2D snowTexture;
varying vec2 vUV;
varying float height;
void main(){
vec4 grass = (1.0 - smoothstep( 0.48, 0.52, height)) * texture2D( grassTexture, vUV);
vec4 snow = (smoothstep(0.48, 0.52, height) - 0.0) * texture2D( snowTexture, vUV);
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) + grass + snow;
}
В предоставленной ссылке используется функция smoothstep для постепенного перехода между текстурами.Мы можем создавать переходы, используя следующий шаблон ( a - b ) * textureColor
.
В этом случае a
определяет, когда текстура начинает вносить вклад в цвет фрагмента.b
контролирует, когда текстура перестает вносить свой вклад.
Другими словами, ваша текстура травы уже начала вносить свой вклад на каждой высоте, поэтому мы сопоставляем a
с 1,0.Он прекращает вносить около 0,5, поэтому мы даем b
плавное затухание по мере приближения к 0,5.
С другой стороны, ваша текстура снега начнет давать только около 0,5.Итак, мы даем a
плавное постепенное увеличение при приближении к 0.5.Это никогда не прекратит вносить свой вклад, поэтому мы устанавливаем b
как 0.0.
Надеюсь, что это прояснит для вас.