opengl 光照无法照亮纹理

bear234 2013-12-12 11:47:32
我用纹理实现了一个贝塞尔曲面 作为地面 然后在地面上放置了一个箱子 然后设定并启用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);
我想要的效果是:箱子被照亮以及箱子附近的地面也被照亮,其他地方的地面不被照亮(所以我用了聚光灯,光照范围被角度限制到箱子附近)

而现在的效果是,箱子被照亮了,但是地面全部都没有被照亮~~~


求大神解救下吧~!纠结了好几天啦~~

谢谢了啊~~~
...全文
1309 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bear234 2013-12-13
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
地面的法向量不对 或将地面改为双面材质 试试看。
应该不是法向量或者材质的问题 我的材质已经设置成双面的了 如果我把地面换成一个平面 那么就可以正常显示 而如果是曲面 就不行 有个人跟我说是因为曲面贴纹理发生在光照以后 说要我进行 光照计算 但我不懂怎么算
赵4老师 2013-12-13
  • 打赏
  • 举报
回复
地面的法向量不对 或将地面改为双面材质 试试看。
bear234 2013-12-12
  • 打赏
  • 举报
回复
我把同样的纹理贴到一个球上,没有任何问题,light0可以照亮它 但就是这个曲面无论如何无法被照亮 我觉得问题在曲面上-----也就是上面display函数里的 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); 这几行上

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧