Fog
This commit is contained in:
parent
815ed91494
commit
3168f7b5db
@ -164,7 +164,8 @@ void game::view::WorldEnv::Draw(const DrawArgs& args)
|
||||
args.env.clear_color = glm::mix(kf1->clear_color, kf2->clear_color, t);
|
||||
args.env.ambient_light = glm::mix(kf1->ambient_color, kf2->ambient_color, t);
|
||||
args.env.sun_color = glm::mix(kf1->sun_color, kf2->sun_color, t);
|
||||
args.env.fog = glm::mix(kf1->fog, kf2->fog, t);
|
||||
// args.env.fog = glm::mix(kf1->fog, kf2->fog, t);
|
||||
args.env.fog = glm::vec4(args.env.clear_color, 0.00001f);
|
||||
|
||||
float dist = args.farplane * 0.5f;
|
||||
|
||||
|
||||
@ -127,15 +127,20 @@ void gfx::Renderer::SetupSurfaceShader(SurfaceShader& sshader, const DrawListPar
|
||||
return; // Global uniforms are already set up
|
||||
}
|
||||
|
||||
glUniformMatrix4fv(shader.U(gfx::SU_VIEW_PROJ), 1, GL_FALSE, ¶ms.view_proj[0][0]);
|
||||
glUniformMatrix4fv(shader.U(SU_VIEW_PROJ), 1, GL_FALSE, ¶ms.view_proj[0][0]);
|
||||
|
||||
if (sshader.iflags & SIF_FOG_DATA)
|
||||
{
|
||||
glUniform3fv(shader.U(SU_CAMERA_POS), 1, ¶ms.cam_pos[0]);
|
||||
glUniform4fv(shader.U(SU_FOG), 1, ¶ms.env.fog[0]);
|
||||
}
|
||||
|
||||
// setup lighting
|
||||
if (sshader.iflags & SIF_LIGHTING_DATA)
|
||||
{
|
||||
glUniform3fv(shader.U(gfx::SU_AMBIENT_LIGHT), 1, ¶ms.env.ambient_light[0]);
|
||||
glUniform3fv(shader.U(gfx::SU_SUN_COLOR), 1, ¶ms.env.sun_color[0]);
|
||||
glUniform3fv(shader.U(gfx::SU_SUN_DIRECTION), 1, ¶ms.env.sun_direction[0]);
|
||||
// glUniform4fv(shader.U(gfx::SU_FOG), 1, ¶ms.env.fog[0]);
|
||||
glUniform3fv(shader.U(SU_AMBIENT_LIGHT), 1, ¶ms.env.ambient_light[0]);
|
||||
glUniform3fv(shader.U(SU_SUN_COLOR), 1, ¶ms.env.sun_color[0]);
|
||||
glUniform3fv(shader.U(SU_SUN_DIRECTION), 1, ¶ms.env.sun_direction[0]);
|
||||
}
|
||||
|
||||
sshader.global_setup = true;
|
||||
@ -194,6 +199,8 @@ void gfx::Renderer::DrawSurfaceList(std::span<DrawSurfaceCmd> list, const DrawLi
|
||||
{
|
||||
if (cmd.surface->sflags & SF_BLEND)
|
||||
cmd.rflags |= SRF_BLEND;
|
||||
else
|
||||
cmd.rflags |= SRF_FOG;
|
||||
|
||||
if (cmd.surface->texture)
|
||||
cmd.rflags |= SRF_TEXTURE;
|
||||
|
||||
@ -20,6 +20,7 @@ static const char* const s_uni_names[] = {
|
||||
"u_num_lights",
|
||||
"u_light_positions",
|
||||
"u_light_colors_rs",
|
||||
"u_camera_pos",
|
||||
};
|
||||
|
||||
// Vytvori shader z daneho zdroje
|
||||
|
||||
@ -25,7 +25,8 @@ namespace gfx
|
||||
SU_NUMLIGHTS,
|
||||
SU_LIGHT_POSITIONS,
|
||||
SU_LIGHT_COLORS_RS,
|
||||
|
||||
SU_CAMERA_POS,
|
||||
|
||||
SU_COUNT
|
||||
};
|
||||
|
||||
|
||||
@ -19,14 +19,15 @@ enum SurfaceRenderFlag : SurfaceRenderFlags
|
||||
SRF_OBJECT_COLOR_BACKGROUND = 16,
|
||||
SRF_MULTICOLOR = 32,
|
||||
SRF_LIT = 64,
|
||||
SRF_DEFORM = 128,
|
||||
SRF_SKELETAL = 256,
|
||||
SRF_TEXTURE = 512,
|
||||
SRF_FOG = 128,
|
||||
SRF_DEFORM = 256,
|
||||
SRF_SKELETAL = 512,
|
||||
SRF_TEXTURE = 1024,
|
||||
|
||||
SRF__SHADER = SRF_CULL_ALPHA | SRF_OBJECT_COLOR | SRF_OBJECT_COLOR_BACKGROUND | SRF_MULTICOLOR | SRF_LIT | SRF_SKELETAL | SRF_DEFORM | SRF_TEXTURE,
|
||||
SRF__SHADER = SRF_CULL_ALPHA | SRF_OBJECT_COLOR | SRF_OBJECT_COLOR_BACKGROUND | SRF_MULTICOLOR | SRF_LIT | SRF_FOG | SRF_SKELETAL | SRF_DEFORM | SRF_TEXTURE,
|
||||
|
||||
// order affects visual result
|
||||
SRF_BLEND = 1024,
|
||||
SRF_BLEND = 2048,
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ std::unique_ptr<gfx::Shader> gfx::CreateSurfaceShader(SurfaceRenderFlags flags,
|
||||
|
||||
vert_outs = R"GLSL(
|
||||
out vec3 v_color;
|
||||
out vec3 v_world_pos;
|
||||
)GLSL";
|
||||
|
||||
vert_pos_calc = R"GLSL(
|
||||
@ -35,10 +36,12 @@ std::unique_ptr<gfx::Shader> gfx::CreateSurfaceShader(SurfaceRenderFlags flags,
|
||||
vert_main = R"GLSL(
|
||||
gl_Position = u_view_proj * world_pos;
|
||||
v_color = a_color.rgb;
|
||||
v_world_pos = world_pos.xyz;
|
||||
)GLSL";
|
||||
|
||||
frag_ins = R"GLSL(
|
||||
in vec3 v_color;
|
||||
in vec3 v_world_pos;
|
||||
)GLSL";
|
||||
|
||||
frag_main = R"GLSL(
|
||||
@ -201,13 +204,28 @@ std::unique_ptr<gfx::Shader> gfx::CreateSurfaceShader(SurfaceRenderFlags flags,
|
||||
|
||||
if (flags & SRF_MULTICOLOR)
|
||||
{
|
||||
frag_main += "o_color.rgb *= mix(v_color, vec3(1.5), emis);";
|
||||
frag_main += "o_color.rgb *= mix(v_color, vec3(1.5), emis);\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
frag_main += "o_color.rgb *= v_color;";
|
||||
frag_main += "o_color.rgb *= v_color;\n";
|
||||
}
|
||||
|
||||
if (flags & SRF_FOG)
|
||||
{
|
||||
frag_uniforms += R"GLSL(
|
||||
uniform vec4 u_fog;
|
||||
uniform vec3 u_camera_pos;
|
||||
)GLSL";
|
||||
|
||||
frag_main += R"GLSL(
|
||||
float dist = distance(v_world_pos, u_camera_pos);
|
||||
float fog_factor = 1.0 / (1.0 + dist * dist * u_fog.a);
|
||||
o_color.rgb = mix(u_fog.rgb, o_color.rgb, fog_factor);
|
||||
)GLSL";
|
||||
|
||||
input_flags |= SIF_FOG_DATA;
|
||||
}
|
||||
|
||||
vert_main = vert_pos_calc + vert_main;
|
||||
|
||||
|
||||
@ -18,6 +18,7 @@ enum SurfaceShaderInputFlag : SurfaceShaderInputFlags
|
||||
SIF_SKELETAL_DATA = 8,
|
||||
SIF_DEFORM_DATA = 16,
|
||||
SIF_MULTICOLOR_DATA = 32,
|
||||
SIF_FOG_DATA = 64,
|
||||
};
|
||||
|
||||
std::unique_ptr<Shader> CreateSurfaceShader(SurfaceRenderFlags flags, SurfaceShaderInputFlags& input_flags);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user