|
用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,如果是,该怎么避免?谢谢各位大侠。
截图:
 |
|