Finally fog is working

This commit is contained in:
Vladislav Khorev committed 2025-12-29 19:05:10 +03:00
1 parent 7287f4b619
commit 1af829bf49
15 files changed
+476 -60

No files matched your search

@@ -1,21 +0,0 @@
// Fragment Shader (Bake Stage)
varying vec2 TexCoord;
varying float vHeight;
varying vec3 vWorldNormal;
uniform sampler2D Texture; // Текстура камня (rock.png)
uniform vec3 uLightDir; // Направление света для базового затенения камней при запекании
void main()
{
vec4 stoneColor = texture2D(Texture, TexCoord);
// Простое Lambert-освещение, чтобы камни не были "плоскими" в текстуре
//float diff = max(dot(normalize(vWorldNormal), normalize(uLightDir)), 0.3);
float diff = 1.0;
// RGB - цвет камня с учетом света, A - нормализованная высота
gl_FragColor = vec4(stoneColor.rgb * diff, vHeight);
//gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight);
//gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
}
@@ -1,11 +1,9 @@
// Vertex Shader (Bake Stage)
attribute vec3 vPosition;
attribute vec2 vTexCoord;
attribute vec3 vNormal; // Нормаль самого камня (для освещения при запекании)
varying vec2 TexCoord;
varying float vHeight;
varying vec3 vWorldNormal;
// Данные о плоскости треугольника планеты
uniform vec3 uPlanePoint; // Любая вершина треугольника (например, tri.data[0])
@@ -28,7 +26,6 @@ void main()
vHeight = clamp(distance / uMaxHeight, 0.0, 1.0);
TexCoord = vTexCoord;
vWorldNormal = vNormal;
gl_Position = ProjectionModelViewMatrix * vec4(vPosition, 1.0);
}
+13
View File
@@ -0,0 +1,13 @@
varying vec2 TexCoord;
varying float vHeight;
uniform sampler2D Texture;
void main()
{
vec4 stoneColor = texture2D(Texture, TexCoord);
gl_FragColor = vec4(stoneColor.rgb, vHeight);
//gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight);
//gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
}
+33
View File
@@ -0,0 +1,33 @@
attribute vec3 vPosition;
attribute vec2 vTexCoord;
attribute vec3 vNormal;
attribute vec3 vTangent; // Новые атрибуты
attribute vec3 vBinormal;
varying vec2 TexCoord;
varying vec3 vViewDirTangent;
//varying float realDist;
varying vec3 worldPosition;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform vec3 uViewPos;
void main() {
gl_Position = ProjectionModelViewMatrix * vec4(vPosition, 1.0);
TexCoord = vTexCoord;
vec3 viewDirWorld = normalize(uViewPos - vPosition);
// Строим матрицу перехода из атрибутов
// Так как базис ортонормирован, TBN^-1 == TBN_transpose
vViewDirTangent = vec3(
dot(viewDirWorld, vTangent),
dot(viewDirWorld, vBinormal),
dot(viewDirWorld, vNormal)
);
vec4 viewPosition = ModelViewMatrix * vec4(vPosition.xyz, 1.0);
worldPosition = vPosition;
}
+90
View File
@@ -0,0 +1,90 @@
varying vec2 TexCoord;
varying vec3 vViewDirTangent;
uniform sampler2D Texture;
uniform float uHeightScale;
uniform float uDistanceToPlanetSurface;
uniform float uCurrentZFar;
//varying float realDist;
varying vec3 worldPosition;
uniform vec3 uViewPos;
const vec4 FOG_COLOR = vec4(0.0, 0.5, 1.0, 1.0); // Синий туман
void main() {
vec3 viewDir = normalize(vViewDirTangent);
// Получаем высоту из альфа-канала запеченной текстуры
float height = texture2D(Texture, TexCoord).a;
// Смещение. Знак минус используется, если мы хотим "вдавить" камни
// Деление на viewDir.z помогает избежать сильных искажений под углом
//vec2 p = viewDir.xy * (height * uHeightScale) / viewDir.z;
vec2 p = vec2(viewDir.x, -viewDir.y) * (height * uHeightScale);
//vec2 p = vec2(0,0);
vec2 finalTexCoord = TexCoord + p;
float realDist = distance(worldPosition, uViewPos);
vec4 finalColor = texture2D(Texture, finalTexCoord);
float fogFactor;
if (uDistanceToPlanetSurface > 1000)
{
gl_FragColor = vec4(finalColor.rgb, 1.0);
}
else if (uDistanceToPlanetSurface > 100)
{
float t = clamp((uDistanceToPlanetSurface - 100) / 900.0, 0.0, 1.0); // 1 upstairs, 0 downstairs
fogFactor = clamp((realDist - 2400) / (300.0*(1 + 10*t)), 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, fogFactor*(1.0 - t));
}
else if (uDistanceToPlanetSurface > 40)
{
//From 100 to 40:
//(1000 < realDist < 1800)
float t = clamp((uDistanceToPlanetSurface - 40) / 60.0, 0.0, 1.0); // 1 upstairs, 0 downstairs
fogFactor = clamp((realDist - 2400) / 300.0, 0.0, 1.0); // old fog factor
float fogFactor2 = clamp((realDist - 1000) / 800.0, 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, max(fogFactor, fogFactor2*(1.0 - t)));
}
else
{
fogFactor = clamp((realDist - 1000) / (800.0), 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, fogFactor);
}
/*
if (realDist < 500)
{
gl_FragColor = vec4(0.5, 0.0, 0.0, 1.0);
}
else if (realDist < 1000)
{
gl_FragColor = vec4(1.0, 0.2, 0.0, 1.0);
}
else if (realDist < 1800)
{
gl_FragColor = vec4(1.0, 0.7, 0.0, 1.0);
}
else if (realDist < 2400)
{
gl_FragColor = vec4(1.0, 0.7, 0.5, 1.0);
}
else if (realDist < 2700)
{
gl_FragColor = vec4(1.0, 0.7, 1.0, 1.0);
}
else
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}*/
}
@@ -0,0 +1,14 @@
varying vec2 TexCoord;
varying vec3 vViewDirTangent; // Тот самый вектор из VS
void main() {
// 1. Нормализуем входящий вектор
vec3 v = normalize(vViewDirTangent);
// 2. Преобразуем компоненты из [-1, 1] в [0, 1] для визуализации
// X -> Red, Y -> Green, Z -> Blue
vec3 debugColor = v * 0.5 + 0.5;
gl_FragColor = vec4(debugColor, 1.0);
}
@@ -0,0 +1,32 @@
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);
}
+31
View File
@@ -0,0 +1,31 @@
// Вершинный шейдер (Vertex Shader)
attribute vec3 vPosition;
attribute vec2 vTexCoord;
varying vec2 TexCoord;
varying float viewZ;
varying vec3 pos;
varying vec3 worldPosition;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
void main()
{
// Преобразование позиции в пространство вида (View Space)
vec4 viewPosition = ModelViewMatrix * vec4(vPosition.xyz, 1.0);
// Сохраняем отрицательную Z-координату. В OpenGL Z-координата (глубина)
// в пространстве вида обычно отрицательна, но для расчета тумана
// удобнее использовать положительное значение.
viewZ = -viewPosition.z;
pos = vPosition.xyz;
gl_Position = ProjectionModelViewMatrix * vec4(vPosition.xyz, 1.0);
TexCoord = vTexCoord;
worldPosition = vPosition;
}
+60
View File
@@ -0,0 +1,60 @@
// ---Фрагментный шейдер (Fragment Shader)
varying vec2 TexCoord;
varying float viewZ;
varying vec3 pos;
uniform sampler2D Texture;
uniform float uDistanceToPlanetSurface;
uniform float uCurrentZFar;
// Константы для тумана:
//const vec4 FOG_COLOR = vec4(0.0, 0.3, 0.3, 1.0); // Синий туман
const vec4 FOG_COLOR = vec4(0.0, 0.5, 1.0, 1.0); // Синий туман
varying vec3 worldPosition;
uniform vec3 uViewPos;
void main()
{
vec4 textureColor = texture2D(Texture, TexCoord);
vec3 finalColor = textureColor.rgb;
float realDist = distance(worldPosition, uViewPos);
float fogFactor;
if (uDistanceToPlanetSurface > 1000)
{
gl_FragColor = vec4(finalColor.rgb, 1.0);
}
else if (uDistanceToPlanetSurface > 100)
{
float t = clamp((uDistanceToPlanetSurface - 100) / 900.0, 0.0, 1.0); // 1 upstairs, 0 downstairs
fogFactor = clamp((realDist - 2400) / (300.0*(1 + 10*t)), 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, fogFactor*(1.0 - t));
}
else if (uDistanceToPlanetSurface > 40)
{
//From 100 to 40:
//(1000 < realDist < 1800)
float t = clamp((uDistanceToPlanetSurface - 40) / 60.0, 0.0, 1.0); // 1 upstairs, 0 downstairs
fogFactor = clamp((realDist - 2400) / 300.0, 0.0, 1.0); // old fog factor
float fogFactor2 = clamp((realDist - 1000) / 800.0, 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, max(fogFactor, fogFactor2*(1.0 - t)));
}
else
{
fogFactor = clamp((realDist - 1000) / (800.0), 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, fogFactor);
}
}