working on colors on the planet

This commit is contained in:
Vladislav Khorev 2026-01-02 22:01:33 +03:00
parent c9178cff3a
commit 570c96a628
3 changed files with 26 additions and 48 deletions

View File

@ -33,6 +33,7 @@ void main() {
vec4 bakedTextureColor = texture2D(BakedTexture, finalTexCoord); vec4 bakedTextureColor = texture2D(BakedTexture, finalTexCoord);
vec4 textureColor = texture2D(Texture, TexCoord); vec4 textureColor = texture2D(Texture, TexCoord);
vec3 flavoredRGB = mix(textureColor.rgb, textureColor.rgb * Color, 0.7);
vec4 textureFlavoredColor = vec4(textureColor.rgb * Color, 1.0); vec4 textureFlavoredColor = vec4(textureColor.rgb * Color, 1.0);
if (bakedTextureColor.x < 0.01 && bakedTextureColor.y < 0.01 && bakedTextureColor.y < 0.01) if (bakedTextureColor.x < 0.01 && bakedTextureColor.y < 0.01 && bakedTextureColor.y < 0.01)

View File

@ -332,12 +332,19 @@ namespace ZL {
lod.vertexData.ColorData.reserve(vertexCount); lod.vertexData.ColorData.reserve(vertexCount);
const std::array<Vector2f, 3> triangleUVs = { const std::array<Vector2f, 3> triangleUVs = {
Vector2f(0.5f, 1.0f), Vector2f(0.5f, 1.0f),
Vector2f(0.0f, 0.0f), Vector2f(0.0f, 0.0f),
Vector2f(1.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) { for (const auto& t : lod.triangles) {
// --- Âû÷èñëÿåì ëîêàëüíûé áàçèñ òðåóãîëüíèêà (êàê â GetRotationForTriangle) --- // --- Âû÷èñëÿåì ëîêàëüíûé áàçèñ òðåóãîëüíèêà (êàê â GetRotationForTriangle) ---
Vector3f vA = t.data[0]; Vector3f vA = t.data[0];
@ -364,55 +371,24 @@ namespace ZL {
lod.vertexData.TexCoordData.push_back(triangleUVs[i]); lod.vertexData.TexCoordData.push_back(triangleUVs[i]);
lod.vertexData.TangentData.push_back(x_axis); lod.vertexData.TangentData.push_back(x_axis);
lod.vertexData.BinormalData.push_back(y_axis); lod.vertexData.BinormalData.push_back(y_axis);
}
}
// Áŕçîâűé öâĺň č ďŕđŕěĺňđű // Čńďîëüçóĺě îäčí řóě äë˙ âűáîđŕ ěĺćäó đîçîâűě č ćĺëňűě
const Vector3f baseColor = { 0.498f, 0.416f, 0.0f }; Vector3f dir = t.data[i].normalized();
const float colorFrequency = 5.0f; float blendFactor = colorPerlin.noise(
const float colorAmplitude = 0.2f; dir.v[0] * colorFrequency,
const Vector3f offsetR = { 0.1f, 0.2f, 0.3f }; dir.v[1] * colorFrequency,
const Vector3f offsetG = { 0.5f, 0.4f, 0.6f }; dir.v[2] * colorFrequency
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 colorOffset = { // Ďđčâîäčě řóě čç äčŕďŕçîíŕ [-1, 1] â [0, 1]
noiseR * colorAmplitude, blendFactor = blendFactor * 0.5f + 0.5f;
noiseG * colorAmplitude,
noiseB * colorAmplitude
};
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); lod.vertexData.ColorData.push_back(finalColor);
} }
} }

View File

@ -67,7 +67,8 @@ namespace ZL {
sandTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/sand2.png", "")); sandTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/sand2.png", ""));
stoneTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/rockdark2.png", "")); stoneTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/rock.png", ""));
// Атмосфера // Атмосфера
planetAtmosphereRenderStruct.data = planetData.getAtmosphereLod().vertexData; planetAtmosphereRenderStruct.data = planetData.getAtmosphereLod().vertexData;
@ -302,8 +303,8 @@ namespace ZL {
// Позиция камеры (корабля) в мире // Позиция камеры (корабля) в мире
renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]); renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]);
renderer.RenderUniform1f("uHeightScale", 0.08f); //renderer.RenderUniform1f("uHeightScale", 0.08f);
//renderer.RenderUniform1f("uHeightScale", 0.0f); renderer.RenderUniform1f("uHeightScale", 0.0f);
renderer.RenderUniform1f("uDistanceToPlanetSurface", dist); renderer.RenderUniform1f("uDistanceToPlanetSurface", dist);
renderer.RenderUniform1f("uCurrentZFar", currentZFar); renderer.RenderUniform1f("uCurrentZFar", currentZFar);