OpenGL 简化点光源与平行光的对比实验

由于光照位置和物体面积不够导致简化点光源(无衰减)和平行光的漫反射看起来区别不大,所以设计如下实验,让两者区别在视觉效果上更加明显,更能说明问题。

投光物类:参数1:光源位置,参数二,光线方向旋转角度,参数3:光的颜色(传参数1还是参数2在我)

大多数操作在fragment shader中进行,代码如下:

#version 330 core
in vec3 FragPos;
in vec3 Normal;
in vec2 Texcoord;

struct Material
{
vec3 ambient;

//漫反射贴图
sampler2D diffuse;

//镜面反射贴图
sampler2D specular;

//放射光贴图(Emission Map)
sampler2D EmissionMap;

//反光度
float shininess;

};

uniform Material material;

uniform vec3 objColor;
uniform vec3 ambientColor;
//uniform vec3 lightPos;
uniform vec3 lightDir;
uniform vec3 lightColor;
uniform vec3 cameraPos;

//uniform sampler2D ourTexture;
//uniform sampler2D ourface;

out vec4 FragColor;

void main()
{

//光源方向,其反向就是入射光线方向,此处反应点光源和平行光的区别,点光源光线方向与各个片段的位置有关系,而平行光方向是独立的与片段位置无关
//vec3 lightDir=normalize(lightPos-FragPos);

//计算反射光线方向向量
vec3 reflectVec=reflect(-lightDir,Normal);//参数1:入射光线方向;参数2:法向量

//摄像机方向
vec3 cameraVec=normalize(cameraPos-FragPos);

//漫反射区分黑白灰面,与观察位置无关,因为法向量和光源位置目前都是死的
//max设置最小值,min设置最大值,此处为了不出现负值而抵消其他种类光照强度。
float diff=max(dot(Normal, lightDir), 0.0);

//摄像机方向与反射光线方向点乘后取shininess(反光度)次幂
float specularAmount=pow(max(dot(cameraVec,reflectVec),0),material.shininess);

//环境光
vec3 ambient=ambientColor*texture(material.diffuse, Texcoord).rgb;

//漫反射
vec3 diffuse=lightColor*diff*texture(material.diffuse, Texcoord).rgb;

//镜面反射
//镜面高光的强度可以通过图像每个像素的亮度来获取。镜面光贴图上的每个像素都可以由一个颜色向量来表示,
//比如说黑色代表颜色向量vec3(0.0),灰色代表颜色向量vec3(0.5)。
//在片段着色器中,我们接下来会取样对应的颜色值并将它乘以光源的镜面强度。一个像素越「白」,乘积就会越大,物体的镜面光分量就会越亮。
vec3 specular=lightColor*specularAmount*texture(material.specular, Texcoord).rgb;//在特殊位置才能够看见这张帖图产生的效果,其他部分效果仍由漫反射贴图产生

//放射光贴图
vec3 emission=texture(material.EmissionMap, Texcoord).rgb;

//片段最终颜色
//FragColor=vec4(ambient+diffuse,1.0f);

`}

实验1.1:多个立方体在简化点光源环境下的效果,光源位置(1.0f,0.0f,0.0f),即从右侧向左照。方向计算:vec3 lightDir =normalize(lightPos-FragPos);

实验1.2:多个立方体在平行光环境下的效果,方向(-1.0f,0.0f,0.0f),即从右侧向左照。(平行光无位置,只有方向)

实验2.1:巨大立方体(20 * 20 * 20)在关闭镜面反射的简化点光源环境下的效果,光源位置(12.0f, 0.0f,10.0f),即从右侧向左照。方向计算:vec3 lightDir=normalize(lightPos-FragPos);

解释:这里不是镜面反射而是漫反射,FragColor=vec4(ambient+diffuse,1.0f);简化的点光源位置为(12.0f, 0.0f,10.0f),距离平面很近,平面又是20*20的范围,中心位置是0.0f,所以在这个平面范围内的光线方向和法线的夹角会有较大的区别,float diff=max(dot(Normal, lightDir), 0.0); 夹角越大cos值越小,造成了这里亮周边暗的情况(ps:图2是箱子里面的状况,和外面是一模一样的,以后再讨论怎么样区分内外环境)


实验2.2:巨大立方体(20 * 20 * 20)在关闭镜面反射的平行光环境下的效果,光线方向(-1.0f,0.0f,0.0f),即从右侧向左照。

解释:整个平面内无区别

曾误认为点光源漫反射在一个面内的颜色没有区别,但通过此次实验的操作,能更加理解FragPos的作用,它对每一个片元都有影响(问题:即vec3 lightDir=normalize(lightPos-FragPos)的结果对各处都会有所影响,但不知道是生成了填充了中间像素的坐标还是对结果进行了类似内插的计算,综合片元颜色内插的经验,更倾向于后者)只不过物体之间的相对位置和物体受光面的大小的设计原因导致视觉上没有很大差异,造成了这种错觉,经过这次实验能够更加深刻理解点光源和平行光以及向量之间的运算。

此前对物体的变化过多,也造成了光源效果的观察并不是那么明显,所以要控制一些不必要的变量,才能够把这些特性更好地展现出来以便于观察。通知也不要主观臆断轻易相信自己的眼睛,多用代码来理解现象,多用思考验证直觉。

感谢阅读,欢迎批评指正!

OpenGL 简化点光源与平行光的对比实验相关推荐

  1. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  2. cimage和gdi绘图效率比较_GDI+和GDI绘图性能对比实验

    龙源期刊网 http://www.qikan.com.cn GDI+ 和 GDI 绘图性能对比实验 作者:王克茹 来源:<科技创新与应用> 2013 年第 25 期 摘 要:本文通过完全相 ...

  3. Python中单线程、多线程与多进程的效率对比实验

    Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势.而使用多进程(Multiprocess),则可以发挥多 ...

  4. 信息抽取(五)实体命名识别之嵌套实体识别哪家强,我做了一个简单的对比实验

    实体命名识别之嵌套实体识别哪家强 嵌套实体识别 实体矩阵构建框架 方法比较 GlobalPointer TPLinker Tencent Muti-head Deep Biaffine 实验结果 总结 ...

  5. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. python io密集型应用案例-Python中单线程、多线程和多进程的效率对比实验实例

    python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束. Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread ...

  7. 分布式视频编码对比实验中H.264/AVC Intra 模式与H.264/AVC Inter Motion模式分析

    分布式视频编码(Distributed Video  Coding, DVC)主要的特点是编码端简单.解码端复杂.解码传输延时大以及传输鲁棒性高等,这些特点可以使其很好地满足计算能力受限的低功耗编码终 ...

  8. 易基因 | 简化基因组DNA甲基化测序(RRBS)实验怎么做?

    易基因 | 简化基因组DNA甲基化测序(RRBS)实验怎么做? 大家好,这是专注表观组学十余年,领跑多组学科研服务的易基因. 上次我们分享了:全基因组DNA甲基化实验怎么做:手把手教你做全基因组DNA ...

  9. 设计计算机组装方案音频,组装 PC 与 Treain 音频电脑的对比实验

    音频电脑作为新生事物,一直受到某些朋友质疑,但我郑重的告诉朋友们,音频电脑确实有特别之处.今天,我们来个对比实验,大家一起来看看这个PC与音频电脑(Treain Audio Computer)的区别. ...

  10. 论文对比实验图神器MulimgViewer

    今天要给大家强烈安利一个作图利器,尤其便于论文中对比实验图的制作.它就是MulimgViewer多图像浏览器,在一个界面显示多个图像,方便图像的比较.筛选. 在线地址:nachifur/MulimgV ...

最新文章

  1. 【T-SQL】基础——表别名
  2. 第十六届全国大学生智能车竞赛全部比赛胜利结束了
  3. P2774 方格取数问题 网络最大流 割
  4. 如何使用Maven scope
  5. linux中内存挂载到目录下
  6. 控件把鼠标放上去出现一个小窗口_控件跟着鼠标走,VBA让你的操作随心所欲
  7. 叉乘点乘混合运算公式_《3D数学基础》提炼总结(四)向量运算(后)
  8. java中statistic_Java Statistic類代碼示例
  9. 洛谷P5385 [Cnoi2019]须臾幻境
  10. redis c++接口
  11. k-means 的原理,优缺点以及改进
  12. IOS 监控屏幕旋转
  13. 2022 apollo感知深度访谈简记
  14. Java中表头的边框置为实线_table表格设置边框线为单实线
  15. P5551 Chino的树学
  16. ios Block底层详解、框架结构:捕获、对象类型、__block、__forwarding、循环引用
  17. 将Android手机变成电脑遥控器
  18. 2023版最新最全React面试题
  19. Artemis Emojis
  20. 从PAYPAL电汇到中国建设银行过程

热门文章

  1. 远程访问及控制工具SSH
  2. 视频封装格式篇--MP4
  3. 股票量化实盘交易接口如何做回测?
  4. 表示背景色彩的html是,[html颜色代码]HTML语言中,设置背景颜色的代码是?
  5. 微信网页版如何给公众号发消息
  6. MySQL数据库基本操作,命令行创建数据库、数据表,查询语句,模糊查询、范围查询、判断查询
  7. php动态效果,jquery+php实现动态数字显示效果
  8. Docker1.8 官方中文文档
  9. 全国计算机等级考试二级Python(2021年9月)备考笔记 第六天
  10. 04-Redis 数据持久化实践