This commit is contained in:
tovjemam 2026-05-27 18:40:48 +02:00
parent 815ed91494
commit 3168f7b5db
7 changed files with 44 additions and 14 deletions

View File

@ -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;

View File

@ -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, &params.view_proj[0][0]);
glUniformMatrix4fv(shader.U(SU_VIEW_PROJ), 1, GL_FALSE, &params.view_proj[0][0]);
if (sshader.iflags & SIF_FOG_DATA)
{
glUniform3fv(shader.U(SU_CAMERA_POS), 1, &params.cam_pos[0]);
glUniform4fv(shader.U(SU_FOG), 1, &params.env.fog[0]);
}
// setup lighting
if (sshader.iflags & SIF_LIGHTING_DATA)
{
glUniform3fv(shader.U(gfx::SU_AMBIENT_LIGHT), 1, &params.env.ambient_light[0]);
glUniform3fv(shader.U(gfx::SU_SUN_COLOR), 1, &params.env.sun_color[0]);
glUniform3fv(shader.U(gfx::SU_SUN_DIRECTION), 1, &params.env.sun_direction[0]);
// glUniform4fv(shader.U(gfx::SU_FOG), 1, &params.env.fog[0]);
glUniform3fv(shader.U(SU_AMBIENT_LIGHT), 1, &params.env.ambient_light[0]);
glUniform3fv(shader.U(SU_SUN_COLOR), 1, &params.env.sun_color[0]);
glUniform3fv(shader.U(SU_SUN_DIRECTION), 1, &params.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;

View File

@ -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

View File

@ -25,7 +25,8 @@ namespace gfx
SU_NUMLIGHTS,
SU_LIGHT_POSITIONS,
SU_LIGHT_COLORS_RS,
SU_CAMERA_POS,
SU_COUNT
};

View File

@ -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,
};

View File

@ -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;

View File

@ -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);