Working on fog shader
This commit is contained in:
1 parent
2b40c13c9d
commit
c9178cff3a
7 files changed
+232
-99
No files matched your search
@@ -6,6 +6,7 @@
|
||||
|
||||
namespace ZL {
|
||||
|
||||
|
||||
const float PlanetData::PLANET_RADIUS = 20000.f;
|
||||
const Vector3f PlanetData::PLANET_CENTER_OFFSET = Vector3f{ 0.f, 0.f, 0.0f };
|
||||
|
||||
@@ -109,15 +110,32 @@ namespace ZL {
|
||||
currentZNear = 32;
|
||||
currentZFar = 10000.f;
|
||||
}
|
||||
else
|
||||
else if (dToPlanetSurface > 20)
|
||||
{
|
||||
currentZNear = 16;
|
||||
currentZFar = 5000.f;
|
||||
}
|
||||
else if (dToPlanetSurface > 5)
|
||||
{
|
||||
currentZNear = 8;
|
||||
currentZFar = 2500.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
currentZNear = 4;
|
||||
currentZFar = 1250.f;
|
||||
}
|
||||
|
||||
return { currentZNear, currentZFar };
|
||||
}
|
||||
|
||||
float PlanetData::distanceToPlanetSurfaceFast(const Vector3f& viewerPosition)
|
||||
{
|
||||
Vector3f shipLocalPosition = viewerPosition - PLANET_CENTER_OFFSET;
|
||||
|
||||
return sqrt(shipLocalPosition.squaredNorm()) - PLANET_RADIUS;
|
||||
}
|
||||
|
||||
|
||||
float PlanetData::distanceToPlanetSurface(const Vector3f& viewerPosition) {
|
||||
Vector3f shipLocalPosition = viewerPosition - PLANET_CENTER_OFFSET;
|
||||
@@ -304,12 +322,14 @@ namespace ZL {
|
||||
lod.vertexData.TexCoordData.clear();
|
||||
lod.vertexData.TangentData.clear();
|
||||
lod.vertexData.BinormalData.clear();
|
||||
lod.vertexData.ColorData.clear();
|
||||
|
||||
lod.vertexData.PositionData.reserve(vertexCount);
|
||||
lod.vertexData.NormalData.reserve(vertexCount);
|
||||
lod.vertexData.TexCoordData.reserve(vertexCount);
|
||||
lod.vertexData.TangentData.reserve(vertexCount);
|
||||
lod.vertexData.BinormalData.reserve(vertexCount);
|
||||
lod.vertexData.ColorData.reserve(vertexCount);
|
||||
|
||||
|
||||
const std::array<Vector2f, 3> triangleUVs = {
|
||||
@@ -346,6 +366,56 @@ namespace ZL {
|
||||
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 colorOffset = {
|
||||
noiseR * colorAmplitude,
|
||||
noiseG * colorAmplitude,
|
||||
noiseB * colorAmplitude
|
||||
};
|
||||
|
||||
Vector3f finalColor = baseColor + colorOffset;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
namespace ZL {
|
||||
|
||||
|
||||
using VertexID = std::string;
|
||||
using V2TMap = std::map<VertexID, std::vector<int>>;
|
||||
|
||||
@@ -102,6 +103,7 @@ namespace ZL {
|
||||
// Ëîãèêà
|
||||
std::pair<float, float> calculateZRange(float distanceToSurface);
|
||||
float distanceToPlanetSurface(const Vector3f& viewerPosition);
|
||||
float distanceToPlanetSurfaceFast(const Vector3f& viewerPosition);
|
||||
|
||||
// Âîçâðàùàåò èíäåêñû òðåóãîëüíèêîâ, âèäèìûõ êàìåðîé
|
||||
std::vector<int> getTrianglesUnderCameraNew(const Vector3f& viewerPosition);
|
||||
|
||||
@@ -65,8 +65,9 @@ namespace ZL {
|
||||
//planetRenderStruct.data.PositionData.resize(9);
|
||||
planetRenderStruct.RefreshVBO();
|
||||
|
||||
|
||||
sandTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/sand2.png", ""));
|
||||
stoneTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/rock.png", ""));
|
||||
stoneTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/rockdark2.png", ""));
|
||||
|
||||
// Атмосфера
|
||||
planetAtmosphereRenderStruct.data = planetData.getAtmosphereLod().vertexData;
|
||||
@@ -271,7 +272,8 @@ namespace ZL {
|
||||
renderer.EnableVertexAttribArray("vBinormal");
|
||||
renderer.EnableVertexAttribArray(vTexCoordName);
|
||||
|
||||
float dist = planetData.distanceToPlanetSurface(Environment::shipPosition);
|
||||
|
||||
float dist = planetData.distanceToPlanetSurfaceFast(Environment::shipPosition);
|
||||
auto zRange = planetData.calculateZRange(dist);
|
||||
const float currentZNear = zRange.first;
|
||||
const float currentZFar = zRange.second;
|
||||
@@ -300,13 +302,14 @@ namespace ZL {
|
||||
// Позиция камеры (корабля) в мире
|
||||
renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]);
|
||||
|
||||
renderer.RenderUniform1f("uHeightScale", 0.03f);
|
||||
renderer.RenderUniform1f("uHeightScale", 0.08f);
|
||||
//renderer.RenderUniform1f("uHeightScale", 0.0f);
|
||||
|
||||
renderer.RenderUniform1f("uDistanceToPlanetSurface", dist);
|
||||
renderer.RenderUniform1f("uCurrentZFar", currentZFar);
|
||||
|
||||
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, stoneMapFB->getTextureID());
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
@@ -329,7 +332,6 @@ namespace ZL {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void PlanetObject::drawStones(Renderer& renderer)
|
||||
{
|
||||
static const std::string defaultShaderName2 = "planetStone";
|
||||
@@ -346,7 +348,8 @@ namespace ZL {
|
||||
renderer.EnableVertexAttribArray(vNormalName);
|
||||
renderer.EnableVertexAttribArray(vTexCoordName);
|
||||
|
||||
float dist = planetData.distanceToPlanetSurface(Environment::shipPosition);
|
||||
|
||||
float dist = planetData.distanceToPlanetSurfaceFast(Environment::shipPosition);
|
||||
auto zRange = planetData.calculateZRange(dist);
|
||||
const float currentZNear = zRange.first;
|
||||
const float currentZFar = zRange.second;
|
||||
@@ -481,7 +484,7 @@ namespace ZL {
|
||||
renderer.EnableVertexAttribArray(vNormalName);
|
||||
|
||||
|
||||
float dist = planetData.distanceToPlanetSurface(Environment::shipPosition);
|
||||
float dist = planetData.distanceToPlanetSurfaceFast(Environment::shipPosition);
|
||||
auto zRange = planetData.calculateZRange(dist);
|
||||
const float currentZNear = zRange.first;
|
||||
const float currentZFar = zRange.second;
|
||||
@@ -501,6 +504,7 @@ namespace ZL {
|
||||
|
||||
Vector3f color = { 0.0, 0.5, 1.0 };
|
||||
|
||||
|
||||
renderer.RenderUniform3fv("uColor", &color.v[0]);
|
||||
|
||||
renderer.RenderUniformMatrix4fv("ModelViewMatrix", false, &viewMatrix.m[0]);
|
||||
@@ -525,7 +529,7 @@ namespace ZL {
|
||||
|
||||
float PlanetObject::distanceToPlanetSurface(const Vector3f& viewerPosition)
|
||||
{
|
||||
return planetData.distanceToPlanetSurface(viewerPosition);
|
||||
return planetData.distanceToPlanetSurfaceFast(viewerPosition);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user