31 lines
1.4 KiB
Plaintext
31 lines
1.4 KiB
Plaintext
// 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);
|
||
} |