|
|
我在做阴影效果,使用的方法是《OpenGL超级宝典》中的shadow map(阴影图),现在遇到一个问题始终解决不了,请求大虾帮助。先谢过!!
我建立的场景是一个地形环境,其中有几个简单的几何物体(赋以颜色)。
我遇到的问题是:当用分成设色的方法绘制地形时,几何物体的阴影可以正确的投射到地形上,并可以随光源和物体的运动而变化;但是,如果给地形贴上纹理,阴影就不见了,同时随着光源的位置变化,地形纹理会出现无法想象的变化,我推测是纹理矩阵发生变化。可是我已经在纹理矩阵操作之前绑定了阴影图的纹理。
在绘制场景时,主要代码如下:
GLfloat sPlane[4] = {1.0f, 0.0f, 0.0f, 0.0f};
GLfloat tPlane[4] = {0.0f, 1.0f, 0.0f, 0.0f};
GLfloat rPlane[4] = {0.0f, 0.0f, 1.0f, 0.0f};
GLfloat qPlane[4] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat lowAmbient[4] = {0.1f, 0.1f, 0.1f, 1.0f};
GLfloat lowDiffuse[4] = {0.35f, 0.35f, 0.35f, 1.0f};
//由于不存在让“让环境光”比较失败的值
//必须首先设置环境光下的场景
glLightfv(GL_LIGHT0, GL_AMBIENT, lowAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lowDiffuse);
DrawBackground();
DrawModels();
//启用Alpha检测,丢弃被阴影遮挡的片段
glAlphaFunc(GL_GREATER, 0.9f);
glEnable(GL_ALPHA_TEST);
glLightfv(GL_LIGHT0, GL_AMBIENT, m_fvAmbientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, m_fvDiffuseLight);
//设置阴影比较
glBindTexture(GL_TEXTURE_2D, m_iShadowTextureID);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
GL_COMPARE_R_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//设置视觉平面,用于场景上阴影贴图的投影
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_GEN_Q);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_S, GL_EYE_PLANE, sPlane);
glTexGenfv(GL_T, GL_EYE_PLANE, tPlane);
glTexGenfv(GL_R, GL_EYE_PLANE, rPlane);
glTexGenfv(GL_Q, GL_EYE_PLANE, qPlane);
//设置纹理矩阵用于阴影贴图投影
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.5f, 0.5f, 0.5f);
glScalef(0.5f, 0.5f, 0.5f);
glMultMatrixf(m_fv16LightProjection);
glMultMatrixf(m_fv16LightModelview);
// 绘制地形(以纹理或颜色方式)
DrawBackground();
// 绘制集合物体
DrawModels();
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q); |
|