Added fog to terrain renderer and renamed variables

dev
Tomasz Kapuściński 2021-10-17 16:27:29 +02:00
parent 4157604458
commit fea6b87139
5 changed files with 55 additions and 27 deletions

View File

@ -97,6 +97,9 @@ public:
//! Sets light parameters
virtual void SetLight(const glm::vec4& position, const float& intensity, const glm::vec3& color) = 0;
//! Sets fog parameters
virtual void SetFog(float min, float max, const glm::vec3& color) = 0;
//! Draws terrain object
virtual void DrawObject(const glm::mat4& matrix, const CVertexBuffer* buffer) = 0;
};

View File

@ -3393,6 +3393,10 @@ void CEngine::Draw3DScene()
terrainRenderer->SetShadowMap(m_shadowMap);
terrainRenderer->SetLight(glm::vec4(1.0, 1.0, -1.0, 0.0), 1.0f, glm::vec3(1.0));
Color fogColor = m_fogColor[m_rankView];
terrainRenderer->SetFog(fogStart, fogEnd, { fogColor.r, fogColor.g, fogColor.b });
Math::Matrix scale;
scale.Set(3, 3, -1.0f);
auto projectionViewMatrix = Math::MultiplyMatrices(m_matProj, scale);

View File

@ -260,15 +260,17 @@ CGL33TerrainRenderer::CGL33TerrainRenderer(CGL33Device* device)
// Setup uniforms
auto identity = glm::identity<glm::mat4>();
uni_projectionMatrix = glGetUniformLocation(m_program, "uni_ProjectionMatrix");
uni_viewMatrix = glGetUniformLocation(m_program, "uni_ViewMatrix");
uni_cameraMatrix = glGetUniformLocation(m_program, "uni_CameraMatrix");
uni_shadowMatrix = glGetUniformLocation(m_program, "uni_ShadowMatrix");
uni_modelMatrix = glGetUniformLocation(m_program, "uni_ModelMatrix");
uni_normalMatrix = glGetUniformLocation(m_program, "uni_NormalMatrix");
uni_lightPosition = glGetUniformLocation(m_program, "uni_LightPosition");
uni_lightIntensity = glGetUniformLocation(m_program, "uni_LightIntensity");
uni_lightColor = glGetUniformLocation(m_program, "uni_LightColor");
m_projectionMatrix = glGetUniformLocation(m_program, "uni_ProjectionMatrix");
m_viewMatrix = glGetUniformLocation(m_program, "uni_ViewMatrix");
m_cameraMatrix = glGetUniformLocation(m_program, "uni_CameraMatrix");
m_shadowMatrix = glGetUniformLocation(m_program, "uni_ShadowMatrix");
m_modelMatrix = glGetUniformLocation(m_program, "uni_ModelMatrix");
m_normalMatrix = glGetUniformLocation(m_program, "uni_NormalMatrix");
m_lightPosition = glGetUniformLocation(m_program, "uni_LightPosition");
m_lightIntensity = glGetUniformLocation(m_program, "uni_LightIntensity");
m_lightColor = glGetUniformLocation(m_program, "uni_LightColor");
m_fogRange = glGetUniformLocation(m_program, "uni_FogRange");
m_fogColor = glGetUniformLocation(m_program, "uni_FogColor");
// Set texture units to 10th and 11th
auto texture = glGetUniformLocation(m_program, "uni_PrimaryTexture");
@ -317,7 +319,7 @@ void CGL33TerrainRenderer::End()
void CGL33TerrainRenderer::SetProjectionMatrix(const glm::mat4& matrix)
{
glUniformMatrix4fv(uni_projectionMatrix, 1, GL_FALSE, value_ptr(matrix));
glUniformMatrix4fv(m_projectionMatrix, 1, GL_FALSE, value_ptr(matrix));
}
void CGL33TerrainRenderer::SetViewMatrix(const glm::mat4& matrix)
@ -328,21 +330,21 @@ void CGL33TerrainRenderer::SetViewMatrix(const glm::mat4& matrix)
auto viewMatrix = scale * matrix;
auto cameraMatrix = glm::inverse(viewMatrix);
glUniformMatrix4fv(uni_viewMatrix, 1, GL_FALSE, value_ptr(viewMatrix));
glUniformMatrix4fv(uni_cameraMatrix, 1, GL_FALSE, value_ptr(cameraMatrix));
glUniformMatrix4fv(m_viewMatrix, 1, GL_FALSE, value_ptr(viewMatrix));
glUniformMatrix4fv(m_cameraMatrix, 1, GL_FALSE, value_ptr(cameraMatrix));
}
void CGL33TerrainRenderer::SetModelMatrix(const glm::mat4& matrix)
{
auto normalMatrix = glm::transpose(glm::inverse(glm::mat3(matrix)));
glUniformMatrix4fv(uni_modelMatrix, 1, GL_FALSE, value_ptr(matrix));
glUniformMatrix3fv(uni_normalMatrix, 1, GL_FALSE, value_ptr(normalMatrix));
glUniformMatrix4fv(m_modelMatrix, 1, GL_FALSE, value_ptr(matrix));
glUniformMatrix3fv(m_normalMatrix, 1, GL_FALSE, value_ptr(normalMatrix));
}
void CGL33TerrainRenderer::SetShadowMatrix(const glm::mat4& matrix)
{
glUniformMatrix4fv(uni_shadowMatrix, 1, GL_FALSE, value_ptr(matrix));
glUniformMatrix4fv(m_shadowMatrix, 1, GL_FALSE, value_ptr(matrix));
}
void CGL33TerrainRenderer::SetPrimaryTexture(const Texture& texture)
@ -389,9 +391,15 @@ void CGL33TerrainRenderer::SetShadowMap(const Texture& texture)
void CGL33TerrainRenderer::SetLight(const glm::vec4& position, const float& intensity, const glm::vec3& color)
{
glUniform4fv(uni_lightPosition, 1, glm::value_ptr(position));
glUniform1f(uni_lightIntensity, intensity);
glUniform3fv(uni_lightColor, 1, glm::value_ptr(color));
glUniform4fv(m_lightPosition, 1, glm::value_ptr(position));
glUniform1f(m_lightIntensity, intensity);
glUniform3fv(m_lightColor, 1, glm::value_ptr(color));
}
void CGL33TerrainRenderer::SetFog(float min, float max, const glm::vec3& color)
{
glUniform2f(m_fogRange, min, max);
glUniform3f(m_fogColor, color.r, color.g, color.b);
}
void CGL33TerrainRenderer::DrawObject(const glm::mat4& matrix, const CVertexBuffer* buffer)

View File

@ -121,6 +121,9 @@ public:
//! Sets light parameters
virtual void SetLight(const glm::vec4& position, const float& intensity, const glm::vec3& color) override;
//! Sets fog parameters
virtual void SetFog(float min, float max, const glm::vec3& color) override;
//! Draws terrain object
virtual void DrawObject(const glm::mat4& matrix, const CVertexBuffer* buffer) override;
@ -130,15 +133,17 @@ private:
CGL33Device* const m_device;
// Uniform data
GLint uni_projectionMatrix;
GLint uni_viewMatrix;
GLint uni_cameraMatrix;
GLint uni_shadowMatrix;
GLint uni_modelMatrix;
GLint uni_normalMatrix;
GLint uni_lightPosition;
GLint uni_lightIntensity;
GLint uni_lightColor;
GLint m_projectionMatrix;
GLint m_viewMatrix;
GLint m_cameraMatrix;
GLint m_shadowMatrix;
GLint m_modelMatrix;
GLint m_normalMatrix;
GLint m_lightPosition;
GLint m_lightIntensity;
GLint m_lightColor;
GLint m_fogRange;
GLint m_fogColor;
// Shader program
GLuint m_program = 0;

View File

@ -25,6 +25,9 @@ uniform vec4 uni_LightPosition;
uniform float uni_LightIntensity;
uniform vec3 uni_LightColor;
uniform vec2 uni_FogRange;
uniform vec3 uni_FogColor;
uniform sampler2D uni_PrimaryTexture;
uniform sampler2D uni_SecondaryTexture;
uniform sampler2DShadow uni_ShadowMap;
@ -113,5 +116,10 @@ void main()
vec3 color = lighting * shadow + albedo * skyColor * skyIntensity;
float dist = length(uni_CameraMatrix[3].xyz - data.Position);
float fogAmount = clamp((dist - uni_FogRange.x) / (uni_FogRange.y - uni_FogRange.x), 0.0, 1.0);
color = mix(color, uni_FogColor, fogAmount);
out_FragColor = vec4(color, 1.0);
}