第五个程序opengl光照设置

来源:互联网 发布:安卓虚拟网络 编辑:程序博客网 时间:2024/05/16 05:41

Opengl设置光照的代码:

// lesson7.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <gl/glut.h>#define WIDTH 400#define HEIGHT 400static 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_light_position[] = {0.0f, 0.0f, 0.0f, 1.0f};    GLfloat sun_light_ambient[]  = {0.0f, 0.0f, 0.0f, 1.0f}; //周围,环境    GLfloat sun_light_diffuse[]  = {1.0f, 1.0f, 1.0f, 1.0f}; //漫射    GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; //镜面//每一个光源都可以设置其属性,这一动作是通过glLight*函数完成的//第1个参数指明是设置哪一个光源的属性//第2个参数指明是设置该光源的哪一个属性//第3个参数则是指明把该属性值设置成多少//GL_POSITION属性。表示光源所在的位置,(X, Y, Z, W)表示    glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position); //GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)    glLightfv(GL_LIGHT0, GL_AMBIENT,  sun_light_ambient);//GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)    glLightfv(GL_LIGHT0, GL_DIFFUSE,  sun_light_diffuse);//GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)    glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);    glEnable(GL_LIGHT0); //可以开启第0号光源    glEnable(GL_LIGHTING);    glEnable(GL_DEPTH_TEST);    }    // 定义太阳的材质并绘制太阳    {//每个属性由四个值表示,分别代表了颜色的R, G, B, A值        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.5f, 0.0f, 1.0f};        GLfloat sun_mat_shininess  = 0.0f;//材质则是通过glMaterial*函数来设置的//第1个参数表示指定哪一面的属性。可以是GL_FRONT(正面)、GL_BACK(背面)或者GL_FRONT_AND_BACK(两面同时设置)        glMaterialfv(GL_FRONT, GL_AMBIENT,   sun_mat_ambient);        glMaterialfv(GL_FRONT, GL_DIFFUSE,   sun_mat_diffuse);        glMaterialfv(GL_FRONT, GL_SPECULAR,  sun_mat_specular);//GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色        glMaterialfv(GL_FRONT, GL_EMISSION,  sun_mat_emission);//GL_SHININESS属性。该属性只有一个值,称为“镜面指数”,取值范围是0到128        glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);//绘制球体        glutSolidSphere(2.0, 40, 32);    }    // 定义地球的材质并绘制地球    {        GLfloat earth_mat_ambient[]  = {1.0f, 0.0f, 0.0f, 1.0f}; //R,G,B,A        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  = 60.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);      //对GLUT进行初始化//设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。//GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);    glutInitWindowPosition(200, 200);    //设置窗口在屏幕中的位置。    glutInitWindowSize(WIDTH, HEIGHT);   //设置窗口的大小。    glutCreateWindow("OpenGL光照演示");  //根据前面设置的信息创建窗口。参数将被作为窗口的标题    glutDisplayFunc(&myDisplay); //设置一个函数,当需要进行画图时,这个函数就会被调用    glutIdleFunc(&myIdle);    glutMainLoop(); //进行一个消息循环    return 0;}

运行结果:


原创粉丝点击