diff --git a/shaders/planet_land_desktop.fragment b/shaders/planet_land_desktop.fragment index 5d5afb6..054fc08 100644 --- a/shaders/planet_land_desktop.fragment +++ b/shaders/planet_land_desktop.fragment @@ -33,7 +33,8 @@ void main() { vec4 bakedTextureColor = texture2D(BakedTexture, finalTexCoord); vec4 textureColor = texture2D(Texture, TexCoord); - vec4 textureFlavoredColor = vec4(textureColor.rgb * Color, 1.0); + vec3 flavoredRGB = mix(textureColor.rgb, textureColor.rgb * Color, 0.7); + vec4 textureFlavoredColor = vec4(textureColor.rgb * Color, 1.0); if (bakedTextureColor.x < 0.01 && bakedTextureColor.y < 0.01 && bakedTextureColor.y < 0.01) { diff --git a/src/planet/PlanetData.cpp b/src/planet/PlanetData.cpp index d84d136..37fbf93 100644 --- a/src/planet/PlanetData.cpp +++ b/src/planet/PlanetData.cpp @@ -332,12 +332,19 @@ namespace ZL { lod.vertexData.ColorData.reserve(vertexCount); + const std::array triangleUVs = { Vector2f(0.5f, 1.0f), Vector2f(0.0f, 0.0f), Vector2f(1.0f, 0.0f) }; + const Vector3f colorPinkish = { 1.0f, 0.8f, 0.82f }; // Слегка розоватый + const Vector3f colorYellowish = { 1.0f, 1.0f, 0.75f }; // Слегка желтоватый + + const float colorFrequency = 4.0f; // Масштаб пятен + + for (const auto& t : lod.triangles) { // --- Вычисляем локальный базис треугольника (как в GetRotationForTriangle) --- Vector3f vA = t.data[0]; @@ -364,55 +371,24 @@ namespace ZL { lod.vertexData.TexCoordData.push_back(triangleUVs[i]); lod.vertexData.TangentData.push_back(x_axis); lod.vertexData.BinormalData.push_back(y_axis); - } - } - // Базовый цвет и параметры - const Vector3f baseColor = { 0.498f, 0.416f, 0.0f }; - const float colorFrequency = 5.0f; - const float colorAmplitude = 0.2f; - const Vector3f offsetR = { 0.1f, 0.2f, 0.3f }; - const Vector3f offsetG = { 0.5f, 0.4f, 0.6f }; - const Vector3f offsetB = { 0.9f, 0.8f, 0.7f }; - - - for (const auto& t : lod.triangles) { - for (int i = 0; i < 3; i++) { - // ВАЖНО: Мы используем геометрию из t.data[i] для получения направления, - // а не PositionData из buffer, поскольку там может не быть нужного порядка. - Vector3f p_geometry = t.data[i]; - Vector3f dir = p_geometry.normalized(); - - // Вычисление цветового шума (как вы делали) - float noiseR = colorPerlin.noise( - (dir.v[0] + offsetR.v[0]) * colorFrequency, - (dir.v[1] + offsetR.v[1]) * colorFrequency, - (dir.v[2] + offsetR.v[2]) * colorFrequency - ); - float noiseG = colorPerlin.noise( - (dir.v[0] + offsetG.v[0]) * colorFrequency, - (dir.v[1] + offsetG.v[1]) * colorFrequency, - (dir.v[2] + offsetG.v[2]) * colorFrequency - ); - float noiseB = colorPerlin.noise( - (dir.v[0] + offsetB.v[0]) * colorFrequency, - (dir.v[1] + offsetB.v[1]) * colorFrequency, - (dir.v[2] + offsetB.v[2]) * colorFrequency + // Используем один шум для выбора между розовым и желтым + Vector3f dir = t.data[i].normalized(); + float blendFactor = colorPerlin.noise( + dir.v[0] * colorFrequency, + dir.v[1] * colorFrequency, + dir.v[2] * colorFrequency ); - Vector3f colorOffset = { - noiseR * colorAmplitude, - noiseG * colorAmplitude, - noiseB * colorAmplitude - }; + // Приводим шум из диапазона [-1, 1] в [0, 1] + blendFactor = blendFactor * 0.5f + 0.5f; - Vector3f finalColor = baseColor + colorOffset; + // Линейная интерполяция между двумя цветами + Vector3f finalColor; + finalColor.v[0] = colorPinkish.v[0] + blendFactor * (colorYellowish.v[0] - colorPinkish.v[0]); + finalColor.v[1] = colorPinkish.v[1] + blendFactor * (colorYellowish.v[1] - colorPinkish.v[1]); + finalColor.v[2] = colorPinkish.v[2] + blendFactor * (colorYellowish.v[2] - colorPinkish.v[2]); - finalColor.v[0] = max(0.0f, min(1.0f, finalColor.v[0])); - finalColor.v[1] = max(0.0f, min(1.0f, finalColor.v[1])); - finalColor.v[2] = max(0.0f, min(1.0f, finalColor.v[2])); - - // ДОБАВЛЯЕМ ТОЛЬКО ЦВЕТ, так как PositionData и NormalData уже заполнены! lod.vertexData.ColorData.push_back(finalColor); } } diff --git a/src/planet/PlanetObject.cpp b/src/planet/PlanetObject.cpp index 92b64df..00973d9 100644 --- a/src/planet/PlanetObject.cpp +++ b/src/planet/PlanetObject.cpp @@ -67,7 +67,8 @@ namespace ZL { sandTexture = std::make_unique(CreateTextureDataFromPng("./resources/sand2.png", "")); - stoneTexture = std::make_unique(CreateTextureDataFromPng("./resources/rockdark2.png", "")); + stoneTexture = std::make_unique(CreateTextureDataFromPng("./resources/rock.png", "")); + // Атмосфера planetAtmosphereRenderStruct.data = planetData.getAtmosphereLod().vertexData; @@ -302,8 +303,8 @@ namespace ZL { // Позиция камеры (корабля) РІ РјРёСЂРµ renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]); - renderer.RenderUniform1f("uHeightScale", 0.08f); - //renderer.RenderUniform1f("uHeightScale", 0.0f); + //renderer.RenderUniform1f("uHeightScale", 0.08f); + renderer.RenderUniform1f("uHeightScale", 0.0f); renderer.RenderUniform1f("uDistanceToPlanetSurface", dist); renderer.RenderUniform1f("uCurrentZFar", currentZFar);