OpenGL光照的初级问题
小弟OpenGL新手, 有个光照的问题一直不太明白,请教各位。
在OpenGL中,应该是向屏幕外是Z轴的正方向,向内是Z轴的负方向吧。我画了一个球, 在设置光源位置时有了点小问题。 按我理解,我把光源安在{5, 5, 10}的位置,应该有光照在球体的右上方啊。 但是,实际情况不是如此, 我设定光源位置{5, 5, -10},才能达到我想要的效果,而{5, 5, 10}好像照到球体的背面去了。 为什么啊?
附源代码:
#include <GL/glut.h>
void definelight()
{
GLfloat light0_ambient[] = {0.2, 0.2, 0.2};
GLfloat light0_position[] = {5.0, 5.0, -5.0, 1.0};
GLfloat light0_diffuse[] ={1.0, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
GLfloat mat_diffuse[] = {1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {50.0};
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void Init()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH);
definelight();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluPerspective(45, (GLdouble)w/(GLdouble)h, 0.1, 100.0);
if (w < h)
glOrtho(-5, 5, -5 * (GLdouble)h/(GLdouble)w, 5 * (GLdouble)h/(GLdouble)w, 0.1, 100.0);
else
glOrtho(-5 * (GLdouble)w/(GLdouble)h, 5 * (GLdouble)w/(GLdouble)h, -5, 5, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glutSolidSphere(2.0, 60, 60);
glFlush();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL");
Init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
[解决办法]
我之前也学了一点OPENGL,这个是深度缓冲区的问题,你的display函数中用了
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
当然初始化就得加上glEnable(GL_DEPTH_TEST),把它开启了~就这样
[解决办法]
学OPENGL别说别的,好好看红宝书(OPENGL编程指南)!去下载本看看~