varying vec2 TexCoord; varying vec3 vViewDirTangent; uniform sampler2D Texture; // Нам нужен только Alpha канал (высота) uniform float uHeightScale; void main() { vec3 viewDir = normalize(vViewDirTangent); float height = texture2D(Texture, TexCoord).a; // Рассчитываем вектор смещения P //vec2 p = viewDir.xy * (height * uHeightScale) / viewDir.z; //vec2 p = vec2(viewDir.y, -viewDir.x) * (height * uHeightScale); //vec2 p = viewDir.xy * (height * uHeightScale); vec2 p = vec2(viewDir.x, -viewDir.y) * (height * uHeightScale); vec2 finalTexCoord = TexCoord + p; // 1. Визуализация сетки по смещенным координатам // Если сетка кривая или ломается на стыках — значит T, B, N векторы не сошлись vec2 grid = fract(finalTexCoord * 20.0); // 20 ячеек сетки float line = (step(0.9, grid.x) + step(0.9, grid.y)); // 2. Визуализация вектора смещения через цвет // Красный = смещение по U, Зеленый = смещение по V vec3 offsetColor = vec3(p * 10.0 + 0.5, 0.0); // Умножаем на 10 для видимости vec3 finalColor = mix(offsetColor, vec3(1.0), line); // Накладываем сетку поверх цвета // 3. Подмешиваем карту высот, чтобы видеть "объемы" gl_FragColor = vec4(finalColor * height, 1.0); }