OpenGL中设置光照的镜面反射效果

在上一篇笔记中,我们记述了光线的方向与多边形表面的角度计算关系,除此之外,我们还有光源的位置需要指定。我们在ChangeSize函数的内部指定光源的位置:

// 指定光源的位置

GLfloat lightPos[] = {-50.0f, 50.0f, 100.0f, 1.0f};

glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

在此,lightPos数组包含了光源的坐标位置。这个数组的最后一个值是1.0,表示指定的坐标是光源的位置;如果这个数组的最后一个值是0.0,则表示光是从无限远处沿这个数组所指定的方向向量照射过来的。同样地,光就像几何物体一样,它们也可以根据模型视图矩阵进行移动。

接下来,我们设置光照的镜面亮点效果。

镜面亮点

镜面光和材料的镜面反射属性可以为物体的表面添加必要的光泽。光泽对物体的颜色具有变白的作用,它可以产生镜面加亮的效果。所谓镜面加亮,就是几乎所有光线都照射在一个物体的表面并反射下来。像我们平时看到的日光照射下的金属球,就是一个镜面加亮的例子,如下图所示:

首先,在光照中添加镜面光成分:

// 指定镜面光强度(RGBA)

GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

glLightfv(GL_LIGHT0, GL_SPECULAR, specular);

// 启用光照计算

glEnable(GL_LIGHTING);

// 启用光源0

glEnable(GL_LIGHT0);

在上述代码中,specular数组为光照的镜面光成分指定了一种非常亮的白色光源。但是现在,如果只是设置了光源部分,我们将无法看到物体的外观有何不同,因为我们还没有定义任何材料的镜面反射属性。

指定材料的镜面反射

为材料添加镜面反射属性,类似于为光源添加镜面光成分,代码如下所示:

// 指定材料的镜面反射属性

GLfloat specref[] = {1.0f, 1.0f, 1.0f, 1.0f};

// 设置多边形正面的镜面反射属性

glMaterialfv(GL_FRONT, GL_SPECULAR, specref);

// 指定镜面指数

glMateriali(GL_FRONT, GL_SHININESS, 128);

在这里,我们单独指定了镜面反射属性,specref数组包含了镜面反射的RGBA强度值。如果这个数组的所有值均为1,那么它所产生的表面将会反射几乎所有的入射光。

指定镜面指数

强度大的镜面光和反射属性能够加强物体的颜色。不过,极端强烈的镜面光(完全强度)和镜面反射(完全反射)会导致我们的物体几乎呈现纯白色或纯灰色,只有远离光源的那些表面除外。为了抑制这种效果,我们在指定了镜面反射属性之后,需要继续设置一下材料的镜面指数:

// 指定镜面指数

glMateriali(GL_FRONT, GL_SHININESS, 128);

GL_SHININESS属性设置材料的镜面指数。镜面指数指定了镜面加亮的大小范围和集中性。如果它的值是0,表示未聚焦的镜面加亮,实际上就是整个多边形的颜色均匀加亮。如果这个值大于0,就可以缩小镜面加亮的范围,同时增加镜面加亮的集中程度,从而出现亮点的效果。它的值越大,亮点就越明显。在所有的OpenGL实现中,这个参数的范围是1至128.

 
   

镜面指数为0,均匀加亮                         镜面指数为128,局部加亮

这一部分的示例程序完整代码已经放到了GitHub上,有需要的朋友可以参考一下(https://github.com/dxm3dp/OpenGL-05-LITJET点击打开链接)。

     本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng

时间: 2024-10-08 14:47:50

OpenGL中设置光照的镜面反射效果的相关文章

OpenGL中的光照与材料

在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射,这3种不同类型的光分别是:环境光(ambient).散射光(diffuse)和镜面光(specular).作为现实世界中光照的抽象,这3种类型的光允许我们模拟和控制光照在物体表面上所产生的效果. 环境光(ambient) 环境光并不来自任何特定的方向.由环境光所照射的物体在所有方向的表面都是均匀照亮的.在OpenGL中,这种光照类型实际上模拟了环境中源自所有光源的散光. 散射光(diffuse) OpenGL中

OpenGL中启用光照前的准备——指定法线

我们在使用光源时,除了强度和颜色之外,还需要指定光源的位置和方向,并且这些光源的位置和方向将会极大地影响场景的外观. OpenGL至少支持8种独立的光源.当我们指定一个光源时,便要告诉OpenGL这个光源的位置以及它的照射方向.光源经常向四周照射,但也可以向一个方向照射.无论在哪种情况下,对于我们所绘制的任何物体,来自任何光源的光线(除了纯粹的环境光源之外)都将根据一个角度撞击组成这个物体的多边形的表面.为了计算围绕多边形表面的着色效果,OpenGL必须能够计算光线与多边形表面之间的角度. 设想

关于swiper的tab(选项卡)中设置了autoHeight没有效果解决

autoHeight属性使用看官网的示例:https://www.swiper.com.cn/api/parameters/294.html swiper的选项卡结构查看:https://www.swiper.com.cn/demo/indexsample/ swiper的tab的一般DOM节点为: <body> <div class="tabs"> <a href="#" class="active">选项卡

在OpenGL中给场景添加光照

为了在OpenGL中使用光照计算,我们需要调用glEnable方法,并用GL_LIGHTING作为参数.这个调用告诉OpenGL在确定场景中每个顶点的颜色时使用光照参数和材料属性.当然,如果我们没有指定任何光照参数和材料属性,那么物体仍将会保持为黑暗的无光照状态. // 启用光照 glEnable(GL_LIGHTING); 一.设置环境光 OpenGL提供了一个全局光源,它只发射环境光.这种光源很有用,它可以照射没有被其它光源直接照射的物体的背面,并且如果场景看上去太暗,可以调节这种全局环境光

OpenGL学习(五) 光照与材质

OpenGL中的光照     环境光:在环境中进行了充分的散射,无法分辨其方向的光. 散射光:来自某个方向. 镜面光:来自一个特定的方向,并且倾向于从表面某个特定的方向反射. 除了以上三种光外,材料可能具有一种发射颜色,它模拟那些源自某个物体的光. 为了实现明暗效果,必须启用光照计算,而且每种光源也必须被启用.对于单个光源,我们可以这样做: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0) 注:一旦光照被启用,glColor*()指定的颜色值将不再使用. 指定

android selector设置button点击效果(详细)以及常见问题

button的点击效果学习起来事实上比较容易,此点对开发者来说也是使用的比较频繁的一个知识点,与它相关的还有编辑框的获取焦点时改变背景颜色.选择button选择时改变字体颜色等等.这些其实都是用到的drawable的seletor. 当然drawable中还有很多其他效果可以实现,具体的可以参考笔者的另一篇博客: android修改控件外观(使用drawable资源) 效果:(不点击时显示白色,点击时显示灰色) 实现这个效果其实很简单,在drawable中创建一个xml文件,然后输入两行代码即可

OpenGL中创建聚光灯的效果

现在,我们使用如下的数组来指定一个光源的位置: // 指定光源位置的数组 GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f}; // 设置光源0的位置 glLightfv(GL_LIGHT0,GL_POSITION,lightPos); lightPos数组的最后一个值在此为1.0,它表示光源的实际位置就在(X,Y,Z)所表示的位置.在默认情况下,光线从这个位置均匀地向四周发射.如果我们把lightPos数组的最后一个值设为0.0,可以使光源看上去像是来

Opengl场景中加光照包含几个步骤

http://zuoye.baidu.com/question/44e2a82d7ad5c0e1d33ddb9a40e0bf86.html  Opengl场景中加光照包含几个步骤,各个步骤实现用的函数是什么?这两个问题回答清楚就行了,不用说别的.粘贴的一律无视. 小白小菜0026 2014-10-10 优质解答下载作业帮App,拍照秒答 主要分三步:设置光源参数 .开启光照.设置法线信息. 1.设置光源参数.通过多次调用带有不同参数的glLightfv()函数来实现.一般会设置环境光(Ambie

[OpenGL] 茶壶与光照

OpenGL可以设置至少8种光源,它们的标号为GL_LIGHT0,GL_LIGHT1,GL_LIGHT2--.在这里我们使用了两种光源,一种是环境光,另一种是聚光灯. 在设置光照时,我们需要考虑这样三种光:环境反射光.镜面反射光.漫反射光.在Phong光照模型中,就是通过这三种分量的取值来模拟真实光照的.其中,环境反射光是光源多次反射后的光,可以理解为背景光,镜面反射和漫反射反映了物体表面的粗糙/光滑程度,两者的和是一定的. 在OpenGL中,如果我们想要使用光源,需要输入以下语句开启光照模式: