2025年用glLightfv函数实现简单的光照效果

用glLightfv函数实现简单的光照效果制作真实的动画往往需要添加光照效果 首先介绍 OpenGL 的简单光照模型 它的反射光可以分为三个分量 环境反射光 漫反射光 镜面反射光 就是你要实现一个光照效果 需要设置这三个分量 三者之和达到你想要的光照效果 1 环境光 简单来说就是环境中的光 似乎来自于各个方向 2

大家好,我是讯享网,很高兴认识大家。

制作真实的动画往往需要添加光照效果。

首先介绍OpenGL的简单光照模型,它的反射光可以分为三个分量:环境反射光,漫反射光,镜面反射光。就是你要实现一个光照效果,需要设置这三个分量,三者之和达到你想要的光照效果。

1.环境光,简单来说就是环境中的光,似乎来自于各个方向

2.漫反射,来自一个方向,光它照射到物体上,则在各个方向上均匀地发散出去,不管视点在哪,物体都是一样亮。

3.镜面光,来自特定方向,并沿着另一方向反射出去。

glLightfv函数原型:void glLightfv(光源名, 类型, 赋值);

类型主要有四类:光源颜色---AMBIENTDIFFUSESPECULAR和光源位置---POSITION

其中DIFFUSE的参数与光源颜色紧密,一般简单的光照模型只设置DIFFUSE就足够用了

GLfloat light0_diffuse[]= { 1.0, 0.0, 0, 1.0}; glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);

讯享网

下面是赋值的代码:

讯享网GLfloat light0_ambient[]= { 0.2, 0.2, 0.2, 1.0 }; GLfloat light0_diffuse[]= { 1.0, 0.0, 0, 1.0}; GLfloat light0_specular[] = { 1.0, 0, 0, 1.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR,light0_specular);

设置光源位置


讯享网

GLfloat light0_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION,light0_position);

开启光源

讯享网glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);表示启动光照的总开关 glEnable(GL_LIGHT0);//打开0号光源

glEnable(GL_DEPTH_TEST);//打开深度缓冲区,绘制3D图像时候使用

完整代码

 #include "stdafx.h" #include <GL/glut.h> #include "math.h" void reshape(int w,int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<h) glOrtho(-1.5, 1.5, -1.5,1.5 * (GLfloat)h / (GLfloat)w, -1.5,1.5); else glOrtho(-1.5* (GLfloat)w / (GLfloat)h, 1.5, -1.5,1.5, -1.5,1.5 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void init () { glClearColor(1.0,1.0,1.0,0.0); glColor3f(1.0,1.0,0.0); GLfloat light0_ambient[]= { 0.2, 0.2, 0.2, 1.0 }; GLfloat light0_diffuse[]= { 1.0, 0.0, 0, 1.0};//红色点光源 GLfloat light0_specular[] = { 1.0, 0, 0, 1.0 }; GLfloat light0_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR,light0_specular); glLightfv(GL_LIGHT0, GL_POSITION,light0_position); glShadeModel(GL_SMOOTH);//光滑着色,过渡色效果 glEnable(GL_LIGHTING);//启动光照,总开关 glEnable(GL_LIGHT0);//打开0号光源 glEnable(GL_DEPTH_TEST); } void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glutSolidTeapot(0.5); glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc,argv); glutInitWindowPosition(200,200); glutInitWindowSize(500,500); glutCreateWindow("001"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } 

运行结果

 

 我们发现茶壶的颜色被设置的光照给覆盖了,本身的颜色(黄色)并没有显示出来。这里引入一个新的函数---颜色材质函数glEnable(GL_COLOR_MATERIAL); 它确保了打开灯光效果之后还能保留图形颜色。使用时候放在init函数里即可。

添加后茶壶效果如下

 

小讯
上一篇 2025-04-07 11:52
下一篇 2025-03-14 21:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/28351.html