帮忙看看关于Opengl的光照问题

dukelee 2010-04-30 12:36:59
我在场景中使用了光照,但是光照只照亮了场景的一半,想了很久不知道怎么解决
帮忙看一下,谢谢了,代码如下(只有画图部分的代码),就是在场景中画了一些网格线,然后在正上方
加了光源还有全局环境光

//Ondraw中的画图程序
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

GLfloat global_ambient[] = {0.5, 0.5, 0.5, 1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
glEnable(GL_LIGHTING);
glTranslatef(0.0f, -1.0f, -8.0f);
glPushMatrix();

GLfloat sun_position[] = { 0.0f , 6.0f , 0.0f , 1.0f };//这里是光源的位置,更改Z坐标可以移动光源,但是也只能照到场景的一半,Z<0 的部分是亮的
GLfloat sun_ambient[] = { 0.0f , 0.0f , 0.0f , 1.0f};
GLfloat sun_diffuse[] = { 0.8f , 0.8 , 0.8f , 1.0f };
GLfloat sun_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, sun_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, sun_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, sun_specular);
glEnable(GL_LIGHT0);

//int numtriangles;
//numtriangles = m_3DObj.m_pFaces.size();
//GLfloat x_m, y_m, z_m, u_m, v_m;
GLfloat grid_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat grid_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat grid_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glMaterialfv(GL_FRONT,GL_SPECULAR,grid_specular);
glMaterialfv(GL_FRONT,GL_DIFFUSE,grid_diffuse);
glMaterialfv(GL_FRONT,GL_AMBIENT,grid_ambient);
glMateriali(GL_FRONT,GL_SHININESS,1);

GLfloat x_grid, z_grid;//网格线
for(x_grid = -6.0f; x_grid < 6.0f; x_grid += 0.25f)
{
for(z_grid = -6.0f; z_grid < 6.0f; z_grid += 0.25f)
{
glBegin(GL_LINE_LOOP);
glVertex3f(x_grid, 0.0f, z_grid);
glVertex3f(x_grid, 0.0f, z_grid + 0.25f);
glVertex3f(x_grid + 0.25f, 0.0f, z_grid + 0.25f);
glVertex3f(x_grid + 0.25f, 0.0f, z_grid);
glEnd();
}
}

//glEnable(GL_BLEND);//这里是坐标轴线
//glEnable(GL_LINE_SMOOTH);
//GLfloat axis_ambient[] = { 0.8f, 0.0f, 0.8f, 1.0f };
//glMaterialfv(GL_FRONT,GL_AMBIENT,axis_ambient);
//glLineWidth(2.0f);
//glBegin(GL_LINES);
//glVertex3f(-20.0f, 0.0f, 0.0f);
//glVertex3f(20.0f, 0.0f, 0.0f);
//glVertex3f(0.0f, 0.0f, 20.0f);
//glVertex3f(0.0f, 0.0f, -20.0f);
//glEnd();
//glLineWidth(1.0f);
//glDisable(GL_LINE_SMOOTH);
//glDisable(GL_BLEND);

glPopMatrix();
SwapBuffers(wglGetCurrentDC());
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);

...全文
52 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dukelee 2010-04-30
  • 打赏
  • 举报
回复
试了一下,果然是法向量的问题,确实需要指定法向量
glVertex3f(x_grid, 0.0f, z_grid);
glVertex3f(x_grid, 0.0f, z_grid + 0.25f);
glVertex3f(x_grid + 0.25f, 0.0f, z_grid + 0.25f);
glVertex3f(x_grid + 0.25f, 0.0f, z_grid);
可还是想不明白怎么法向量会在上面的语句中被反向,太感谢了
zwqxin 2010-04-30
  • 打赏
  • 举报
回复
启用光源最好自己加法线.你现在用的是默认法线而已。glNormal系列函数,你学学吧

http://www.owlei.com/DancingWind/Course/Tutorial_07.htm
http://blog.chinaunix.net/u/26313/showart_1663228.html

地板的顶点法线都是向上
glNormal3f(0.0,1.0,0.0);
glVertex3f(x_grid, 0.0f, z_grid);
glNormal3f(0.0,1.0,0.0);
glVertex3f(x_grid, 0.0f, z_grid + 0.25f);
glNormal3f(0.0,1.0,0.0);
glVertex3f(x_grid + 0.25f, 0.0f, z_grid + 0.25f);
glNormal3f(0.0,1.0,0.0);
glVertex3f(x_grid + 0.25f, 0.0f, z_grid);


还有,把glLightfv(GL_LIGHT0, GL_POSITION, sun_position);放在glTranslatef(0.0f, -1.0f, -8.0f);前面,亮一半很可能是因为这个

dukelee 2010-04-30
  • 打赏
  • 举报
回复
帮忙看看吧,分不够可以再加,光照这方面感觉没个准头。。。
尹成 2010-04-30
  • 打赏
  • 举报
回复
友情支持,三颗心关照,up~up~up~!!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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