计算机图形学 | 实验八:Phong模型

news2025/1/13 9:47:55

计算机图形学 | 实验八:Phong模型

  • 计算机图形学 | 实验八:Phong模型
    • Phong模型
      • 光源设置
    • 光照计算
      • 定向光
      • 点光源
      • 聚光

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 实验八:Phong模型

Phong模型

接下来,我们来介绍一下Phong模型。

绘制效果如下,我们可以看到,中间的立方体是被照射的对象,有一个定向光源,六个点光源和一个聚光的光源。

在这里插入图片描述

我们的程序流程主体还是跟前面的课程相同。因此我们这节的重点部分就是主要在这两个方面,一个是光源的设置,一个是光照计算。

光源设置

首先是光源的设置,我们这里的光源种类主要有三种,定向光,点光源和聚光,三种光源的效果叠加形成了我们刚才看到的效果。

那么我们在代码中是如何实现的呢?首先我们来看定向光,定向光就是类似太阳这种,它的属性包括定向光的方向,以及环境光,漫反射光,镜面反射光的强度参数。由于定向光是光源处于无限远处的平行光,因此我们无需指定出定向光光源具体的位置,只需指定其指向的方向即可。

接下来是点光源,我们定义了六个点光源,点光源就是类似灯泡这种,每一个点光源的属性都包括点光源的位置,环境光,漫反射光,和镜面反射光的强度参数,这里每一个分量都要乘一个点光源的颜色。那么除此之外点光源与定向光有哪些不同呢?它与定向光不同的是它多了三个属性参数,这三个参数是用来计算衰减公式的三个系数,分别是constant常数项,linear一次项和quadratic二次项,它会使得光线强度随距离的增加不断减小并且衰减的幅度也逐渐减小,这样更接近现实生活中点光源的效果。

我们的第三种光源是聚光,聚光就是类似手电筒的这种效果,聚光的属性也包括聚光光源的位置,方向,这里我们是用摄像机的位置和朝向来指定的,还有环境光,漫反射光,和镜面反射光的强度参数以及三个衰减系数,那么除此之外聚光光源与点光源又有哪些不同呢?这里我们又多了两个参数分别表示我们聚光内外圆锥的内外切光角。聚光的效果就相当于是一个圆锥的光效,我们这里通过使用两个圆锥来使我们的聚光效果看起来更加平滑。

当我们已经知道了我们是如何设置光源的,并且已经了解了三种光源的属性时,接下来我们要做的就是计算光源的光照,这里我们使用的是Phong模型来计算光照。

光照计算

具体计算光照的过程,我们是在立方体的片段着色器中进行的。由于我们在考虑物体颜色时才会考虑光照到物体产生的颜色影响,因此我们在立方体的片段着色器中计算光照。

定向光

接下来就是具体的计算过程,首先是计算定向光源,根据之前Phong模型的公式,我们分别计算环境光、漫反射光和镜面光。

我们在计算环境光的时候用的是漫反射光下的物体颜色而非环境光下的,是因为通常情况下漫反射光和环境光下的物体效果几近相同,因此我们无需存取两遍。

计算漫反射时我们对法向量和光线方向向量进行点乘,计算光源对当前片段实际的漫发射影响,即L·N,结果值再乘以物体的材质颜色Kd和漫反射光因子Ip。

// 漫反射
vec3 lightDir = normalize(-light.direction); 
float diff = max(dot(normal, lightDir), 0.0);

计算镜面反射时我们对视线方向与反射方向的点乘(R·V)(并确保它不是负值),然后取它的n次幂。这个n是高光的反光度(Shininess) ,结果值再乘以物体的材质颜色Ks和镜面光因子Ip。

// 镜面反射 
vec3 reflectDir = reflect(-lightDir, normal); 
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);

这里的高光的反光度n(shininess)我们程序中取值为32,那么为什么我们取32而不取其他的值呢?之所以选取这个值是因为我们不希望镜面光过于显眼,我们可以看到图中n取值不同时我们得出的光源效果,也可以自己尝试一下。

点光源

第二种光源效果是点光源,这里我们对于点光源的环境光、漫反射光和镜面光的计算同定向光相同,依然是根据Phong模型来计算,只不过我们引入了衰减这一属性。衰减与光源和物体的距离有关,它会使得光线强度随距离的增加不断减小并且衰减的幅度也逐渐减小。这里我们保留环境光,只考虑漫反射光和镜面光受到衰减的影响。

// 距离和衰减 
float d = length(light.position - fragPos); 
float attenuation = 1.0 / (light.c + light.l * d + light.q * d * d);

聚光

第三种光源效果是聚光光源,这里对于环境光、漫反射光和镜面光以及衰减的计算同点光源相同,不同点在于这里增加了聚光强度这一属性。

theta就是光线方向同光源方向的夹角。

Epsilon是内外圆锥之间的余弦差值,这里我们给出两个切光角,分别形成内外圆锥。

Intensity则是我们最终得到的聚光强度,它通过clamp()函数将theta值做了限制,在内圆锥内,强度大于1.0,在内外圆锥之间,强度在0.0-1.0之间,在外圆锥外,强度为负值。

// 聚光强度 
float theta = dot(lightDir, normalize(-light.direction)); 
float epsilon = light.cutOff - light.outerCutOff;
float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0);

我们同样保留环境光,对漫反射光和镜面反射增加聚光强度,就可以得到平滑的聚光效果。

最后我们对程序进行一个演示,我们这里设置了键盘响应事件,按1开启定向光,2~7开启点光源,8开启聚光效果。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

挖掘有价值的用户需求 需警惕5大误区

1、听取用户等于听从用户 在挖掘有价值的用户需求时,往往需要认真倾听用户的想法和需求,这样我们非常容易陷入到用户的思维中去。用户提到的需求,是他们真实想要的需求,但并不一定是客观需求,因为用户往往并不清楚他们…

【GDI+】旋转文本/斜体字

一、需求 想要绘制如下所示的斜体字,45度 二、分析&思路 Graphics类有个 RotateTransform方法,可以传入任意角度的值来旋转画板。但是这个方法的旋转中心是画板的左上角,所以直接单单用这个方法不能满足我们的需求。此外, G…

5个视频剪辑必备素材库、视频、配乐、音效全部免费下载。

推荐几个免费视频、配乐素材网站,可商用,建议收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库网素材非常丰富,网站主要还是以设计类素材为主,高清视频素材也很多,像风景、植…

Jmeter响应断言

1、断言介绍 断言用于检查测试中得到的响应数据是否符合预期,用以保证性能测试过程中的数据交互与预期一致。 Request请求成功了,并不代表结果一定正确。所以通过断言,我们不再会被200状态码所迷惑,而是可以通过断言&#xff0c…

搭建新项目 前端环境 及启动项目前的相关配置

** 搭建新项目 前端环境 及启动项目前的相关配置 ** 文章目录 搭建新项目 前端环境 及启动项目前的相关配置 前言一、编程 语言及框架二、步骤1.打开 VS2.导入项目3、配置地址及 请求端口4、启动项目5、查看报错 的日志文件6、运行 命令 安装相关有依赖及 jar 包7、特别要注…

前端学习--Vue(3)初始化vue项目

一、侦听器 1.1 概念 watch 侦听器允许开发者监视数据的变化&#xff0c;从而针对数据的变化做特定的操作 <div id"app"><span>字典查询</span><input type"text" v-model.lazy"uname"></div><script src&qu…

浅析视频技术与AI智能识别技术在智慧矿山场景中的应用

一、背景分析 能源与矿业是我国国民经济的重要物质生产部门和支柱产业之一&#xff0c;同时也是一个安全事故多发的高危行业&#xff0c;施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。国家矿山安监局陆续发布(矿安〔2022)128号)文、(矿安综〔2023〕5号)文推动矿…

数据结构之树和二叉树

目录 一、树简介 二、二叉树 1、简介 2、二叉树的性质 3、满二叉树和完全二叉树 三、二叉树的遍历 四、二叉树遍历代码实现 五、二叉搜索树&#xff08;Binary Search Tree&#xff09; 1、简介 2、二插搜索树的局限性 六、平衡二叉搜索树&#xff08;AVL树&#x…

【Spring框架】--04.单元测试JUnit、事务、资源操作Resources、国际化、数据校验Validation、提前编译AOT

文章目录 6.单元测试&#xff1a;JUnit6.1整合JUnit56.1.1搭建子模块6.1.2引入依赖6.1.3添加配置文件6.1.4添加java类6.1.5测试 6.2整合JUnit46.2.添加依赖6.2.2测试 7.事务7.1JdbcTemplate7.1.1简介7.1.2准备工作7.1.3实现CURD①装配 JdbcTemplate②测试增删改功能③查询数据返…

docker 使用记录

要点&#xff1a; 参考&#xff1a;https://www.cnblogs.com/yurenjun/p/15991062.html 一 打包部署步骤 参考&#xff1a; Docker教程&#xff08;超全总结&#xff09;_生信技术的博客-CSDN博客 参考部署基础操作&#xff1a;如何用Docker打包部署自己写的项目&#xff1f;…

中介中心性算法原理与源码解析(Between Centrality)

前言 中介中心性(Between Centrality)&#xff0c;或者叫介数中心性&#xff0c;是基于最短路径对关系图谱中节点的中心性进行测量的典型图论算法。和其它的图论中心性算法一样&#xff0c;中介中心性用来衡量社会关系网络中&#xff0c;个人、企业或者其它的实体在整个网络中…

stm32wb15cc蓝牙芯片学习

由于项目选型需要&#xff0c;初次接触stm32的蓝牙芯片&#xff0c;需要总体做一些学习。也记些笔记&#xff0c;防止遗忘。 一、主要的ST的蓝牙芯片 简单介绍一下主要ST的蓝牙芯片 1.1. STM32WB系列 这个系列的芯片是一个双核的MCU&#xff0c;相当于一个普通的STM32 MCU和…

全面分析低代码平台:各大热门产品详细对比

低代码平台彻底改变了企业构建和部署定制应用程序的方式。它们提供了一种用最少的代码&#xff0c;更快、更高效地开发软件的方法。使得公司在加快创新的同时节省了时间和资源。对于一些想进行数字化转型&#xff0c;选择低代码平台入门的中小企业来讲&#xff0c;应该选择哪个…

NTP时间服务器同步时钟系统安装汇总分享

在现代科技发展的背景下&#xff0c;各种设备的时间同步变得越来越重要。同步时钟管理系统的应用可以让多个设备在时间上保持一致&#xff0c;提高工作效率和安全性&#xff0c;为各个行业的发展提供了重要的支持。 一、同步时钟系统介绍 同步时钟管理系统的应用范围非常广泛&…

私有化部署的即时通讯软件:消息、文件安全加密,全面可控

如今&#xff0c;数字化转型进入纵深阶段&#xff0c;在企业数字化转型过程中&#xff0c;数据规模激增&#xff0c;结构更为复杂&#xff0c;数据零散化和安全性问题日益显著&#xff0c;使得众多企业在数据资产管理上面临不小的挑战。企业为提高内部沟通效率&#xff0c;通常…

C++源码分析完美转发

C源码分析完美转发 完美转发作用&#xff1a; 可以保持实参数据在函数中的左值或者右值类型。 不使用完美转发的后果 #include<iostream> using namespace std;// 容器里面元素的类型 class A { public:A() {}// 带左值引用参数的赋值函数A& operator(const A&…

24 KVM管理虚拟机-配置VNC-TLS登录

文章目录 24 KVM管理虚拟机-配置VNC-TLS登录24.1 概述24.2 操作步骤 24 KVM管理虚拟机-配置VNC-TLS登录 24.1 概述 VNC服务端和客户端默认采用明文方式进行数据传输&#xff0c;因此通信内容可能被第三方截获。为了提升安全性&#xff0c;openEuler支持VNC服务端配置TLS模式进…

在光伏行业的自动化生产中,EAP起到了什么作用?

随着可再生能源的快速发展和环保意识的增强&#xff0c;光伏行业作为一种清洁能源产业正迅速崛起。光伏生产过程的自动化已成为行业的追求和趋势。在光伏行业的自动化生产中&#xff0c;EAP&#xff08;设备自动化程序&#xff09;系统发挥着关键的作用&#xff0c;为生产线的运…

drawio@绘制带有latex公式的图表@示意图@流程图@白板模式whiteboard

文章目录 drawio绘制带有latex公式的图表示意图流程图白板模式whiteboard使用drawio小结 公式编辑Use mathematical typesetting in diagramsUse mathematical typesetting in diagramsTroubleshooting关于文本框元素公式渲染问题&#x1f388;Maths is not rendered 模式切换d…

【K哥爬虫普法】你很会写爬虫吗?10秒抢票、10秒入狱,了解一下?

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…