OpenGL3.3_C++_Windows(7)

news2025/7/8 5:53:00

演示

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

冯氏光照

  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.coloradmin.cn/o/1822147.html

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

相关文章

基于精益生产理念的化工厂原料采购探讨

如何提升生产效率、降低成本、确保质量稳定,是每个化工企业都需面对的重要课题。而精益生产理念,以其高效、灵活和持续改进的特点,成为越来越多企业追求的管理目标。在化工厂原料采购环节,引入精益生产理念,不仅能够优…

Golang | Leetcode Golang题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; func merge(head1, head2 *ListNode) *ListNode {dummyHead : &ListNode{}temp, temp1, temp2 : dummyHead, head1, head2for temp1 ! nil && temp2 ! nil {if temp1.Val < temp2.Val {temp.Next temp1temp1 temp1.Next} …

舵机是什么?舵机内部结构解析

什么是舵机呢&#xff1f;首先&#xff0c;“舵机”这个名号其实是一个俗称&#xff0c;是那些玩航模、船模的人起的名字&#xff0c;因为这种电机常被用于舵面控制。舵机其实就是一个简单的伺服电机系统&#xff0c;也是最常见的伺服电机系统。 舵机是一种位置&#xff08;角…

win10 双显卡,双显示器,VGA那个经常出现息屏(待机后无法唤醒),必须重启才能解决,(图文)手把手教你如何处理简单愉快的解决。

一、问题 双显示器&#xff08;双显卡&#xff0c;其中一个是HDMI&#xff0c;一个是VGA&#xff09;window系统&#xff08;本机win10&#xff09;&#xff0c;经常莫名出现&#xff0c;在待机或者主动息屏后&#xff0c;VGA显示器无法唤醒&#xff0c;依然黑屏&#xff0c;不…

Nginx+Tomcat负载均衡,动静分离群集

Nginx反向代理原理 Nginx 反向代理&#xff1a;将Nginx接收到的请求转发给其它应用服务器处理 Nginx 负载均衡&#xff1a;通过反向代理实现&#xff0c;还可以将nginx接收到的请求转发给多个后端应用服务器处理 Nginx 动静分离&#xff1a;静态页面请求&#xff0c;由nginx…

kettle实时增量同步mysql数据

** 本文主要介绍运用kettle实时增量同步mysql数据 ** Debezium介绍 官网地址&#xff1a;https://debezium.io/documentation/ Debezium是一个开源项目&#xff0c;为捕获数据更改(Capture Data Change,CDC)提供了一个低延迟的流式处理平台&#xff0c;通过安装配置Debeziu…

【学习笔记】centos7安装mysql相关事项

究极恶心的体验 依赖要按照顺序安装&#xff0c;有些依赖安装位置也不同 非常细节 mysql安装包&#xff1a;mysql官网下载地址 centos7选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit), RPM Bundle 下载版本自选 安装视频教程&#xff1a;centos7.5安装mysql …

免费代理为什么不安全?

在数字时代&#xff0c;网络已经成为人们日常生活和商业活动中不可或缺的一部分。为了实现更广阔的业务拓展和更畅通的网络体验&#xff0c;许多人开始考虑使用代理服务器。然而&#xff0c;虽然免费代理可能听起来像是个经济实惠的选择&#xff0c;但事实上&#xff0c;它可能…

电容式传感器的基本原理

电容式传感器由电容量可变的电容器和测量电路组成&#xff0c;其变量间的转换原理如图5—2所示。 图5—2电容式传感器变量间的转换关系 由电学可知&#xff0c;两个平行金属极板组成的电容器&#xff0c;如果不考虑其边缘效应&#xff0c;其电容为 Se——两个极板介质的介电常…

TFT屏幕波形显示

REVIEW 关于TFT显示屏&#xff0c;之前已经做过彩条显示&#xff1a; TFT显示屏驱动_tft驱动-CSDN博客 关于ROM IP核&#xff0c;以及coe文件生成&#xff1a; FPGA寄存器 Vivado IP核_fpga寄存器资源-CSDN博客 1. TFT屏幕ROM显示正弦波 ①生成coe文件 %% sin-cos wave dat…

一文读懂企业“数据资产入表”

2024年1月1日起&#xff0c;财政部《企业数据资源相关会计处理暂行规定》&#xff08;以下称《暂行规定》&#xff09;正式施行&#xff0c;企业可以对其数据资源进行会计核算&#xff0c;也就是俗称的“数据资产入表”。 《暂行规定》确定了三类数据资源可以入表&#xff1a;…

从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

本文为从零开始写 Docker 系列第十八篇&#xff0c;利用 linux 下的 Veth、Bridge、iptables 等等相关技术&#xff0c;构建容器网络模型&#xff0c;为容器插上”网线“。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实…

南京威雅学校:初中转轨国际化教育,她们打开了成长的另一种可能

“上了大学就轻松了。” 又是一年高考季&#xff0c;每每回想起十八岁前那些没日没夜埋头学习的日子&#xff0c;已经为人父母的你是不是也忍不住想要孩子气地吐槽一句&#xff0c;“骗人”——人不会在一场考试后瞬间长大&#xff0c;试卷里也没有人生的全部答案。 三年前&a…

详解QFileSystemModel的使用

在Qt应用程序开发中&#xff0c;QFileSystemModel是一个强大的类&#xff0c;用于展示和操作文件系统的信息。它基于标准的QAbstractItemModel&#xff0c;提供了浏览本地文件系统目录树的能力&#xff0c;并且能够自动更新以反映文件系统的变化。本文将详细讲解QFileSystemMod…

性能测试3【搬代码】

1.Linux服务器性能分析命令及详解 2.GarafanainfluxDB监控jmeter数据 3.GarafanaPrometheus监控服务器和数据库性能 4.性能瓶颈分析以及性能调优方案详解 一、无界面压测时&#xff0c; top load average:平均负载 htop 二、Garafana监控平台 传统项目&#xff1a;centosphpm…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中&#xff0c;我们将彻底查看它是否真的是 WordPress 最佳内部链接插件&#xff01;我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件&#xff0c;你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…

【后端开发】服务开发场景之高性能(CDN与负载均衡,数据库优化,消息队列)

【后端开发】服务开发场景之高性能&#xff08;CDN与负载均衡&#xff0c;数据库优化&#xff0c;消息队列&#xff09; 文章目录 1、内容分发网络&#xff08;CDN &#xff09; & 负载均衡算法CDN是什么&#xff1f;&#xff08;静态资源加速&#xff09;CDN的应用场景&am…

PaddleOCR学习——PP-OCR系列

相关知识前置&#xff1a; PP-LCNet PP-LCNetV3 PP-LCNetV3系列模型是PP-LCNet系列模型的延续&#xff0c;覆盖了更大的精度范围&#xff0c;能够适应不同下游任务的需要。PP-LCNetV3系列模型从多个方面进行了优化&#xff0c;提出了可学习仿射变换模块&#xff0c;对重参数…

git下载路径

第一步 1进入官网&#xff1a;Git - Downloading Package 第二步 根据自己的系统选择对应版本下载

Opencascade实体转VTK对象渲染测试

前面编译了基于QT5.12.7VTK8.2的库&#xff0c;本次就根据这个VTK库实现VTK嵌入QT并将Opencascade实体对象在VTK中进行渲染。 一、vtk嵌入qt 通过查看VTK的开发文档发现&#xff0c;vtk嵌入qt可以通过将QWidget提升为QVTKOpenGLNativeWidget实现&#xff0c;在qtdesigner中事例…