热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

OpenGL基本概念入门4——颜色、光照和材质3

4为图元指定法向量OpenGL必须通过图元的法线向量来确定图元的明暗程度。只有场景中的物体有了明暗的不同,场景才有立

为图元指定法向量

    OpenGL必须通过图元的法线向量来确定图元的明暗程度。只有场景中的物体有了明暗的不同,场景才有立体感。

    确定一个平面的法向量是一件相当简单的事情。在一个平面上,随意寻找两个互不平行的向量,它们的外积(叉积)就是这个平面的法线。

    计算两向量的外积可以使用公式:

Sx = UyVz - UzVy
Sy = UzVx - UxVz
Sz = UxVy - UyVx

    上述公式中,UV为两不平行向量,SUV的外积(U×V)计算完外积之后,我们还需要将得到的向量转换为单位向量。只要将一个向量的xyz因子全部除以该向量的模就可以得到单位向量。因此,可以使用下面的代码计算一个三角形的法线向量。

    请注意应该将三角形的顶点按逆时针顺序传给函数以获得正确结果。

    通过计算得到法线向量之后,我们需要在绘制顶点之前调用glNormal函数为顶点或图元指定法线。例如:

    glBegin(GL_TRIANGLES);
      glNormal3f(1,1,1); //
为即将绘制的三角形指定法线
      glVertex3f(1,0,1);glVertex3f(1,1,1);glVertex3f(1,0,0);
    glEnd();

    除此之外,也可以为同一图元的不同顶点指定不同法线向量。例如:

    glBegin(GL_TRIANGLES);
      glNormal3f(1,1,1);
      glVertex3f(1,0,1);

      glNormal3f(1,0,1);
      glVertex3f(1,1,1);

      glNormal3f(0,1,1);
      glVertex3f(1,0,0);
    glEnd();   

材质

    指定了图元的法线之后,我们还需要为其指定相应的材质以决定物体对各种颜色的光的反射程度,这将影响物体表现为何种颜色。和光源的成分相似,材质也分为漫射光反光率、平行光反光率。材质的漫射光成分将决定该材质对环境中的漫射光的反射程度,相似的,平行光成分将决定材质对平行光的反射程度。与设置光源相似,我们只需在绘制图元之前调用glMaterialfglMaterialfv函数就能对即将绘制的图元的材质的各项参数进行设定。

5.1 设置材质对各种光的反光率

    调用:

    glMaterialfv(GL_FRONT,GL_DIFFUSE,@Diffuse);

可以指定材质对漫射光的反射率。其中,第一个参数决定该材质运用于图元的正面还是反面。可以取GL_FRONT(正面)GL_BACK(反面)GL_FRONT_AND_BACK(正反两面)。第2个值表示对何种光进行设置,GL_DIFFUSE表示对漫射光反射率进行设置,可以取GL_AMBIENT(环境光)GL_DIFFUSE(漫射光)GL_AMBIENT_AND_DIFFUSE(环境光和漫射光)GL_SPECULAR(平行/镜面光)。而第三个参数是一个四维数组,这个数组描述了反光率的RGBA值,每一项取值都为0-1之间。例如

Diffuse[4]={1,0,0,1};

glMaterialfv(GL_FRONT,GL_DIFFUSE,Diffuse);

   将会使物体在有红色成分的光照下表现为红色。

5.2 使用颜色跟踪

    在启用光照系统之后,为图元指定颜色变得不太方便。首先我们需要创建一个数组,然后调用glMaterial函数将数组传给材质,以此决定物体的颜色。为了简便,我们可以开启颜色跟踪来简化代码。调用

   glEnable(GL_CORLOR_MATERIAL);

   启动颜色跟踪,再调用

   glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

   来决定对物体的正面还是反面,对环境光、镜面光还是漫射光进行颜色跟踪。第一个参数可以取GL_FRONTGL_BACKGL_FRONT_AND_BACK中的任意一种,第二个参数可以取GL_AMBIENTGL_DIFFUSEGL_AMBIENT_AND_DIFFUSEGL_SPECULAR中的任意一种。

    启动颜色跟踪之后,我们就可以像以前一样,使用glColor函数来指定图元的颜色了。这时,OpenGL将自动根据从glColor函数传递的颜色来决定物体材质,省去了我们手工指定材质的麻烦。 例如,要在启用光照系统的前提下绘制一个红色的三角形,可以这样做:

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
    glColor3ub(255,0,0);
    glBegin(GL_TRIANGLES);
      glVertex3f(1,0,1);glVertex3f(1,1,1);glVertex3f(1,0,0);
    glEnd();

5.3 材质的镜面指数

    当光源中含有镜面光成分,且镜面光较强时,一些光滑的物体便会出现一些高亮的焦点

我们可以通过设置材质的镜面指数来确定光斑的大小和聚焦程度。调用

    glMateriali(GL_FRONT,GL_SHININESS,N );

可以对镜面指数进行设定。如果N值越大,则光斑尺寸越小,物体越有光泽,反之越大。N值可取1-128之间的任意整数。

5.4 辐射性材质

     有些物体,本身会发光。我们可以设置材质的Emission成分来使物体看起来有发光效果。只需添加如下代码:

     int LightEmission[4]={1,1,0,1}

glMaterialfv(GL_FRONT,GL_EMISSION,LightEmission);

     其中,LightEmission表示物体所发光的颜色的RGBA值。


推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文介绍了在Windows Server 2003环境下,使用XAMPP Lite 1.7.1和DotProject 2.1.3时遇到的日历和甘特图中文乱码问题的解决方案。通过修改相关文件和配置,可以有效解决这些问题。 ... [详细]
  • 射频系统中IM3、IIP3、OIP3、增益和P1dB的关系解析
    本文探讨了噪声系数与非线性失真对射频系统性能的影响,详细分析了IM3、IIP3、OIP3、增益(G)和1dB压缩点(P1dB)之间的关系,并提供了相关公式和图表解释。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
  • 本文详细介绍了如何使用 MySQL 查询特定时间段的数据,包括今天、本周、上周、本月和上个月的数据。适合对 MySQL 查询感兴趣的读者。 ... [详细]
  • 本文详细介绍了如何规划和部署一个高可用的Etcd集群,包括主机配置、软件安装、防火墙设置及集群健康检查等内容。通过合理的硬件配置和网络规划,确保Etcd集群在生产环境中的稳定运行。 ... [详细]
  • 本文介绍Linux中的Diff命令,该命令用于逐行对比两个文本文件,展示它们之间的差异。通过系统性检查,它能有效标识出文件间所有不同的行,无需事先对文件进行排序。 ... [详细]
  • 基于结构相似性的HOPC算法:多模态遥感影像配准方法及Matlab实现
    本文介绍了一种基于结构相似性的多模态遥感影像配准方法——HOPC算法,该算法通过相位一致性模型构建几何结构特征描述符,能够有效应对多模态影像间的非线性辐射差异。文章详细阐述了HOPC算法的原理、实验结果及其在多种遥感影像中的应用,并提供了相应的Matlab代码。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本文介绍在 Red Hat Linux 系统中如何安全地永久修改网卡的MAC地址。如果直接修改配置文件中的HWADDR字段,可能会导致系统启动时出现错误。了解ifup脚本的工作机制有助于避免这些问题。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • 本文介绍了如何利用Python的高精度计算库mpmath实现π的100种不同计算方法。通过设置更高的精度和优化的数学函数,这些方法能够提供极其精确的结果。 ... [详细]
author-avatar
咾爺們
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有