第五个程序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;}
运行结果:
- 第五个程序opengl光照设置
- OpenGL光照设置问题
- OpenGL中光照的设置
- OpenGL中光照的设置
- OpenGL编程指南第五章:光照
- OpenGL编程指南第五章:光照
- openGL 超级宝典第五版学习 第一个程序
- 设置OPENGL光照的一些经验
- OpenGL光照设置,实现渲染效果
- OpenGL(七) 光照模型及设置
- opengl es 光照效果,材质设置
- opengl编程指南笔记(六)第五章 光照
- OpenGL光照
- opengl光照
- OpenGL光照
- OpenGL光照
- opengl 光照
- OpenGL--光照
- 关于mps和mrp的相关概念(适合pp初学者)
- 邻接表实现的图创建及遍历源码
- 带有TimerQueue的EventLoop
- Ajax
- Eclipse开发C/C++ 安装配置图文详解
- 第五个程序opengl光照设置
- Python学习:python扩展库lxml学习
- Win32多线程之最小锁定时间
- 【Pia开发日记】Json&&Post开发Demo
- p2p杂摘
- 微信那点事儿-公众平台开发系列之自定义菜单(php版)
- java枚举的7种用法
- 黑马程序员——正则表达式
- Hive Hbase区别 转载整理