Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Problem with shadows OpenGL

Problem with shadows OpenGL

Scheduled Pinned Locked Moved Solved General and Desktop
2 Posts 1 Posters 294 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    JesusM
    wrote on last edited by
    #1

    Hi, I am trying to add shadow to my scene and I am having problems when I have more than 1 light with shadows.
    What happen is that sometimes it paint only 1 shadow and sometimes it paints the saame shadow twice and a bit moved.
    Now I am using 2 lights.
    This is my code for generating shadow maps:

    for( auto l : luces)
                    { // - Para cada fuente luminosa
                        if (l->getCastShadow() && l->getNeedRecalcShadow())
                        {
                            if(l->getTipo() == PUNTUAL)
                            {
                               l->setLookAtSombra(QVector3D(camaras[camaraActiva].getLookAt()));
                            }
                            // - Calcular la matriz de visión y proyección para la luz lightVPMat
                            l->calcularVPMatrix();
                            QMatrix4x4 vpMatrixLuz = l->getVPMatrix();
    
                            glwindow::getInstance()->makeCurrent();
                            glBindFramebuffer(GL_FRAMEBUFFER, l->getShadowFBO2());
                            glActiveTexture(GL_TEXTURE2);
                            glBindTexture(GL_TEXTURE_2D, l->getDepthText());
                            glClear(GL_DEPTH_BUFFER_BIT);
                            glViewport(0, 0, l->getShadowMapWidth(), l->getShadowMapHeight());
                            glEnable(GL_DEPTH_TEST);
                            glDepthFunc(GL_LESS);
                            glEnable(GL_PRIMITIVE_RESTART);
                            glPrimitiveRestartIndex(FINAL);
                            glEnable(GL_CULL_FACE);
                            glCullFace(GL_FRONT);
    
                            for( auto o : objetosEscena)
                            {
                                if (modoTextura)
                                {
    
                                    QMatrix4x4 lightMVP = vpMatrixLuz * o.second->getModelMatrix();
                                    shaderGenerarSombras->use();
                                    shaderGenerarSombras->setUniform("mvpMatrixLuz", lightMVP);
                                    o.second->drawAsTriangles(shaderGenerarSombras,modelMatrix,l->getVisionMatrixLuz(),l->getProyectionMatrixLuz());
    
                                 }
    
                            }
                            GLubyte *pixels;
                            pixels = (GLubyte *)malloc(512*512*4);
                            glReadPixels(0, 0, 512, 512, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);
                            QImage image = QImage(pixels, 512, 512, QImage::Format_Grayscale8);
                            image = image.mirrored();
                            QString str = "Mapa"+QString::number(cont)+".png";
                            cont++;
                            bool resul = image.save(str, "PNG");
                            l->setNeedRecalcShadow(false);
    
                        }
                    }
    

    and this is the code to paint shadows:

    glBindFramebuffer(GL_FRAMEBUFFER, glwindow::getInstance()->defaultFramebufferObject());
                glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
                glEnable(GL_MULTISAMPLE);
                glEnable(GL_DEPTH_TEST);
                glPrimitiveRestartIndex(FINAL);
                glEnable(GL_PRIMITIVE_RESTART);
                glEnable(GL_BLEND);
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                glEnable(GL_CULL_FACE);
                glCullFace(GL_BACK);
                glViewport(0, 0, width, height);
                glDepthFunc(GL_LEQUAL);
    for( auto l : luces)
                    { // - Para cada fuente luminosa
                        if (l->getCastShadow())
                        {
    
                            LightTypes tipo = l->getTipo();
                            if (tipo != AMBIENTAL)
                            {
                                if (primero)
                                {
                                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                                    primero = false;
                                }
                                else
                                {
                                    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
                                }
    
                                shaderProgram* shader = shadersLuzSombras.find(tipo)->second;
                                l->setVisionMatrix(visionMatrix);
                                l->aplicar(shader);
                                shader->use();
                                if(atenuacionEnabled)
                                {
                                    shader->setUniform("atenuacionEnabled",1);
                                    shader->setUniform("c1",c1);
                                    shader->setUniform("c2",c2);
                                    shader->setUniform("c3",c3);
                                }else
                                {
                                    shader->setUniform("atenuacionEnabled",0);
                                }
                                if(fogEnabled && l->getKeyLight())
                                {
                                    shader->setUniform("fogEnabled",1);
                                    shader->setUniform("zMin",this->zMin);
                                    shader->setUniform("zMax", this->zMax);
    
                                }else
                                {
                                    shader->setUniform("fogEnabled",0);
                                }
                                luzAmbiental->aplicar(shader);
                                glActiveTexture(2);
                                glBindTexture(GL_TEXTURE_2D, l->getDepthText());
                                QMatrix4x4 vpMatrixLuz = l->getVPMatrix();
                                QMatrix4x4 lightViewProjMatrix = shadowBias * vpMatrixLuz;
                                for( auto o : objetosEscena)
                                {
                                    QMatrix4x4 lightMVP = lightViewProjMatrix * o.second->getModelMatrix();
                                    shader->use();
                                    shader->setUniform("shadowMap", 2);
                                    shader->setUniform("mShadowMatrix",lightMVP);
                                    shader->setUniform("shadowMin",0.1f);
                                    o.second->drawAsTriangles(shader,modelMatrix,visionMatrix,proyectionMatrix);
    
                                }
    
                            }
    
                        }
    
    
                    }
    

    I was debbuging and the texture id are different and it coincides with the id where the shadow map are saved.
    I leave you here the shadow maps:
    1_1563810110579_Mapa1.png 0_1563810110579_Mapa0.png

    and this is the result:
    0_1563810124544_Captura.PNG

    Thanks.

    1 Reply Last reply
    0
    • J Offline
      J Offline
      JesusM
      wrote on last edited by
      #2

      I found the solution, I don't know why but I had to create a QOpenGLTexture with my texture and then bind that QOpenGLTexture. I don't know why it doesn't work with glActiveTexture() and glBindTexture().

      1 Reply Last reply
      1

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved