OpenGL代码七光源和材质
程序员文章站
2022-06-10 21:06:10
...
参考文章:
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html
以上网址是OpenGL入门教程,此次程序对应入门七,教程有给出代码,没有需要改动的,可以直接使用,我只加了一些注释在代码上
/*
OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。
*/
#include <gl/glut.h>
#define WIDTH 400
#define HEIGHT 400
static GLfloat angle = 0.0f;
void myDisplay(void)
{
//glClearColor(1.0, 1.0, 1.0, 0);
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);
// 定义太阳光源,它是一种白色的光源;定义的和默认的是一样的
//光源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 }; //白色
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient); //GL_AMBIENT该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse); //GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)
glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular); //GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)。
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
// 定义太阳的材质并绘制太阳material设置材质
//光源使用gllight设置,材料使用glmaterial设置
{
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 }; //设置表面散射颜色的RGBA值,默认散射颜色是黑色
GLfloat sun_mat_shininess = 0.0f; //镜面指数,越小越粗糙
//参数1:指定哪一面的属性front是正面
glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);//环境光//GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)
glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);//漫反射光//GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)
glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);//镜面反射光//GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)
glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);//表面颜色//该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色
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;
}
贴上一个静止图
上一篇: 想长寿 百岁老人讲解长寿秘诀
下一篇: 骨质增生症应该如何预防?