// Vertex Shader (Bake Stage) attribute vec3 vPosition; attribute vec2 vTexCoord; varying vec2 TexCoord; varying float vHeight; // Данные о плоскости треугольника планеты uniform vec3 uPlanePoint; // Любая вершина треугольника (например, tri.data[0]) uniform vec3 uPlaneNormal; // Нормаль треугольника планеты (ось Z из GetRotationForTriangle) uniform float uMaxHeight; // Максимальный размер камня (BASE_SCALE) uniform mat4 ProjectionModelViewMatrix; void main() { // 1. Вычисляем вектор от плоскости до текущей вершины камня vec3 vecToVertex = vPosition - uPlanePoint; // 2. Проецируем этот вектор на нормаль плоскости (скалярное произведение) // Это и есть кратчайшее расстояние от точки до плоскости float distance = dot(vecToVertex, uPlaneNormal); // 3. Нормализуем высоту для записи в текстуру (0.0 - уровень земли, 1.0 - пик) // Clamp гарантирует, что значения не выйдут за пределы, если камень "утоплен" vHeight = clamp(distance / uMaxHeight, 0.0, 1.0); TexCoord = vTexCoord; gl_Position = ProjectionModelViewMatrix * vec4(vPosition, 1.0); }