光照
步骤总结
- 改成深度缓存
- 设置物体表面属性
- 建立、设置光源
- 打开光源
一、深度缓存
void Init()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
}
glutInitDisplayMode(AUX_SINGLE|AUX_RGBA|AUX_DEPTH);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
#include <iostream>
#include "Windows.h"
#include "math.h"
#include <iostream>
#include <gl/glut.h>
using namespace std;
void Init()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//打开深度缓存并激活
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
//打开阴影
glShadeModel(GL_SMOOTH);
}
//定义材质的初始化函数
void InitMaterial()
{
float mat_ambient[] = { 0.0, 1.0, 1.0, 1.0 };//可以决定 RGBA
float mat_diffuse[] = { 0.0, 1.0, 1.0, 1.0 };//实体的颜色 RGBA
float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };//镜面反射高光的RGBA颜色
float mat_shininess[] = { 50.0 }; //控制高点光的大小和亮度,0-128之间的浮点数
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); //GL_AMBIENT 默认值:(0.2,0.2,0.2,1.0) 对环境光的反射率
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); //GL_DIFFUSE (0.8,0.8,0.8,1.0) 对漫反射的反射率
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //GL_SPECULAR (0.0,.0.0,0.0,1.0) 对镜面反射光的反射率
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); //GL_SHININESS 0.0 镜面反射指数
/*glMaterialfv(face, pname, param);
face: 可取 GL_FRONT、GL_BACK、
GL_FRONT_AND_BACK,它表明当前材质应该应用
到物体的哪一个面上;
pname: 说明一个特定的材质;(见书P262)
param: 是材质的具体数值.*/
}
//定义光源的初始化函数
void InitLight()
{
//单光源
//float light_position[] = { 1.0, 1.0, 1.0, 0.0 };
// glLightfv(GL_LIGHT0, GL_POSITION, light_position);
// glEnable(GL_LIGHTING);
//glEnable(GL_LIGHT0);
//双光源,光源0用的默认值
float light_position0[] = { 1.0, 0.0, 0.0, 0.0 }; //w=0:光源离场景无穷远;w=1:光源离场景较近
GLfloat light_diffuse0[] = { 1.0, 0.0, 0.0, 1.0 };//光源的颜色由GL_DIFFUSE 、GL_SPECULAR、GL_AMBIENT决定
GLfloat light_specular0[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position1[] = { -1.0, 1.0, 1.0, 0.0 };
GLfloat light_diffuse1[] = { 1.0, 0.0, 0.0, 1.0 };//光源的颜色由GL_DIFFUSE 、GL_SPECULAR、GL_AMBIENT决定
GLfloat light_specular1[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position0); //GL_POSITION 默认值(0.0,0.0,0.0,0.0) 光源坐标(x,y,z,w)
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse0); //GL_DIFFUSE (1.0,1.0,1.0,1.0) 漫反射光的RGBA强度值(对物体的影响最大)
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular0);
glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1); //GL_DIFFUSE (1.0,1.0,1.0,1.0) 漫反射光的RGBA强度值(对物体的影响最大)
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1); //GL_SPECULAR (1.0,1.0,1.0,1.0) 镜面反射光RGBA强度值
/*glLightfv(light, pname, param);
light: 指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7。
pname: 指定光源特性 ;(见书P259)
param: 设置相应的光源特性值 .*/
//打开光源
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
}
void Reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//3D
glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清屏加了|GL_DEPTH_BUFFER_BIT
gluLookAt(1, 1, 1, 0, 0, 0, 0, 1, 0);
glPushMatrix();
glTranslatef(-200,200,0);
glutSolidTeapot(50);
glPopMatrix();
glutSolidTorus(15,50, 10, 40);
// glutSolidSphere(100.0, 16, 16);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);//加了深度缓存| GLUT_DEPTH
glutInitWindowPosition(100, 100);
glutInitWindowSize(840, 680);
glutCreateWindow("FirstDemo");
Init();
InitMaterial();
InitLight();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
结果如下: