soft shadows optimization

This commit is contained in:
2023-02-22 15:48:50 +03:00
parent 91bc31e7db
commit 7455a7341c
6 changed files with 58 additions and 40 deletions

View File

@@ -118,6 +118,8 @@ void Renderer::init(int width, int height) {
textures_empty.reinit();
shadow_maps_cone.reinit();
shadow_maps_omni.reinit();
depth_maps_cone.reinit();
depth_maps_omni.reinit();
resize(width, height);
rend_mat.init(width, height);
rend_service.init(width, height);
@@ -152,7 +154,7 @@ void Renderer::reloadShaders() {
shader_fxaa = nullptr;
if (tone_proc.shader_sum) delete tone_proc.shader_sum;
tone_proc.shader_sum = nullptr;
QString dir = ":/shaders/";
QString dir = "./shaders/";
while (it.hasNext()) {
it.next();
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()));
@@ -207,7 +209,6 @@ void Renderer::initShaders() {
prog->setUniformValue("tex_env", (int)Renderer::dbrBuffersCount + 1);
prog->setUniformValue("tex_noise", (int)Renderer::dbrBuffersCount + 2);
setUniformMaps(prog);
prog->setUniformValue("tex_shadows_cone", (int)tarShadowsCone);
}
if (bindShader(srFinalPass, &prog)) {
prog->setUniformValue("tex_g1", 0);
@@ -345,12 +346,12 @@ void Renderer::renderLight(int first_wr_buff, bool clear_only) {
prog->setUniformValue("view_mat", cam->viewMatrix().inverted().toGenericMatrix<3, 3>());
prog->setUniformValue("shadow_size", view->shadow_map_size);
prog->setUniformValue("noise_size", noise_size);
prog->setUniformValue("tex_shadows_cone", (int)tarShadowsCone);
prog->setUniformValue("tex_shadows_omni", (int)tarShadowsOmni);
prog->setUniformValue("tex_depths_cone", (int)tarShadowsCone);
prog->setUniformValue("tex_depths_omni", (int)tarShadowsOmni);
prog->setUniformValue("soft_shadows_enabled", view->soft_shadows);
prog->setUniformValue("soft_shadows_samples", view->soft_shadows_samples);
prog->setUniformValue("tex_shadows_cone", (int)tarShadowsCone);
prog->setUniformValue("tex_shadows_omni", (int)tarShadowsOmni);
prog->setUniformValue("tex_depths_cone", (int)tarDepthsCone);
prog->setUniformValue("tex_depths_omni", (int)tarDepthsOmni);
GLenum filter = view->softShadows() ? GL_NEAREST : GL_LINEAR;
shadow_maps_cone.bind(view, tarShadowsCone);
view->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, filter);
@@ -358,6 +359,8 @@ void Renderer::renderLight(int first_wr_buff, bool clear_only) {
shadow_maps_omni.bind(view, tarShadowsOmni);
view->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, filter);
view->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, filter);
depth_maps_cone.bind(view, tarDepthsCone);
depth_maps_omni.bind(view, tarDepthsOmni);
renderQuad(prog, quad, cam);
}
}
@@ -378,6 +381,7 @@ void Renderer::renderConeShadows() {
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
}
depth_maps_cone.resize(f, view->shadow_map_size, cone_ll.size());
for (int i = 0; i < cone_ll.size(); ++i) {
Light * l = cone_ll[i];
QMatrix4x4 pm = glMatrixPerspective(l->angle_end, 1., 0.1), om, vm;
@@ -407,12 +411,10 @@ void Renderer::renderOmniShadows() {
textures_maps.bind(f, tarMaps);
auto omni_ll = cur_lights.value(Light::Omni);
if (shadow_maps_omni.resize(f, view->shadow_map_size, omni_ll.size())) {
// f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
// f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
}
depth_maps_omni.resize(f, view->shadow_map_size, omni_ll.size());
for (int i = 0; i < omni_ll.size(); ++i) {
Light * l = omni_ll[i];
QMatrix4x4 om;
@@ -439,8 +441,8 @@ void Renderer::renderConeShadow(int index, Light * light) {
light->shadow_map.bind();
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadow_maps_cone.ID(), 0, index);
// glDrawBuffer(GL_COLOR_ATTACHMENT0);
// glClearDepth(0.);
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, depth_maps_cone.ID(), 0, index);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glClearFramebuffer();
renderObjects(scene, rpSolid);
light->shadow_map.release();
@@ -460,8 +462,8 @@ void Renderer::renderOmniShadow(int index, Light * light, QOpenGLShaderProgram *
for (int i = 0; i < 6; ++i) {
QMatrix4x4 vm = mat_proj_90 * mat_faces[i] * om;
prog->setUniformValue("qgl_ViewProjMatrix", vm);
int buff_ind = GL_COLOR_ATTACHMENT0 + i;
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadow_maps_omni.ID(), 0, index * 6 + i);
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, depth_maps_omni.ID(), 0, index * 6 + i);
// static GLenum faces[6] = {GL_COLOR_ATTACHMENT0,
// GL_COLOR_ATTACHMENT1,
// GL_COLOR_ATTACHMENT2,
@@ -469,7 +471,7 @@ void Renderer::renderOmniShadow(int index, Light * light, QOpenGLShaderProgram *
// GL_COLOR_ATTACHMENT4,
// GL_COLOR_ATTACHMENT5};
// view->glDrawBuffers(6, faces);
// glDrawBuffer(buff_ind);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glClearFramebuffer();
renderObjects(scene, rpSolid);
}
@@ -676,6 +678,8 @@ void Renderer::renderScene() {
tprog->bind();
tprog->setUniformValue("tex_cone", (int)tarShadowsCone);
tprog->setUniformValue("tex_omni", (int)tarShadowsOmni);
tprog->setUniformValue("dep_cone", (int)tarDepthsCone);
tprog->setUniformValue("dep_omni", (int)tarDepthsOmni);
QMatrix4x4 mat;
double sz = 0.33;
mat.translate(sz - 1, sz - 1);
@@ -686,8 +690,10 @@ void Renderer::renderScene() {
tprog->bind();
shadow_maps_cone.bind(f, tarShadowsCone);
shadow_maps_omni.bind(f, tarShadowsOmni);
depth_maps_cone.bind(f, tarDepthsCone);
depth_maps_omni.bind(f, tarDepthsOmni);
quad->draw(f, 1);
*/
*/
}