mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-09 02:07:04 +08:00
feat(renderer): compute ambient and sunlight colors based on sun height
This commit is contained in:
@@ -12,6 +12,7 @@ layout (binding = 1) uniform sampler2DArray samp;
|
|||||||
|
|
||||||
uniform float ambientStrength;
|
uniform float ambientStrength;
|
||||||
uniform vec3 sunlightColor;
|
uniform vec3 sunlightColor;
|
||||||
|
uniform vec3 ambientColor;
|
||||||
uniform vec3 sunlightDir;
|
uniform vec3 sunlightDir;
|
||||||
uniform vec3 cameraPos;
|
uniform vec3 cameraPos;
|
||||||
uniform bool shader_on;
|
uniform bool shader_on;
|
||||||
@@ -281,7 +282,7 @@ void main(void) {
|
|||||||
vec3 H =
|
vec3 H =
|
||||||
normalize(lightDir + V);
|
normalize(lightDir + V);
|
||||||
|
|
||||||
vec3 ambient = ambientStrength * sunlightColor;
|
vec3 ambient = ambientStrength * ambientColor;
|
||||||
|
|
||||||
float diff = max(dot(norm, lightDir), 0.0);
|
float diff = max(dot(norm, lightDir), 0.0);
|
||||||
|
|
||||||
|
|||||||
@@ -506,6 +506,7 @@ void Renderer::render_world() {
|
|||||||
auto& m_render_snapshots = m_world.render_snapshots();
|
auto& m_render_snapshots = m_world.render_snapshots();
|
||||||
auto& camera_pos = m_camera.get_camera_pos();
|
auto& camera_pos = m_camera.get_camera_pos();
|
||||||
float texels_per_unit = 0.0f;
|
float texels_per_unit = 0.0f;
|
||||||
|
glm::vec3 sundir = glm::normalize(m_world.sunlight_dir());
|
||||||
if (m_shader_on) {
|
if (m_shader_on) {
|
||||||
const auto& depth_shader = get_shader("depth_shader");
|
const auto& depth_shader = get_shader("depth_shader");
|
||||||
depth_shader.use();
|
depth_shader.use();
|
||||||
@@ -516,7 +517,6 @@ void Renderer::render_world() {
|
|||||||
|
|
||||||
glm::vec3 center = cam_pos + cam_fwd * (half_extent * 0.5f);
|
glm::vec3 center = cam_pos + cam_fwd * (half_extent * 0.5f);
|
||||||
|
|
||||||
glm::vec3 sundir = glm::normalize(m_world.sunlight_dir());
|
|
||||||
glm::vec3 raw_shadow_sundir =
|
glm::vec3 raw_shadow_sundir =
|
||||||
quantize_sun_direction(sundir, ANGLE_STEP_DEG);
|
quantize_sun_direction(sundir, ANGLE_STEP_DEG);
|
||||||
glm::vec3 shadow_sundir =
|
glm::vec3 shadow_sundir =
|
||||||
@@ -621,6 +621,15 @@ void Renderer::render_world() {
|
|||||||
glm::vec3 light_dir_view =
|
glm::vec3 light_dir_view =
|
||||||
glm::normalize(glm::mat3(m_v_mat) * m_world.sunlight_dir());
|
glm::normalize(glm::mat3(m_v_mat) * m_world.sunlight_dir());
|
||||||
|
|
||||||
|
float sun_height = (-sundir).y;
|
||||||
|
float t = std::clamp(sun_height * 0.5f + 0.5f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
glm::vec3 sun_color =
|
||||||
|
mix(glm::vec3(1.00f, 0.45f, 0.15f), glm::vec3(1.00f, 0.90f, 0.65f), t);
|
||||||
|
|
||||||
|
glm::vec3 ambient_color =
|
||||||
|
mix(glm::vec3(0.18f, 0.12f, 0.35f), glm::vec3(0.35f, 0.50f, 0.85f), t);
|
||||||
|
|
||||||
glUniformMatrix4fv(m_mv_loc, 1, GL_FALSE, glm::value_ptr(m_mv_mat));
|
glUniformMatrix4fv(m_mv_loc, 1, GL_FALSE, glm::value_ptr(m_mv_mat));
|
||||||
glUniformMatrix4fv(m_proj_loc, 1, GL_FALSE, glm::value_ptr(m_p_mat));
|
glUniformMatrix4fv(m_proj_loc, 1, GL_FALSE, glm::value_ptr(m_p_mat));
|
||||||
glUniformMatrix4fv(normal_block_shader.loc("norm_matrix"), 1, GL_FALSE,
|
glUniformMatrix4fv(normal_block_shader.loc("norm_matrix"), 1, GL_FALSE,
|
||||||
@@ -629,7 +638,9 @@ void Renderer::render_world() {
|
|||||||
glm::value_ptr(light_space_matrix));
|
glm::value_ptr(light_space_matrix));
|
||||||
glUniform1f(normal_block_shader.loc("ambientStrength"), m_ambient_strength);
|
glUniform1f(normal_block_shader.loc("ambientStrength"), m_ambient_strength);
|
||||||
glUniform3fv(normal_block_shader.loc("sunlightColor"), 1,
|
glUniform3fv(normal_block_shader.loc("sunlightColor"), 1,
|
||||||
glm::value_ptr(SUNLIGHT_COLOR));
|
glm::value_ptr(sun_color));
|
||||||
|
glUniform3fv(normal_block_shader.loc("ambientColor"), 1,
|
||||||
|
glm::value_ptr(ambient_color));
|
||||||
glUniform3fv(normal_block_shader.loc("sunlightDir"), 1,
|
glUniform3fv(normal_block_shader.loc("sunlightDir"), 1,
|
||||||
glm::value_ptr(light_dir_view));
|
glm::value_ptr(light_dir_view));
|
||||||
glUniform1i(normal_block_shader.loc("shadowMode"), m_shadow_mode);
|
glUniform1i(normal_block_shader.loc("shadowMode"), m_shadow_mode);
|
||||||
|
|||||||
Reference in New Issue
Block a user