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.mzph.cn/diannao/27592.shtml

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

相关文章

【bugfix】解决Redis缓存键清理问题

前言 在Spring Boot应用中集成Redis作为缓存存储时,合理配置RedisTemplate是确保数据正确存储和检索的关键。本文将通过对比分析一段初始存在问题的Redis配置代码及其修正后的版本,探讨如何正确处理Redis键前缀,以避免清理缓存时遇到的问题。…

Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.

brew search oracle-jdk或brew search --cask oracle-jdk 原因:Homebrew官方仓库不再维护多个旧版本的OracleJDK 不推荐使用Homebrew环境安装JDK //指定版本安装 brew install --cask temurin17 //设置 JAVA_HOME 环境变量 //找到安装的JDK 版本的路径 /usr/lib…

探索测试分享

1. “器” 项目中的实践——我们是怎么做的 本章将带你身历其境的感受到思想和方法是如何具体使用在项目里的 1.如何挖掘探索性测试的探索点,在任何阶段都可以利用探索测试策略找到可探索的点,发现产品中的bug,或明显或隐含。 “器”的应用…

分布式管理

一、基本概念 分布式管理是指在一个由多个独立计算机节点组成的分布式系统中,通过对这些节点的资源、服务、数据进行统一的协调、控制和优化,以实现整个系统的高效、稳定、可靠运行。 二、核心原理 无中心化:分布式系统没有一个中心节点来…

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 锐化效果

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 锐化效果 核心代码完整代码在线示例ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类,可以添加数据以及操作 FBO(ManagedFBO); 通过操作 FBO,可以通过后处理实现很多效果,官方提供了几个示例,…

利用74HC165实现8路并行输入口的扩展

代码&#xff1a; #include <mega16.h>// Declare your global variables here #define hc165_clk PORTB.0 #define hc165_lp PORTB.1 #define hc165_out PINB.2unsigned char read_hc165(void) {unsigned char data0,i,temp0x80;hc165_lp0;hc165_lp1; for(i0;i<7;i)…

汇编:内联汇编和混合编程

C/C内联汇编 C/C 内联汇编&#xff08;Inline Assembly&#xff09;是一种在C或C代码中嵌入汇编语言指令的方法&#xff0c;以便在不离开C/C环境的情况下利用汇编语言的优势进行性能优化或执行特定的硬件操作。以下是一些详细的说明和示例&#xff0c;展示如何在C和C代码中使用…

c++ 中 namespace包的 全局变量 c++ 中 static 全局变量 会给初值吗

在 C 中&#xff0c;命名空间&#xff08;namespace&#xff09;中的全局变量会被自动初始化为零值&#xff08;zero-initialized&#xff09;&#xff0c;除非显式地为其指定初始值。与静态全局变量类似&#xff0c;命名空间中的全局变量在程序启动时会被初始化&#xff0c;其…

zookeeper介绍 和 编译踩坑

zookeeper 分布式协调服务 ZooKeeper原理及介绍 - 鹿泉 - 博客园 Zookeeper是在分布式环境中应用非常广泛&#xff0c;它的优秀功能很多&#xff0c;比如分布式环境中全局命名服务&#xff0c;服务注册中心&#xff0c;全局分布式锁等等。 本项目使用其分布式服务配置中心&am…

Java:访问权限修饰符

文章目录 一、访问权限修饰符二、权限修饰符的分类 一、访问权限修饰符 访问权限修饰符&#xff0c;就是控制类中的属性和方法的被访问范围。 二、权限修饰符的分类 作用范围&#xff1a;private < 空着不写 < protected < public 修饰符同类同包不同类不同包下子类…

Minecraft模组开发(fabric)之准备工作

Minecraft模组开发&#xff08;fabric&#xff09;之准备工作 最近心血来潮想开发个Minecraft的模组&#xff0c;一边学习一边开发&#xff0c;顺带着将一些步骤、学习心得整理下来。之所以选择fabric&#xff0c;是因为自己的光影包使用的是iris-fabric&#xff0c;所以就想着…

深度学习-使用 Bash 脚本

在深度学习领域&#xff0c;Bash 脚本通常用于管理和自动化训练模型、数据预处理、后处理以及环境设置等任务。虽然 Bash 脚本本身并不直接参与深度学习的计算&#xff0c;但它在简化工作流程和提高效率方面扮演着重要角色。以下是一些使用 Bash 脚本的理由&#xff1a; 自动化…

Vue41-vc实例与vm实例

一、 vc实例与vm实例的区别 vc实例与vm实例&#xff0c;99%结构都是类似的&#xff0c;仅2点不同&#xff1a; el属性data的书写格式 1-1、 el属性 vc有的功能vm都有&#xff0c;但是vm能通过el决定为哪个容器服务&#xff0c;但是vc却不行&#xff01; 1-2、data的书写格式

【PythonCode】力扣Leetcode26~30题Python版

【PythonCode】力扣Leetcode26~30题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C…

XML 编辑器:功能、选择与使用技巧

XML 编辑器&#xff1a;功能、选择与使用技巧 简介 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。由于其灵活性和广泛的应用&#xff0c;XML编辑器成为开发者、数据管理者和内容创作者的重要工具。本文将探讨XML编辑器的功能、选择标准以及…

python,django好的get和post请求

获得get请求 df request.GET.get("dades")获得post请求 文件settings.py关闭csrf MIDDLEWARE [ ‘django.middleware.security.SecurityMiddleware’, ‘django.contrib.sessions.middleware.SessionMiddleware’, ‘django.middleware.common.CommonMiddleware’…

简单的Scikit-Learn入门示例

以下是一个简单的Scikit-Learn入门示例&#xff0c;该示例使用鸢尾花&#xff08;Iris&#xff09;数据集来演示分类问题的基本步骤。这个数据集包含了150个样本&#xff0c;每个样本有四个特征&#xff08;花萼长度、花萼宽度、花瓣长度、花瓣宽度&#xff09;&#xff0c;以及…

unity38——MemoryProfiler性能分析器,截帧分析当前性能占用率的具体文件

定义&#xff1a;性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备&#xff0c;从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器&#xff0c;从而在开…

高精度减法的实现

这是C算法基础-基础算法专栏的第八篇文章&#xff0c;专栏详情请见此处。 引入 上次我们学习了高精度加法的实现&#xff0c;这次我们要学习高精度减法的实现。 高精度减法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的…

显著提高iOS应用中Web页面的加载速度 - 提前下载页面的关键资源(如JavaScript、CSS和图像)

手动下载并缓存资源是一种有效的方式&#xff0c;可以确保在需要时资源已经在本地存储&#xff0c;这样可以显著提高加载速度。 缓存整个 web 页面的所有资源文件 具体实现步骤 下载和缓存资源&#xff1a;包括 HTML 文件、CSS、JavaScript 和图像。在应用启动时预加载资源。…