OpenGL3.3_C++_Windows(7)

演示

最终演示
最终演示效果
​​​​

冯氏光照

  1. 光照原理:
  2. 对于向量相乘默认为点乘,如果*lightColor(1.0f, 1.0f, 1.0f);白光,值不变
  3. 物体的颜色显示原理:不被物体吸收的光反射,也就是由白光分解后的一部分,因此,需要有光才会有物体颜色,并且光会影响物体颜色。
  4. 原理:模拟光,实际就是计算物体的片段 / 顶点的颜色值
  5. 对于物体颜色:可以在顶点数据传入,也可以在fragment glsl传入uniform
  6. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  7. 光照模型:
  8. 冯氏光照模型(Phong Lighting Model):环境(Ambient)(环境色)、漫反射(Diffuse)(正对着光源,它就会越亮),镜面(Specular)(亮点)
  9. 目标:模拟出基本冯氏光照
  10. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  11. 向量:
  12. 理解向量:想象3D空间xyz,有坐标原点0,0,0,物体的vec3坐标终点实际是物体的xyz坐标,与原点相连成矢量(有方向的长度线段)
  13. 向量与向量+-,以点模拟:实际是改变原坐标点xyz,分别+-3个标量后,在世界空间的位置,
  14. 而以向量模拟+-:将新的的向量放在物体向量的终点,得到原始起点到(未反转 / 反转 后)终点坐标。
  15. 对于-法:向量模拟:如果不改变新的向量位置,两个向量起点都放在世界中心,那么,可以获得两个向量的终点(坐标点)的向量
  16. 具体方向:向量起点 = 两向量中的被减数,向量终点 = 两向量中的减数
  17. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  18. 漫反射:
  19. 法向量(Normal Vector):垂直于片段表面的一个向量
  20. 漫反射:当光强度不变,入射向量,基于物体法向量,夹角越大,强度越小
  21. 点乘:恰好符合漫反射原理,夹角越接近90,cos越接近0,夹角越接近0,cos越接近1
  22. vertex glsl 接受所有顶点数据,需要传输到fragment glsl中,通过计算的法向量,获得当前片段获取的颜色值
  23. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  24. 在顶点数据传入normal,类型为vec3
  25. 如何计算顶点漫反射颜色?获取顶点法向量,由(光位置向量 - 顶点位置向量)获取光向量,两者点乘,返回float标量。
  26. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  27. 法线矩阵:
  28. 这里会发生一个很奇怪的现象,当物体旋转时,光会跟着物体的正面
  29. 原因:
    1. 对于计算漫反射是:光向量传入的是物体的v_Position = a_Position;顶点数据,当在vertex glsl中通过matrix改变物体的顶点,输出的是gl_Position,并没有改变传入的v_Position。
    2. 另外计算float diff点乘时,传入的为v_Normal,也是顶点数据,并不会随着物体旋转发生改变
    3. 所以对于每个顶点来说,计算的最后漫反射结果都是固定的
  30. 解决:正确更新新的位置(模型矩阵:物体的位置、旋转和缩放)和法线位置
  31. 位置:*modleMatrix变换到世界空间坐标
v_Position = vec3(model * vec4(a_Position, 1.0));
v_Normal = mat3(transpose(inverse(model))) * a_Normal;  
  1. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  2. 其他:
  3. 假设改变摄像机:editcamera本身不是物体,没有自身缩放,只有在世界中的位置和旋转
  4. 理解平行光:
  5. 想象两个立方体,在不同的位置,普通光源在一个点,分别向两个立方体发射光线,而平行光不会改变角度
  6. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  7. 理解矩阵:
  8. 单位矩阵:mat4(1.0f),将其*任何的 vec4(vec3(我们要变换的坐标),1.0f) = vec4
  9. 再比如简单的glm::scale:我们本身的mat4(经过变换的)* vec3(要变换的倍数)
  10. 顺序非常重要:否则计算结果有偏差
model = glm::scale//缩放
model = glm::rotate//旋转
model = glm::translate//位移
  1. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  2. 镜面:
  3. 漫反射取决于光线和物体表面法线的角度
  4. 镜面取决于观察方向,和反射光线的点乘
  5. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  6. 镜面:法向量,reflectDir反射光向量,相机方向向量,镜面强度(Specular Intensity)


法线矩阵(逆转置)

  1. 需要把法向量也转换为世界空间坐标,法向量只是一个方向向量(矢量),不能表达空间中的特定位置,属于vec3,并没有w分量,所以位移不应该影响。
  2. 简单mat3(*modle)矩阵后,旋转影响法线方向,缩放影响法线大小 || 方向(不等比时)
  3. 原理:mat3*vec3,vec3同时*某个标量,方向一致,*不相等的标量,方向改变
  4. 根据矩阵相乘的规则:A*B,需要A的列数 == B的行数,因为向量B只有3个分量,因此要*3.3的模型矩阵
  5. 法线矩阵(Normal Matrix):模型矩阵左上角3x3部分的逆矩阵的转置矩阵,
  6. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  7. 为什么用法线矩阵?缩放是均匀的,法线的方向将保持不变,长度会受影响,但很容易通过单位化修复,当不等比缩放,法线将不再垂直于平面,法线矩阵移除对法向量错误缩放的影响
  8. 法向量:inverse逆矩阵(经过 model 变换后的信息,映射回原始的、未变换的空间),transpose()转置(确保矩阵与向量乘法的结果是一个列向量),mat3强制转换为3×3矩阵
  9. 理解逆矩阵:modle * 原始vec = 新vec。现在变回原始vec,= 新vec / modle,但是矩阵没有除法,所以 * 1/modle,也就是逆矩阵

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣 面试题17.04.消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗? 示例 1: 输入:[3,0,1] 输出:2 示例 2: 输入:[9,6,4,2,3,5,7,0,1] 输出&#x…

JavaScript 规范霍夫曼编码

霍夫曼编码是一种无损数据压缩算法,其中数据中的每个字符都分配有可变长度的前缀代码。出现频率最低的字符获得最大代码,出现频率最高的字符获得最小代码。使用这种技术对数据进行编码非常简单且高效。但是,解码使用此技术生成的比特流效率低…

自然语言处理:第三十五章Embedding 测评榜单MTEB

文章链接: [2210.07316] MTEB: Massive Text Embedding Benchmark (arxiv.org) 项目地址: mteb:MTEB: Massive Text Embedding Benchmark - GitCode github地址: FlagEmbedding/C_MTEB at master FlagOpen/FlagEmbedding (github.com) Hugging Face Leadboard: MTEB Leader…

『SD』ControlNet基础讲解

本文简介 在学习和使用『Stable Diffusion』的过程中,『ControlNet』是一个不可忽视的关键组件。『ControlNet』是一个用于增强图像生成过程可控性的强大工具,允许用户通过提供特定的控制图像来精确指导生成结果。本文将讲解 『ControlNet』的基本概念。…

PHP杂货铺家庭在线记账理财管理系统源码

家庭在线记帐理财系统,让你对自己的开支了如指掌,图形化界面操作更简单,非常适合家庭理财、记账,系统界面简洁优美,操作直观简单,非常容易上手。 安装说明: 1、上传到网站根目录 2、用phpMyad…

目前市面上DIY高端空心耳机壳使用的透明原材料是什么?

目前市面上DIY高端空心耳机壳使用的透明原材料是什么? DIY制作耳机壳的UV树脂胶是一种单组份、通过紫外线光固化的胶粘剂,具有低能量固化、收缩低、发热量低、高透明、耐盐酸、耐黄变好、高硬度、韧性好、成型好等特点。这种胶粘剂非常适合用于制作耳机壳…

python-基础篇-文件和异常

文章目录 文件和异常读写文本文件读写二进制文件读写JSON文件 文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景,而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词,可能需要先科普一下关于文件系统的知识&#…

Chromium源码阅读:从页面加载到元素展示(1)

​ 从<p>hello world</p>.html到界面上的hello world 今天,我们一起来看看一个html元素,是如何绘制到界面上。我们选择了最简单的场景,便于快速掌握总体的流程,加深之前阅读知识的…

深入理解并打败C语言难关之一————指针(4)

前言: 我们在前面的几讲中已经讲了指针的很多内容了,现在我们开始层层递进,要探寻更多的指针喽,不多废话了,直接进入正题,开始今天的指针之旅喽! 目录: 1.字符指针变量 1.1常量字符…

除了程序员,你又是谁呢?别说!保护自己能量最好的方式——早读(逆天打工人爬取热门微信文章解读)

你很困的时候,会不会遵循本心直接睡觉呢? 引言Python 代码第一篇 洞见 保护自己能量最好的方式第二篇 视频新闻结尾 引言 现在真的是越来越遵循本心了 昨天晚上10点多 觉得好困 但是又没有洗澡 然后就想着算了 躺一个 没想到一躺 早上6点了 起来速速洗刷…

2024年心理学研究、现代化教育与社会发展国际学术会议(PRMESD 2024)

2024年心理学研究、现代化教育与社会发展国际学术会议(PRMESD 2024) 2024 International Conference on Psychological Research, Modern Education and Social Development 会议地点:南京,中国 网址:www.prmesd.com 邮箱: prmesdsub-con…

浔川计算机v1.1——浔川python科技社

浔川计算机v1.1 import tkinter import math import tkinter.messageboxclass Calculator(object):# 界面布局方法def __init__(self):# 创建主界面,并且保存到成员属性中self.root tkinter.Tk()self.root.minsize(280, 450)self.root.maxsize(280, 470)self.root.title(浔川计…

LabVIEW 32位与64位版本比较分析:性能与兼容性详解

LabVIEW的32位和64位版本在功能、性能、兼容性和应用场景等方面存在差异。本文从系统要求、内存管理、性能、兼容性、驱动支持和开发维护等多个角度进行详细分析,帮助用户选择合适的版本。 一、系统要求 操作系统支持: 32位LabVIEW:可以在32位…

vue+elementUI实现在表格中添加输入框并校验的功能

背景: vue2elmui 需求: 需要在一个table中添加若干个输入框,并且在提交时需要添加校验 思路: 当需要校验的时候可以考虑添加form表单来触发校验,因此需要在table外面套一层form表单,表单的属性就是ref…

ComfyUI 宝藏插件之辅助工具

今天我们就来分享下这个 ComfyUI 辅助脚本工具的功能。 插件安装,小伙伴们直接在管理器里搜索「ComfyUI-Custom-Scripts」,点击安装就可以了,这里再告诉小伙伴们一个小技巧,点击名称可以跳转到插件所在的官网哦。 没有安装管理器…

Tdengine的时序数据库简介、单机部署、操作语句及java应用

Tdengine的时序数据库简介、单机部署、操作语句及java应用 本文介绍了Tdengine的功能特点、应用场景、超级表和子表等概念,讲述了Tdengine2.6.0.34的单机部署,并介绍了taos数据库的常见使用方法及特色窗口查询方法,最后介绍了在java中的应用。…

AI助力密码安全:利用机器学习提升密码安全性

信息安全已经成为了当今数字世界的一个核心问题,随着互联网技术使用场景的不断增加,创建和管理安全的密码已经成为了保证在线账户安全的关键要求。本文将研究和探讨如何利用人工智能(AI)和机器学习技术来提升密码的安全性。 学习目…

xgo 原理探索

Go 单测 mock 方案 Mock 方法原理依赖优点缺点接口 Mock为依赖项定义接口,并提供接口的 Mock 实现。需要定义接口和 Mock 实现。灵活,遵循 Go 的类型系统;易于替换实现。需要更多的样板代码来定义接口和 Mock 实现。Monkey Patching&#xf…

深度学习网络结构之---Inception

目录 一、Inception名称的由来 二、Inception结构 三、Inception v2 四、Inception v3 1、深度网络的通用设计原则 2.卷积分解(Factorizing Convolutions) 3.对称卷积分解 3.非对称卷积分解 五、Inception v4 一、Inception名称的由来 Inception网…

推荐一款好用的读论文软件操作方法

步骤: 1. 使用一译 —— 文档和论文翻译、对照阅读、讨论和社区 2.上传自己想要翻译的论文即可。 示例 Planing论文双语翻译 1.1 Parting with Misconceptions about Learning-based Vehicle Motion Planning 中英文对照阅读 1.2 Rethinking Imitation-based Pl…