第五个程序opengl光照设置

Opengl设置光照的代码:

// lesson7.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#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_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;
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值