feat: shadows in fast pipeline & improve lights mix
This commit is contained in:
parent
30a0b81680
commit
e158b384fa
@ -58,5 +58,5 @@ function on_hud_open()
|
|||||||
|
|
||||||
local slot = gfx.posteffects.index("core:default")
|
local slot = gfx.posteffects.index("core:default")
|
||||||
gfx.posteffects.set_effect(slot, "ssao")
|
gfx.posteffects.set_effect(slot, "ssao")
|
||||||
gfx.posteffects.set_intensity(slot, 1.0)
|
--gfx.posteffects.set_intensity(slot, 1.0)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -12,15 +12,16 @@ float calc_shadow() {
|
|||||||
shadow = 0.0;
|
shadow = 0.0;
|
||||||
|
|
||||||
if (dot(a_realnormal, u_sunDir) < 0.0) {
|
if (dot(a_realnormal, u_sunDir) < 0.0) {
|
||||||
for (int x = -1; x <= 1; x++) {
|
const vec3 offsets[4] = vec3[4](
|
||||||
for (int y = -1; y <= 1; y++) {
|
vec3(0.5, 0.5, 0.0),
|
||||||
shadow += texture(u_shadows, projCoords.xyz + vec3(
|
vec3(-0.5, 0.5, 0.0),
|
||||||
x * (1.0 / u_shadowsRes),
|
vec3(0.5, -0.5, 0.0),
|
||||||
y * (1.0 / u_shadowsRes), 0.0
|
vec3(-0.5, -0.5, 0.0)
|
||||||
));
|
);
|
||||||
}
|
for (int i = 0; i < 4; i++) {
|
||||||
|
shadow += texture(u_shadows, projCoords.xyz + offsets[i] / u_shadowsRes);
|
||||||
}
|
}
|
||||||
shadow /= 9;
|
shadow /= 4;
|
||||||
shadow = shadow * 0.5 + 0.5;
|
shadow = shadow * 0.5 + 0.5;
|
||||||
} else {
|
} else {
|
||||||
shadow = 0.5;
|
shadow = 0.5;
|
||||||
|
|||||||
@ -2,7 +2,8 @@ layout (location = 0) out vec4 f_color;
|
|||||||
layout (location = 1) out vec4 f_position;
|
layout (location = 1) out vec4 f_position;
|
||||||
layout (location = 2) out vec4 f_normal;
|
layout (location = 2) out vec4 f_normal;
|
||||||
|
|
||||||
in vec4 a_color;
|
in vec4 a_torchLight;
|
||||||
|
in vec3 a_skyLight;
|
||||||
in vec2 a_texCoord;
|
in vec2 a_texCoord;
|
||||||
in float a_fog;
|
in float a_fog;
|
||||||
in vec3 a_position;
|
in vec3 a_position;
|
||||||
@ -31,7 +32,7 @@ void main() {
|
|||||||
float shadow = calc_shadow();
|
float shadow = calc_shadow();
|
||||||
vec3 fogColor = texture(u_skybox, a_dir).rgb;
|
vec3 fogColor = texture(u_skybox, a_dir).rgb;
|
||||||
vec4 texColor = texture(u_texture0, a_texCoord);
|
vec4 texColor = texture(u_texture0, a_texCoord);
|
||||||
float alpha = a_color.a * texColor.a;
|
float alpha = texColor.a;
|
||||||
if (u_alphaClip) {
|
if (u_alphaClip) {
|
||||||
if (alpha < 0.2f)
|
if (alpha < 0.2f)
|
||||||
discard;
|
discard;
|
||||||
@ -45,8 +46,8 @@ void main() {
|
|||||||
else if (u_debugNormals) {
|
else if (u_debugNormals) {
|
||||||
texColor.rgb *= a_normal * 0.5 + 0.5;
|
texColor.rgb *= a_normal * 0.5 + 0.5;
|
||||||
}
|
}
|
||||||
f_color = a_color * texColor;
|
f_color = texColor;
|
||||||
f_color.rgb *= shadow;
|
f_color.rgb *= min(vec3(1.0), a_torchLight.rgb + a_skyLight * shadow);
|
||||||
f_color = mix(f_color, vec4(fogColor, 1.0), a_fog);
|
f_color = mix(f_color, vec4(fogColor, 1.0), a_fog);
|
||||||
f_color.a = alpha;
|
f_color.a = alpha;
|
||||||
f_position = vec4(a_position, 1.0);
|
f_position = vec4(a_position, 1.0);
|
||||||
|
|||||||
@ -12,7 +12,8 @@ out vec3 a_dir;
|
|||||||
out vec3 a_normal;
|
out vec3 a_normal;
|
||||||
out vec3 a_position;
|
out vec3 a_position;
|
||||||
out vec3 a_realnormal;
|
out vec3 a_realnormal;
|
||||||
out vec4 a_color;
|
out vec4 a_torchLight;
|
||||||
|
out vec3 a_skyLight;
|
||||||
out vec4 a_modelpos;
|
out vec4 a_modelpos;
|
||||||
|
|
||||||
uniform mat4 u_model;
|
uniform mat4 u_model;
|
||||||
@ -38,13 +39,14 @@ void main() {
|
|||||||
|
|
||||||
vec3 light = v_light.rgb;
|
vec3 light = v_light.rgb;
|
||||||
float torchlight = calc_torch_light(a_modelpos.xyz);
|
float torchlight = calc_torch_light(a_modelpos.xyz);
|
||||||
light += torchlight * u_torchlightColor;
|
a_torchLight = vec4(pow(light + torchlight * u_torchlightColor, vec3(u_gamma)), 1.0f);
|
||||||
a_color = vec4(pow(light, vec3(u_gamma)),1.0f);
|
|
||||||
a_texCoord = v_texCoord;
|
a_texCoord = v_texCoord;
|
||||||
|
|
||||||
a_dir = a_modelpos.xyz - u_cameraPos;
|
a_dir = a_modelpos.xyz - u_cameraPos;
|
||||||
vec3 skyLightColor = pick_sky_color(u_skybox);
|
vec3 skyLightColor = pick_sky_color(u_skybox);
|
||||||
a_color.rgb = max(a_color.rgb, skyLightColor.rgb*v_light.a);
|
a_skyLight = skyLightColor.rgb*v_light.a;
|
||||||
|
//a_color.rgb = max(a_color.rgb, skyLightColor.rgb*v_light.a);
|
||||||
|
|
||||||
a_distance = length(u_view * u_model * vec4(pos3d * FOG_POS_SCALE, 0.0));
|
a_distance = length(u_view * u_model * vec4(pos3d * FOG_POS_SCALE, 0.0));
|
||||||
a_fog = calc_fog(a_distance / 256.0);
|
a_fog = calc_fog(a_distance / 256.0);
|
||||||
|
|||||||
@ -72,6 +72,7 @@ void PostProcessing::use(DrawContext& context, bool gbufferPipeline) {
|
|||||||
}
|
}
|
||||||
context.setFramebuffer(gbuffer.get());
|
context.setFramebuffer(gbuffer.get());
|
||||||
} else {
|
} else {
|
||||||
|
gbuffer.reset();
|
||||||
refreshFbos(vp.x, vp.y);
|
refreshFbos(vp.x, vp.y);
|
||||||
context.setFramebuffer(fbo.get());
|
context.setFramebuffer(fbo.get());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -182,6 +182,34 @@ const Mesh<ChunkVertex>* ChunksRenderer::retrieveChunk(
|
|||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChunksRenderer::drawChunksShadowsPass(
|
||||||
|
const Camera& camera, Shader& shader
|
||||||
|
) {
|
||||||
|
const auto& atlas = assets.require<Atlas>("blocks");
|
||||||
|
|
||||||
|
atlas.getTexture()->bind();
|
||||||
|
|
||||||
|
for (int i = indices.size()-1; i >= 0; i--) {
|
||||||
|
auto& chunk = chunks.getChunks()[indices[i].index];
|
||||||
|
if (chunk == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const auto& found = meshes.find({chunk->x, chunk->z});
|
||||||
|
if (found == meshes.end()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto mesh = found->second.mesh.get();
|
||||||
|
if (mesh) {
|
||||||
|
glm::vec3 coord(
|
||||||
|
chunk->x * CHUNK_W + 0.5f, 0.5f, chunk->z * CHUNK_D + 0.5f
|
||||||
|
);
|
||||||
|
glm::mat4 model = glm::translate(glm::mat4(1.0f), coord);
|
||||||
|
shader.uniformMatrix("u_model", model);
|
||||||
|
mesh->draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ChunksRenderer::drawChunks(
|
void ChunksRenderer::drawChunks(
|
||||||
const Camera& camera, Shader& shader
|
const Camera& camera, Shader& shader
|
||||||
) {
|
) {
|
||||||
|
|||||||
@ -72,6 +72,9 @@ public:
|
|||||||
const Mesh<ChunkVertex>* getOrRender(
|
const Mesh<ChunkVertex>* getOrRender(
|
||||||
const std::shared_ptr<Chunk>& chunk, bool important
|
const std::shared_ptr<Chunk>& chunk, bool important
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void drawChunksShadowsPass(const Camera& camera, Shader& shader);
|
||||||
|
|
||||||
void drawChunks(const Camera& camera, Shader& shader);
|
void drawChunks(const Camera& camera, Shader& shader);
|
||||||
|
|
||||||
void drawSortedMeshes(const Camera& camera, Shader& shader);
|
void drawSortedMeshes(const Camera& camera, Shader& shader);
|
||||||
|
|||||||
@ -103,7 +103,7 @@ WorldRenderer::WorldRenderer(
|
|||||||
assets->require<Shader>("skybox_gen")
|
assets->require<Shader>("skybox_gen")
|
||||||
);
|
);
|
||||||
|
|
||||||
shadowMap = std::make_unique<ShadowMap>(1024 * 4);
|
shadowMap = std::make_unique<ShadowMap>(1024 * 8);
|
||||||
|
|
||||||
shadowCamera = std::make_unique<Camera>();
|
shadowCamera = std::make_unique<Camera>();
|
||||||
}
|
}
|
||||||
@ -133,9 +133,9 @@ void WorldRenderer::setupWorldShader(
|
|||||||
shader.uniform2f("u_lightDir", skybox->getLightDir());
|
shader.uniform2f("u_lightDir", skybox->getLightDir());
|
||||||
shader.uniform3f("u_cameraPos", camera.position);
|
shader.uniform3f("u_cameraPos", camera.position);
|
||||||
shader.uniform1i("u_skybox", 1);
|
shader.uniform1i("u_skybox", 1);
|
||||||
shader.uniform1i("u_enableShadows", gbufferPipeline);
|
shader.uniform1i("u_enableShadows", shadows);
|
||||||
|
|
||||||
if (gbufferPipeline) {
|
if (shadows) {
|
||||||
shader.uniformMatrix("u_shadowsMatrix", shadowCamera->getProjView());
|
shader.uniformMatrix("u_shadowsMatrix", shadowCamera->getProjView());
|
||||||
shader.uniform3f("u_sunDir", shadowCamera->front);
|
shader.uniform3f("u_sunDir", shadowCamera->front);
|
||||||
shader.uniform1i("u_shadowsRes", shadowMap->getResolution());
|
shader.uniform1i("u_shadowsRes", shadowMap->getResolution());
|
||||||
@ -374,7 +374,7 @@ void WorldRenderer::draw(
|
|||||||
auto& linesShader = assets.require<Shader>("lines");
|
auto& linesShader = assets.require<Shader>("lines");
|
||||||
auto& shadowsShader = assets.require<Shader>("shadows");
|
auto& shadowsShader = assets.require<Shader>("shadows");
|
||||||
|
|
||||||
if (gbufferPipeline) {
|
if (shadows) {
|
||||||
int resolution = shadowMap->getResolution();
|
int resolution = shadowMap->getResolution();
|
||||||
float shadowMapScale = 0.05f;
|
float shadowMapScale = 0.05f;
|
||||||
float shadowMapSize = resolution * shadowMapScale;
|
float shadowMapSize = resolution * shadowMapScale;
|
||||||
@ -384,7 +384,7 @@ void WorldRenderer::draw(
|
|||||||
shadowCamera->perspective = false;
|
shadowCamera->perspective = false;
|
||||||
shadowCamera->setAspectRatio(1.0f);
|
shadowCamera->setAspectRatio(1.0f);
|
||||||
shadowCamera->rotate(
|
shadowCamera->rotate(
|
||||||
glm::radians(90.0f - worldInfo.daytime * 360.0f),
|
glm::radians(fmod(90.0f - worldInfo.daytime * 360.0f, 180.0f)),
|
||||||
glm::radians(-40.0f),
|
glm::radians(-40.0f),
|
||||||
glm::radians(-0.0f)
|
glm::radians(-0.0f)
|
||||||
);
|
);
|
||||||
@ -402,7 +402,7 @@ void WorldRenderer::draw(
|
|||||||
sctx.setViewport({resolution, resolution});
|
sctx.setViewport({resolution, resolution});
|
||||||
shadowMap->bind();
|
shadowMap->bind();
|
||||||
setupWorldShader(shadowsShader, *shadowCamera, settings, 0.0f);
|
setupWorldShader(shadowsShader, *shadowCamera, settings, 0.0f);
|
||||||
chunks->drawChunks(*shadowCamera, shadowsShader);
|
chunks->drawChunksShadowsPass(*shadowCamera, shadowsShader);
|
||||||
shadowMap->unbind();
|
shadowMap->unbind();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -444,7 +444,7 @@ void WorldRenderer::draw(
|
|||||||
assets,
|
assets,
|
||||||
timer,
|
timer,
|
||||||
camera,
|
camera,
|
||||||
gbufferPipeline ? shadowMap->getDepthMap() : 0
|
shadows ? shadowMap->getDepthMap() : 0
|
||||||
);
|
);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|||||||
@ -54,7 +54,8 @@ class WorldRenderer {
|
|||||||
float timer = 0.0f;
|
float timer = 0.0f;
|
||||||
bool debug = false;
|
bool debug = false;
|
||||||
bool lightsDebug = false;
|
bool lightsDebug = false;
|
||||||
bool gbufferPipeline = true;
|
bool gbufferPipeline = false;
|
||||||
|
bool shadows = true;
|
||||||
|
|
||||||
/// @brief Render block selection lines
|
/// @brief Render block selection lines
|
||||||
void renderBlockSelection();
|
void renderBlockSelection();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user