spot light map

This commit is contained in:
2023-02-14 10:43:51 +03:00
parent 36540468dc
commit 12695983d2
13 changed files with 119 additions and 62 deletions

View File

@@ -164,14 +164,10 @@ bool Renderer::bindShader(QOpenGLShaderProgram * sp) {
void Renderer::initShaders() {
if (!need_init_shaders) return;
need_init_shaders = false;
need_init_shaders = false;
// initUniformBuffer(shaders.value(srGeometrySolidPass), &buffer_materials, bpMaterials, "QGLMaterialData");
// initUniformBuffer(shaders.value(srGeometryTransparentPass), &buffer_materials, bpMaterials, "QGLMaterialData");
// initUniformBuffer(shaders.value(srShadowPass), &buffer_materials, bpMaterials, "QGLMaterialData");
QVector<GLuint> samplers;
samplers.resize(16);
for (int i = 0; i < samplers.size(); ++i)
samplers[i] = mtShadowCone + i;
QOpenGLShaderProgram * prog = 0;
for (ShaderRole role: {srLightOmniPass, srLightSpotPass}) {
if (!bindShader(role, &prog)) continue;
@@ -182,6 +178,7 @@ void Renderer::initShaders() {
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
prog->setUniformValue("tex_coeffs[0]", (int)Renderer::dbrBuffersCount);
prog->setUniformValue("tex_env", (int)Renderer::dbrBuffersCount + 1);
setUniformMaps(prog);
prog->setUniformValue("tex_shadows_cone", (int)tarShadowsCone);
}
if (bindShader(srFinalPass, &prog)) {
@@ -386,7 +383,7 @@ void Renderer::renderScene() {
}
phase.end();
/// shadows
/// shadows and shadow matrix
phase.begin("shadows");
if (bindShader(srShadowPass, &prog)) {
glEnableDepth();
@@ -399,8 +396,7 @@ void Renderer::renderScene() {
mat_vp.scale(0.5, 0.5);
mat_vp.translate(1, 1);
for (int i = 0; i < cone_ll.size(); ++i) {
Light * l = cone_ll[i];
if (!l->isCastShadows()) continue;
Light * l = cone_ll[i];
QMatrix4x4 pm = glMatrixPerspective(l->angle_end, 1., 0.1), om, vm;
om.translate(-l->worldAim());
vm.translate(0., 0., -l->distance());
@@ -409,8 +405,10 @@ void Renderer::renderScene() {
pmat(0, 3) = pmat(1, 3) = pmat(2, 3) = 0.;
vm *= pmat.inverted();
auto vpm = pm * (vm * om);
prog->setUniformValue("qgl_ViewProjMatrix", vpm);
renderShadow(i, l);
if (l->isCastShadows()) {
prog->setUniformValue("qgl_ViewProjMatrix", vpm);
renderShadow(i, l);
}
l->shadow_matrix = mat_vp * vpm * cam_ivm;
}
}