opengl 光照无法照亮纹理
我用纹理实现了一个贝塞尔曲面 作为地面 然后在地面上放置了一个箱子 然后设定并启用LIGHT0 去照亮箱子 箱子被照亮了 但是地面没有照亮 为什么?
//全局变量 贝塞尔曲面的相关参数以及贝塞尔曲面要用到的纹理的参数
static GLfloat ctrlpoints[4][6][3] = {
{{-420, 0, -420}, {-300, 0, -420},{-100, 0, -420}, {100, 0, -420}, {300, 0, -420}, {420, 0, -420}},
{{-420, 0, -300}, {-350, 300, -300},{-200, 0, -300}, {0, 0, -300}, {200, 0, -300}, {420, 0, -300}},
{{-420, 0, -200}, {-350, -0, -200},{-200, 0, -200}, {0, 0, -200}, {300, -200, -200}, {420, 0, -200}},
{{-420, 0, 420}, {-300, 0, 420},{-100, 0, 420}, {100, 0, 420}, {300, 0, 420}, {420, 0, 420}}};
static GLfloat texpts[2][2][2]={
{{0.0f, 0.0f}, {0.0f, 15.0f}},
{{15.0f, 0.0f}, {15.0f, 15.0f}}};
//light0 是个聚光灯 朝着箱子照去
void initLight0()
{
GLfloat ambient_and_diffuse[] = {0.2f, 0.2f, 0.2f, 1.0f};
GLfloat specular[] = {0.6f, 0.6f, 0.6f, 1.0f};
GLfloat position[] = {0.0f, 30.0f, 10.0f, 0.0f};
GLfloat cutoff[] = {30.0f};
GLfloat direction[] = {0.0f, -30.0f, -10.0f};
GLfloat exponent[] = {30.0f};
glLightfv(GL_LIGHT0, GL_AMBIENT_AND_DIFFUSE, ambient_and_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, cutoff);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);
glLightfv(GL_LIGHT0, GL_SPOT_EXPONENT, exponent);
}
//箱子就是个普通的cube 代码就不贴了
//材质
void initMaterial()
{
GLfloat specular[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat shininess[]= {50.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
}
//初始化纹理
void initTexture()
{
for(int i = 0; i<NombreDeTexture; i++)//所有的纹理 地面纹理也在里面
{
glGenTextures(1, s.GetTex(i).GetTexNom());
glBindTexture(GL_TEXTURE_2D, *(s.GetTex(i).GetTexNom()));
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, s.GetTex(i).GetSizeX(), s.GetTex(i).GetSizeY(), GL_RGB, GL_UNSIGNED_BYTE, s.GetTex(i).GetData());
}
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glShadeModel(GL_SMOOTH);
for(int i = 0; i<NombreDeTexture; i++)//删除一些指针 可以无视
{
s.GetTex(i).DeleteData();
}
//下面这三个就是实现贝塞尔曲面的
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 6, 0, 1, 18, 4, &ctrlpoints[0][0][0]);
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &texpts[0][0][0]);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
}
//显示函数display
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, 1.5, 1.0, 40000000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(s.GetPositionEyeX(), s.GetPositionEyeY(), s.GetPositionEyeZ(), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glEnable(GL_TEXTURE_2D);
//给贝塞尔曲面填充纹理 实现地面
glBindTexture(GL_TEXTURE_2D, *(s.GetTex(0).GetTexNom()));
glEnable(GL_MAP2_TEXTURE_COORD_2);
glPushMatrix();
glTranslatef(0.0f, -40.0f, 0.0f);
glEvalMesh2(GL_FILL, 0, 20, 0, 20);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
//s是箱子 Draw函数就是画出箱子的函数
s.Draw();
glFlush();
glutSwapBuffers();
glutPostRedisplay();
}
现在,我把light0打开~~~~~~~~~glEnable(GL_LIGHT0);
我想要的效果是:箱子被照亮以及箱子附近的地面也被照亮,其他地方的地面不被照亮(所以我用了聚光灯,光照范围被角度限制到箱子附近)
而现在的效果是,箱子被照亮了,但是地面全部都没有被照亮~~~
求大神解救下吧~!纠结了好几天啦~~
谢谢了啊~~~