IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Comment faire du shadow mapping sans shader?


Sujet :

OpenGL

  1. #1
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut Comment faire du shadow mapping sans shader?
    Salut,

    Le titre me semble assez explicite lol. En fait, j'ai une carte graphique intel Q965 qui ne supporte pas les shader et j'aimerais faire du shadow mapping. J'ai effectué un render to texture pour recupérer le depth buffer dans une texture. Mais ensuite, je n'arrive pas à transformer ma texture et à la plaquer sur le sol.

    Voici le code:

    Initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    GLuint TextureId;
    format=GL_DEPTH_COMPONENT;
    texture_width=512;
    texture_height=512
     
    // create a texture object
        glGenTextures(1, &TextureId);
        glBindTexture(GL_TEXTURE_2D, TextureId);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
        glTexImage2D(GL_TEXTURE_2D, 0, format, texture_width, texture_height, 0, format, GL_UNSIGNED_BYTE, 0);
        glBindTexture(GL_TEXTURE_2D, 0);
    Boucle de jeu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    ViewportPositionX=0;
    ViewportPositionY=0;
    ViewportWidth=512;
    ViewportHeight=512;
    Fovy=60.0;
    Aspect=512/512;
    ZNear=1.0;
    ZFar=100.0;
    RealTextureWidth=512;
    RealTextureHeight=512;
     
    glViewport(ViewportPositionX, ViewportPositionY, ViewportWidth, ViewportHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(Fovy, Aspect, ZNear, ZFar);
    	glClearColor(1, 1, 1, 1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
    	gluLookAt(Light->GetPositionX(),Light->GetPositionY(),Light->GetPositionZ(),Light->GetTargetX(),Light->GetTargetY(),Light->GetTargetZ(),Light->GetUpVector().x,Light->GetUpVector().y,Light->GetUpVector().z);
     
        glPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT); // for GL_DRAW_BUFFER and GL_READ_BUFFER
        glDrawBuffer(GL_BACK);
        glReadBuffer(GL_BACK);
     
        DrawScene();
     
    glEnable(GL_TEXTURE_2D);
     
    	// copy the framebuffer pixels to a texture
        glBindTexture(GL_TEXTURE_2D, TextureId);
        glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, RealTextureWidth, RealTextureHeight);
        glBindTexture(GL_TEXTURE_2D, 0);
    	glDisable(GL_TEXTURE_2D);
     
    	glPopAttrib();
     
    	// back to normal viewport and projection matrix
    	glViewport(0, 0, GSEApplication->GetSizeX(), GSEApplication->GetSizeY());
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    	gluPerspective(GSEApplication->GetVerticalAngle(), (float)(GSEApplication->GetSizeX())/GSEApplication->GetSizeY(), GSEApplication->GetDepthMinimumView(), GSEApplication->GetDepthMaximumView());
     
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
        // clear framebuffer
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     
    	gluLookAt(GSECamera->GetPositionX(),GSECamera->GetPositionY(),GSECamera->GetPositionZ(),GSECamera->GetTargetX(),GSECamera->GetTargetY(),GSECamera->GetTargetZ(),GSECamera->GetUpVector().x,GSECamera->GetUpVector().y,GSECamera->GetUpVector().z);
     
    DrawScene();
    Voila ce que j'obtient (Le quad blanc represente ma texture de profondeur):


    J'ai déjà fait plein de recherche pour des tutoriaux et des codes sur google. J'ai tenté d'adapter les codes sans succès.

    Donc j'aimerais savoir comment puis je plaquer ma texture sans shader?

    Merci

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    tu a tout ce qu'il fait ici :
    http://www.paulsprojects.net/tutorials/smt/smt.html
    en gros, si tu ne passe pas par un shader, tu doit mettre ta depth texture en mode projective avec la matrice de la lumière, et activer les paramètres de comparaison via une extension.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par bafman Voir le message
    tu a tout ce qu'il fait ici :
    http://www.paulsprojects.net/tutorials/smt/smt.html
    en gros, si tu ne passe pas par un shader, tu doit mettre ta depth texture en mode projective avec la matrice de la lumière, et activer les paramètres de comparaison via une extension.
    J'ai deja testé ce tuto. Mais non seulement la fin du code ne fonctionne pas bien mais en plus je ne comprends pas bien ce qui est fait à la fin du code. Je comprends ce que le bloc de ligne fait mais pas ce que chaque ligne fait.

    La partie que je ne comprends pas est celle là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    static MATRIX4X4 biasMatrix(0.5f, 0.0f, 0.0f, 0.0f,
    								0.0f, 0.5f, 0.0f, 0.0f,
    								0.0f, 0.0f, 0.5f, 0.0f,
    								0.5f, 0.5f, 0.5f, 1.0f);	//bias from [-1, 1] to [0, 1]
    	MATRIX4X4 textureMatrix=biasMatrix*lightProjectionMatrix*lightViewMatrix;
     
    	//Set up texture coordinate generation.
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
    	glEnable(GL_TEXTURE_GEN_S);
     
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
    	glEnable(GL_TEXTURE_GEN_T);
     
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
    	glEnable(GL_TEXTURE_GEN_R);
     
    	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
    	glEnable(GL_TEXTURE_GEN_Q);
     
    	//Bind & enable shadow map texture
    	glBindTexture(GL_TEXTURE_2D, shadowMapTexture);
    	glEnable(GL_TEXTURE_2D);
     
    	//Enable shadow comparison
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
     
    	//Shadow comparison should be true (ie not in shadow) if r<=texture
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
     
    	//Shadow comparison should generate an INTENSITY result
    	glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
     
    	//Set alpha test to discard false comparisons
    	glAlphaFunc(GL_GEQUAL, 0.99f);
    	glEnable(GL_ALPHA_TEST);
     
    	DrawScene(angle);
     
    	//Disable textures and texgen
    	glDisable(GL_TEXTURE_2D);
     
    	glDisable(GL_TEXTURE_GEN_S);
    	glDisable(GL_TEXTURE_GEN_T);
    	glDisable(GL_TEXTURE_GEN_R);
    	glDisable(GL_TEXTURE_GEN_Q);
     
    	//Restore other states
    	glDisable(GL_LIGHTING);
    	glDisable(GL_ALPHA_TEST);

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    notes que ta texture de profondeur doit être générée depuis le point de vue de la lumière (tu positionne ta caméra à la position de la source lumineuse qui génère l'ombre)

    ce qui ne semble pas être le cas sur ta capture, à moins que ce soit par hasard ou par défaut que ta lumière est à la même position que ta caméra ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    notes que ta texture de profondeur doit être générée depuis le point de vue de la lumière (tu positionne ta caméra à la position de la source lumineuse qui génère l'ombre)

    ce qui ne semble pas être le cas sur ta capture, à moins que ce soit par hasard ou par défaut que ta lumière est à la même position que ta caméra ?
    C'est par défaut. J'ai supposé que ma lumière était attaché à ma caméra. C'est juste par flemme de me trimbaler les 4 matrices nécessaires. En supposant ca je réduit à 2 et je valide l'implémentation.

    Est ce un cas particulier ou l'algo doit tout de meme fonctionner si la position de la lumiere = la position de la camera?

  6. #6
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Pour info, voila ce que j'ai quand j'intègre le code du tutorial de paul project (le modèle est animé):



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    static GSEMATRIX4X4 biasMatrix(0.5, 0.0f, 0.0f, 0.0f,
    								0.0f, 0.5, 0.0f, 0.0f,
    								0.0f, 0.0f, 0.5, 0.0f,
    								0.5, 0.5, 0.5, 1.0f);
     
    	GSEMATRIX4X4 textureMatrix=biasMatrix*cameraProjectionMatrix*cameraViewMatrix;
     
    	//Set up texture coordinate generation.
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
    	glEnable(GL_TEXTURE_GEN_S);
     
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
    	glEnable(GL_TEXTURE_GEN_T);
     
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
    	glEnable(GL_TEXTURE_GEN_R);
     
    	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
    	glEnable(GL_TEXTURE_GEN_Q);
     
    	//Bind & enable shadow map texture
    	glBindTexture(GL_TEXTURE_2D, TextureRenderer->GetTextureId());
    	glEnable(GL_TEXTURE_2D);
     
    	//Enable shadow comparison
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
     
    	//Shadow comparison should be true (ie not in shadow) if r<=texture
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
     
    	//Shadow comparison should generate an INTENSITY result
    	glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
     
    	//Set alpha test to discard false comparisons
    	glAlphaFunc(GL_GEQUAL, 0.99);
    	glEnable(GL_ALPHA_TEST);
     
    	DrawScene();
     
    	//Disable textures and texgen
    	glDisable(GL_TEXTURE_2D);
     
    	glDisable(GL_TEXTURE_GEN_S);
    	glDisable(GL_TEXTURE_GEN_T);
    	glDisable(GL_TEXTURE_GEN_R);
    	glDisable(GL_TEXTURE_GEN_Q);
     
    	//Restore other states
    	glDisable(GL_ALPHA_TEST);

  7. #7
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    Citation Envoyé par drcd Voir le message
    C'est par défaut. J'ai supposé que ma lumière était attaché à ma caméra. C'est juste par flemme de me trimbaler les 4 matrices nécessaires. En supposant ca je réduit à 2 et je valide l'implémentation.

    Est ce un cas particulier ou l'algo doit tout de meme fonctionner si la position de la lumiere = la position de la camera?
    si tu places toujours ta lumière à la même position que la caméra, tu ne verras jamais l'ombre puisqu'elle sera toujours projetée derrière le modèle
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    si tu places toujours ta lumière à la même position que la caméra, tu ne verras jamais l'ombre puisqu'elle sera toujours projetée derrière le modèle
    Cette fois la lumiere est à une position fixe (3.0,3.0,3.0) et ca ne change rien:


  9. #9
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    J'ai effectué quelques modifications sur le code. J'ai regardé pas mal de codes sources sur le net et ils utilisent tous ce qu'il y a dans mon code.

    Pour info, je remet un screenshot:



    Sur le screenshot on voit que la texture du perso est déformé. Donc le soucis ne viendrait il pas du calcul de la matrice de texture ou de la matrice de projection de la lumière ou de sa modelview? Comment puis je vérifier si mes matrices sont bonne?

    Voila le code correspondant au screenshot:

    Boucle de jeu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    GSEMATRIX4X4 cameraProjectionMatrix,cameraViewMatrix;
    	GSEMATRIX4X4 lightProjectionMatrix,lightViewMatrix;
     
    	TextureRenderer->Begin();
     
    	DrawScene(true);
     
    	TextureRenderer->End();
     
    	glGetFloatv(GL_PROJECTION_MATRIX, cameraProjectionMatrix);
    	glGetFloatv(GL_MODELVIEW_MATRIX, cameraViewMatrix);
     
    	lightProjectionMatrix=TextureRenderer->GetProjectionMatrix();
    	lightViewMatrix=TextureRenderer->GetModelViewMatrix();
     
    	Camera->GetKeyboardControl();
    	Camera->GetMouseControl();
    	Camera->Update();
     
    	//DrawScene(true);
     
    	static GSEMATRIX4X4 biasMatrix(0.5, 0.0f, 0.0f, 0.0f,
    								0.0f, 0.5, 0.0f, 0.0f,
    								0.0f, 0.0f, 0.5, 0.0f,
    								0.5, 0.5, 0.5, 1.0f);
     
    	GSEMATRIX4X4 textureMatrix=biasMatrix*lightProjectionMatrix*lightViewMatrix;
     
    	//Set up texture coordinate generation.
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
    	glEnable(GL_TEXTURE_GEN_S);
     
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
    	glEnable(GL_TEXTURE_GEN_T);
     
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
    	glEnable(GL_TEXTURE_GEN_R);
     
    	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
    	glEnable(GL_TEXTURE_GEN_Q);
     
    	//Bind & enable shadow map texture
    	glBindTexture(GL_TEXTURE_2D, TextureRenderer->GetTextureId());
    	glEnable(GL_TEXTURE_2D);
     
    	//Enable shadow comparison
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
     
    	//Shadow comparison should be true (ie not in shadow) if r<=texture
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
     
    	//Shadow comparison should generate an INTENSITY result
    	glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
     
    	//Set alpha test to discard false comparisons
    	glAlphaFunc(GL_GEQUAL, 0.99);
    	glEnable(GL_ALPHA_TEST);
     
    	DrawScene(true);
     
    	//Disable textures and texgen
    	glDisable(GL_TEXTURE_2D);
     
    	glDisable(GL_TEXTURE_GEN_S);
    	glDisable(GL_TEXTURE_GEN_T);
    	glDisable(GL_TEXTURE_GEN_R);
    	glDisable(GL_TEXTURE_GEN_Q);
     
    	//Restore other states
    	glDisable(GL_ALPHA_TEST);
    Code de TextureRenderer->Begin():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    glViewport(ViewportPositionX, ViewportPositionY, ViewportWidth, ViewportHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(Fovy, Aspect, ZNear, ZFar);
    	glGetFloatv(GL_PROJECTION_MATRIX, ProjectionMatrix);
    	glClearColor(1, 1, 1, 1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
    //Camera->GetPosition() représente la position de la lumiere et non pas la position réelle de la caméra que l'utilisateur controle	gluLookAt(Camera->GetPositionX(),Camera->GetPositionY(),Camera->GetPositionZ(),Camera->GetTargetX(),Camera->GetTargetY(),Camera->GetTargetZ(),Camera->GetUpVector().x,Camera->GetUpVector().y,Camera->GetUpVector().z);
    	glGetFloatv(GL_MODELVIEW_MATRIX, ModelViewMatrix);
     
        glPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT); // for GL_DRAW_BUFFER and GL_READ_BUFFER
        glDrawBuffer(GL_BACK);
        glReadBuffer(GL_BACK);
    TextureRenderer->End():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    glEnable(GL_TEXTURE_2D);
     
    	// copy the framebuffer pixels to a texture
        glBindTexture(GL_TEXTURE_2D, TextureId);
        glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, RealTextureWidth, RealTextureHeight);
        glBindTexture(GL_TEXTURE_2D, 0);
    	glDisable(GL_TEXTURE_2D);
     
    	glPopAttrib();
     
    	// back to normal viewport and projection matrix
    	glViewport(0, 0, GSEApplication->GetSizeX(), GSEApplication->GetSizeY());
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    	gluPerspective(GSEApplication->GetVerticalAngle(), (float)(GSEApplication->GetSizeX())/GSEApplication->GetSizeY(), GSEApplication->GetDepthMinimumView(), GSEApplication->GetDepthMaximumView());
     
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
        // clear framebuffer
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     
    //GSECamera représente la caméra que l'utilisateur controle	gluLookAt(GSECamera->GetPositionX(),GSECamera->GetPositionY(),GSECamera->GetPositionZ(),GSECamera->GetTargetX(),GSECamera->GetTargetY(),GSECamera->GetTargetZ(),GSECamera->GetUpVector().x,GSECamera->GetUpVector().y,GSECamera->GetUpVector().z);

  10. #10
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    A priori c'est bon j'ai réussi à plaquer mon ombre sur le sol. Il me reste 2 petits soucis (voir screenshot et cliquer sur l'image pour la voir en grand):



    Au niveau du cercle vert, la texture du perso n'est pas bien plaquée.
    Au niveau du cercle rouge, le sol apparait un peu comme si j'etais en GL_POINT alors que mon sol est un glutSolidCube.

  11. #11
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    salut, je vois que tu sembles t'en sortir

    Citation Envoyé par drcd Voir le message
    Au niveau du cercle vert, la texture du perso n'est pas bien plaquée.
    ce problème ne semble pas lié à la projection de l'ombre mais à la modélisation de ton personnage non ?

    Citation Envoyé par drcd Voir le message
    Au niveau du cercle rouge, le sol apparait un peu comme si j'etais en GL_POINT alors que mon sol est un glutSolidCube.
    ça ne serait pas un problème de précision ?
    ta texture d'ombre, tu ne l'afficherais pas en 2 passes ?
    si c'est le cas, regardes du côté du polygon offset voir si ça peux arranger ton problème qui, je pense, est lié au "z fighting"
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  12. #12
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    salut, je vois que tu sembles t'en sortir


    ce problème ne semble pas lié à la projection de l'ombre mais à la modélisation de ton personnage non ?
    Je ne sais pas. Je n'y connais pas grand chose en modélisation 3D. Le perso est un modèle md2 de quake2 téléchargé sur un site de mod. D'après les tests que j'ai fais c'est lié à la génération automatique des coordonnées de texture car quand je retire les 4 lignes suivante de mon code, mon pesro est bien texturé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //Set up texture coordinate generation.
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
    	glEnable(GL_TEXTURE_GEN_S);
     
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
    	glEnable(GL_TEXTURE_GEN_T);
     
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
    	glEnable(GL_TEXTURE_GEN_R);
     
    	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
    	glEnable(GL_TEXTURE_GEN_Q);
    Malheureusement je n'ai pas encore trouvé le moyen de l'isoler des transformations induite par les lignes de code du dessus.


    Citation Envoyé par shenron666 Voir le message
    ça ne serait pas un problème de précision ?
    ta texture d'ombre, tu ne l'afficherais pas en 2 passes ?
    si c'est le cas, regardes du côté du polygon offset voir si ça peux arranger ton problème qui, je pense, est lié au "z fighting"
    Si c'était effectivement ça.

    Il me reste quelque petits problèmes. Notamment lorsque mon perso arrive aux extrémités du frustrum de la lumière, des ombres, qui semblent étiré et non naturelle, apparaissent (voir triangle en rouge):



    Sinon voila ce que ca donne en temps normal:



    Si vous avez des remarques, des suggestions, des idées d'amélioration, des solutions potentielles aux problèmes qu'il me reste, n'hésitez pas .

    Je posterai le code final quand j'aurai résolu tous mes problèmes.

  13. #13
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    pour ton problème de texture sur le perso, tu dois normalement utiliser les coordonnées de texture qui font partie du modèle
    la génération automatique des coordonnées de texture c'est plutot fait pour de l'environnement mapping (effet de chrome par exemple)
    si c'est possible de le faire avec la génération automatique malheureusement je ne connait pas

    pour le problème d'ombre lié au frustum, logiquement je penserai plutot à faire en sorte que la lumière suive le modèle
    à moins que ça ne soit un spot ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  14. #14
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    En fait tu écrasesla matrice de projection de la texture de ton modèle par celle du shadow mapping. Pour éviter cela, tu dois Push et Pop la matrice de ton modèle avant d'appliquer la génération de ta texture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glMAtrixMode(GL_TEXTURE);
    glPushMatrix();
    // Generation de texture
    // Draw
    // Disable generation de texture
    glPopMatrix();
    Enfin c'est pas sûr ce que je dis mais à tester .

  15. #15
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par TanEk Voir le message
    En fait tu écrasesla matrice de projection de la texture de ton modèle par celle du shadow mapping. Pour éviter cela, tu dois Push et Pop la matrice de ton modèle avant d'appliquer la génération de ta texture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glMAtrixMode(GL_TEXTURE);
    glPushMatrix();
    // Generation de texture
    // Draw
    // Disable generation de texture
    glPopMatrix();
    Enfin c'est pas sûr ce que je dis mais à tester .
    J'ai déjà essayé ca et ca n'a pas marché .

    Citation Envoyé par shenron666 Voir le message
    pour ton problème de texture sur le perso, tu dois normalement utiliser les coordonnées de texture qui font partie du modèle
    la génération automatique des coordonnées de texture c'est plutot fait pour de l'environnement mapping (effet de chrome par exemple)
    si c'est possible de le faire avec la génération automatique malheureusement je ne connait pas
    C'est ce que je fais. J'ai pour chaque vertice de mon modèle les coordonnées de texture qui y correspondent.

    Lors de la dernière passe du rendu avec la shadow map, j'ai le pseudo code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GenerationDesCoordonneesDeTexturesAutomatiquePourLaShadowMap();
    affichageDuModel();
    Quand je vire la partie GenerationDesCoordonneesDeTexturesAutomatiquePourLaShadowMap, ma shadow map ne s'affiche plus (normal) mais mon perso est correctement texturé. Donc je me demande s'il ne faudrait pas utiliser le multi-texturing et binder la shadow map sur le slot 2 et réserver ce slot pour les textures d'ombre.


    Citation Envoyé par shenron666 Voir le message
    pour le problème d'ombre lié au frustum, logiquement je penserai plutot à faire en sorte que la lumière suive le modèle
    à moins que ça ne soit un spot ?
    Ce n'est pas un spot. J'avais pas pensé à faire suivre la lumière par le perso. Je pensais plutôt mettre la lumière à une altitude suffisamment haute pour voir toute la scène. Sinon avec ta solution, comment on fait si il y a plusieurs objets ? On ne peut pas tous les suivre.

  16. #16
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Citation Envoyé par drcd Voir le message
    Donc je me demande s'il ne faudrait pas utiliser le multi-texturing et binder la shadow map sur le slot 2 et réserver ce slot pour les textures d'ombre.
    Oui c'est bien ça qu'il faut faire .

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 118
    Par défaut
    Un conseil :

    Sur ton screenshot, on voit que les bords des ombres sont dures.

    => passe le filtrage de ta shadow map en GL_LINEAR et tu auras un Percentage Closer Filtering 2x2 gratuit

  18. #18
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Es-tu sûr de ce que tu viens de dire sehb ? Je ne pense pas qu'il faille faire du filtrage linéaire sur une texture de profondeur... d'ailleurs mes professeurs me l'ont déconseillés fortement. Le PCF consiste à rendre flou l'application de la texture d'ombrage et non pas à rendre floue la texture de profondeur. En l'occurrence ici on fait les deux en même temps mais il faut bien différencier la texture de profondeur qui va permettre de dire si on est dans l'ombre ou pas et l'effet de shading qui s'en suit et qui ici consiste à rendre noir le pixel s'il est dans la zone d'ombre (le PCF dit qu'on rend le pixel gris s'il est dans la zone de transition...). Corrigez-moi si je me trompe.

  19. #19
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    Citation Envoyé par drcd Voir le message
    Ce n'est pas un spot. J'avais pas pensé à faire suivre la lumière par le perso. Je pensais plutôt mettre la lumière à une altitude suffisamment haute pour voir toute la scène. Sinon avec ta solution, comment on fait si il y a plusieurs objets ? On ne peut pas tous les suivre.
    c'est vrai que ça se complique si on multiplie le nombre d'objets dont l'ombre peut également se projeter sur leurs voisins
    je te disais cela pour simplifier la résolution du problème

    quelqu'un qui a appliqué la théorie serait plus à même de répondre que moi sur ce coup là vu que la seule fois où j'ai codé cet effet je n'avais qu'un seul objet

    en gros, je pense que tu dois :
    - te faire une liste des objets dont l'ombre est projetée dans ton champ de vision
    - calculer le champ de vision de la lumière afin d'englober tous ces objets
    - effectuer ton rendu
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  20. #20
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Ca marchera pas bien car la résolution de la shadow map va devenir trop faible si l'étendue à couvrir est trop importante. Une des techniques est de faire plusieurs rendus de la shadow map qui se collent les uns les autres mais ça prend plus de calcul... Je crois qu'il y a aussi une autre technique un peu plus complexe : on réduit la résolution de la shadow map quand la zone de projection est loin de la caméra.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2008, 16h13
  2. Réponses: 4
    Dernier message: 26/04/2007, 08h41
  3. comment faire un group by sans erreur
    Par phpaide dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 09h11
  4. Réponses: 19
    Dernier message: 28/01/2005, 09h52
  5. Comment faire du bump mapping
    Par CladStrife dans le forum DirectX
    Réponses: 7
    Dernier message: 01/01/2004, 05h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo