1.创建、定位和启用光源
(1)定义光源的颜色和位置
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };
(2)创建光源
glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); // Setup The Ambient Light设置环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); // Setup The Diffuse Light设置漫射光
glLightfv(GL_LIGHT1, GL_POSITION,position); // Position The Light设置光源位置
(3)启动光照和光源
glEnable(GL_LIGHTING); // 启动光照
glEnable(GL_LIGHT1); // Enable Light One启用一号光源
2.选择光照模型
GLfloat my_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat my_view[] = { 0.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, my_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, my_view);
glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
3.定义材质
(1)材料属性
GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };
GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat no_shininess[] = { 0.0 };
GLfloat low_shininess[] = { 5.0 };
GLfloat high_shininess[] = { 100.0 };
GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};
(2)指定材料属性
glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
4.绘制物体
glutSolidSphere(1.0, 16, 16);
code:
- #include <gl/glut.h>
-
- #define WIDTH 400
- #define HEIGHT 400
-
- static GLfloat angle = 0.0f;
-
- void myDisplay(void)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(0.0, 5.0, -10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
-
-
- {
- GLfloat sun_position[] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat sun__ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat sun_diffuse[] = {1.0f, 1.0f, 1.0f, 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);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, sun_ambient); //光照模型
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHTING);
- glEnable(GL_DEPTH_TEST);
-
- }
-
-
- {
- GLfloat sun_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat sun_mat_diffuse[] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat sun_mat_emission[] = {0.5f, 0.0f, 0.0f, 1.0f};
- GLfloat sun_mat_shininess = 0.0f;
-
- glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);
- glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);
- glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);
- glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);
-
- glutSolidSphere(2.0, 40, 32);
- }
-
-
- {
- GLfloat earth_mat_ambient[] = {0.0f, 0.0f, 0.5f, 1.0f};
- GLfloat earth_mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f};
- GLfloat earth_mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};
- GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat earth_mat_shininess = 30.0f;
-
- glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);
- glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);
- glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);
- glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);
-
- glRotatef(angle, 0.0f, -1.0f, 0.0f);
- glTranslatef(5.0f, 0.0f, 0.0f);
-
-
-
- glutSolidSphere(2.0, 40, 32);
- }
-
- glutSwapBuffers();
- }
- void myIdle(void)
- {
- angle += 1.0f;
- if( angle >= 360.0f )
- angle = 0.0f;
- myDisplay();
- }
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
- glutInitWindowPosition(200, 200);
- glutInitWindowSize(WIDTH, HEIGHT);
- glutCreateWindow("OpenGL光照演示");
- glutDisplayFunc(&myDisplay);
- glutIdleFunc(&myIdle);
- glutMainLoop();
- return 0;
- }
0 0