git-svn-id: svn://db.shs.com.ru/libs@701 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-12-13 23:15:59 +00:00
parent cac73a63f1
commit 2136b4d30b
22 changed files with 653 additions and 671 deletions

View File

@@ -89,6 +89,7 @@ void Renderer::init(int width, int height) {
tone_proc.init();
initQuad(quad);
initTextureArrays();
initCoeffTextures();
need_init_shaders = true;
}
@@ -155,6 +156,8 @@ void Renderer::initShaders() {
if (!bindShader(roles[p], &prog)) continue;
for (int i = 0; i < 5; ++i)
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
//prog->setUniformValue("tex_coeffs[0]", (int)Renderer::dbrBuffersCount);
//prog->setUniformValue("tex_coeffs[1]", (int)Renderer::dbrBuffersCount+1);
}
if (bindShader(srFinalPass, &prog)) {
prog->setUniformValue("tex_g1" , 0);
@@ -226,17 +229,26 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
}
void Renderer::renderLight(int first_wr_buff) {
void Renderer::renderLight(int first_wr_buff, bool clear_only) {
QOpenGLShaderProgram * prog = 0;
Camera * cam = view->camera();
for (int i = 0; i < 2; ++i) {
view->glActiveTexture(GL_TEXTURE0 + Renderer::dbrBuffersCount + i);
view->glBindTexture(GL_TEXTURE_2D, tex_coeff[i]);
}
fbo_ds.bindColorTextures();
fbo_out.bind();
//int ri = 1, wi = 0;
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
QVector<PassPair> passes;
passes << PassPair(srLightOmniPass, Light::Omni) << PassPair(srLightSpotPass, Light::Cone);
QColor back = view->fogColor_;
back.setAlpha(0);
foreach (PassPair pass, passes) {
if (bindShader(pass.first, &prog)) {
fbo_out.setWriteBuffer(first_wr_buff + pass.second);
glClearFramebuffer(back, false);
if (clear_only) continue;
setUniformCamera(prog, cam);
setUniformViewCorners(prog, cam);
prog->setUniformValue("lights_start", lights_start[pass.second]);
@@ -244,8 +256,6 @@ void Renderer::renderLight(int first_wr_buff) {
prog->setUniformValue("fog_color", view->fogColor_);
prog->setUniformValue("fog_decay", qMax(view->fogDecay_, 0.001f));
prog->setUniformValue("fog_density", view->fogDensity_);
fbo_out.setWriteBuffer(first_wr_buff + pass.second);
glClearFramebuffer(Qt::black, false);
renderQuad(prog, quad, cam);
}
}
@@ -307,7 +317,7 @@ void Renderer::renderScene() {
fbo_ds.release();
/// lighting passes
renderLight(obrSolidOmni);
renderLight(obrSolidOmni, scene.geometries_used[rpSolid].isEmpty());
/// transparent geometry pass
fbo_ds.bind();
@@ -319,7 +329,7 @@ void Renderer::renderScene() {
fbo_ds.release();
/// lighting passes
renderLight(obrTransparentOmni);
renderLight(obrTransparentOmni, scene.geometries_used[rpTransparent].isEmpty());
/// blending layers
if (bindShader(srFinalPass, &prog)) {