/*- * Opengl Demo Test * * Fredric : 2016-7-10 */ #include <GLUT/GLUT.h> #include <stdlib.h> void display_demo01(); void display_demo1_idle(); int main(int argc, const char * argv[]) { glutInit(&argc, argv); glutCreateWindow("Fredric Practice Demo"); glutDisplayFunc(display_demo01); /* * void APIENTRY glutIdleFunc(void (*func)(void)) * 当没有窗口事件发生时的全局回调函数 */ glutIdleFunc(&display_demo1_idle); glutMainLoop(); } //**************************************************************************** static int g_angle = 0; /* * 基础动画及光照效果 * 3D图形中的四种光源模型: * 1、点光源:光源从某一点向四面八方传播,例如太阳 * 2、无穷远光源:对于被照射的物体而言,光线平行摄入,如无穷远处的阳光; * 3、方向光源:沿某个方向在特定角度内摄入,如手电筒、车灯等; * 4、环境光源:从各个角度都有投射到场景中的光线 * PS:在opengl中还考虑自身发光的光源 * * 光线是会随着距离的增加而衰减的,衰减的程度成为衰减因子k,方向光源在偏离该方向时也会衰减 * 同时材质需要在光照中考虑反射的情况,分为: * 1、慢反射:光线射到物体后,其反射是任意方向的; * 2、镜面反射:光线射到物体后,其反射是根据被照射物体的法线方向; * * 综上,对opengl中的某个3D图像顶点的绘制基于如下公式: * 顶点颜色 = 材质自发光颜色项 + ∑(环境光颜色+衰减因子×(漫反射项 + 镜面反射项)) */ void display_demo01(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glShadeModel(GL_SMOOTH); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75, 1, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -100, 200, 0, 50, 10, 0, 0, 1); glColor3f(0.0f, 0.4f, 0.2f); glRotatef(-(g_angle * 10.0f),10.0f,5.0f,0.0f); //设置光源 { GLfloat light_position[] = {200.0f, 300.0f, 400.0f, 1.0f}; GLfloat light_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; /* * glLightfv (GLenum light, GLenum pname, const GLfloat *params); * 控制光源的位置、强度、颜色等 * light:GL_LIGHT0 表示第一个光源 GL_LIGHT1 表示第二个光源 * panme: 光源控制的类型 * GL_POSITION:光源位置 * GL_AMBIENT: 光源中的环境光强度 * GL_DIFFUSE: 光源中的散射光强度 * GL_SPECULAR: 光源中的镜面反射光强度 */ glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); } //设置材质 { GLfloat mat_ambient[] = {0.0f, 0.5f, 0.3f, 1.0f}; GLfloat mat_diffuse[] = {0.0f, 0.3f, 0.2f, 1.0f}; GLfloat mat_specular[] = {0.0f, 0.8f, 0.2f, 1.0f}; GLfloat mat_emission[] = {0.5f, 0.0f, 0.0f, 1.0f}; GLfloat mat_shininess = 68.0f; /* * glMaterialfv (GLenum face, GLenum pname, const GLfloat *params) * 设置材质 * face: 正反面 * GL_FRONT:正面 * GL_BACK:反面 * GL_FRONT_AND_BACK:正反面 * pname:材质属性 * GL_AMBIENT:材质的环境颜色 * GL_DIFFUSE:材质的散射颜色 * GL_SPECULAR:材质的镜面反射颜色 * GL_EMISSION: 材质的发射光颜色 * GL_SHININESS:镜面反射指数,0~128 值越小越粗糙 */ glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess); } //glutSolidSphere(100,30,30); glutSolidCube(80); glFlush(); glutSwapBuffers(); } //回调函数 void display_demo1_idle(){ g_angle += 1; display_demo01(); }
时间: 2024-11-05 18:11:56