游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1621|回复: 0

求解决关于shandowmap的一个问题……

[复制链接]

2

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-6-9 11:11:00 | 显示全部楼层 |阅读模式
用opengl固定管线绘制的shadow,具体做法就是按照这里http://www.paulsprojects.net/tutorials/smt/smt.html来的,结果阴影是生成了,但是物体自身却出现了奇怪的阴影花纹(见附件),绘制的物体时封闭的,绘制阴影图时候也有用cull_face剔除正面,可结果就是不正确。下面是三遍绘制的部分代码。
First Pass:
        glGetIntegerv (GL_VIEWPORT,viewport);
        glViewport (0,0,shadowMapWidth,shadowMapHeight);
        glMatrixMode (GL_PROJECTION);
        glPushMatrix ();
        glLoadIdentity ();
        gluPerspective (lightFovy,lightAspect,lightNear,lightFar);
        glGetFloatv  (GL_PROJECTION_MATRIX,shadowLightProjectionMatrix.m);
        glMatrixMode (GL_MODELVIEW);
        glPushMatrix ();
        glLoadIdentity ();
        glEnable(GL_CULL_FACE);
        glCullFace(GL_FRONT);
        glShadeModel(GL_FLAT);
        glDisable (GL_LIGHTING);
        glColorMask(0,0,0,0);                                                                                                       

        gluLookAt (lightPos.v[0],lightPos.v[1],lightPos.v[2],
                           lightPos.v[0]+lightDirection.v[0],lightPos.v[1]+lightDirection.v   [1],lightPos.v[2]+lightDirection.v[2],
                           lightUp.v[0],lightUp.v[1],lightUp.v[2]);
        glGetFloatv  (GL_MODELVIEW_MATRIX, shadowLightViewMatrix.m);
         
           drawScene()
        glPopMatrix();
        glMatrixMode (GL_PROJECTION);
        glPopMatrix();
        glMatrixMode (GL_MODELVIEW);
        glViewport (viewport[0],viewport[1],viewport[2],viewport[3]);
        glCullFace(GL_BACK);
        glShadeModel (GL_SMOOTH);
        glColorMask (1,1,1,1);
        glBindTexture(GL_TEXTURE_2D, shadowMapTexture);
        glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, shadowMapWidth, shadowMapHeight);
        glEnable (GL_LIGHTING);
second Pass:
                  glClear (GL_DEPTH_BUFFER_BIT);
        light.SetDimLight();
        drawScene();
third Pass:
                   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);
               
        Matrix4x4 textureMatrix=biasMatrix.Mul(shadowLightProjectionMatrix.Mul(shadowLightViewMatrix));
        textureMatrix.Transpose();

        glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
        glTexGenfv(GL_S,GL_EYE_PLANE,&textureMatrix.m[0]);
        glEnable(GL_TEXTURE_GEN_S);

        glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
        glTexGenfv(GL_T,GL_EYE_PLANE,&textureMatrix.m[4]);
        glEnable(GL_TEXTURE_GEN_T);

        glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
        glTexGenfv(GL_R,GL_EYE_PLANE,&textureMatrix.m[8]);
        glEnable(GL_TEXTURE_GEN_R);

        glTexGeni(GL_Q,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
        glTexGenfv(GL_Q,GL_EYE_PLANE,&textureMatrix.m[12]);
        glEnable(GL_TEXTURE_GEN_Q);

        glEnable(GL_TEXTURE_2D);
        glBindTexture (GL_TEXTURE_2D,shadowMapTexture);

        //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);


        glAlphaFunc (GL_GEQUAL,0.99f);
        glEnable(GL_ALPHA_TEST);
           drawScene()
        glDisable(GL_TEXTURE_GEN_S);
        glDisable(GL_TEXTURE_GEN_T);
        glDisable(GL_TEXTURE_GEN_R);
        glDisable(GL_TEXTURE_GEN_Q);
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_TEXTURE_2D);
    在考虑是不是z-fighting,如果是,该怎么避免?谢谢各位大侠。
截图:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 10:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表