spot light map
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user