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,一经查实,立即删除!

相关文章

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,或明显或隐含。 “器”的应用…

利用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代码中使用…

zookeeper介绍 和 编译踩坑

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

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

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

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的书写格式

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

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

高精度减法的实现

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

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

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

实现搜索功能中搜索内容高亮效果,本文通过fuzzysort库方案实现

目录 一&#xff1a;fuzzysort1.fuzzysort 介绍&#xff1a;2.需求所用方法介绍:gohighlight 3.效果实现 一&#xff1a;fuzzysort 1.fuzzysort 介绍&#xff1a; fuzzysort 是一个 JavaScript 库&#xff0c;用于对字符串数组进行模糊搜索和排序。它特别适用于自动补全&#…

Docker安装Nginx(各种错误版)

Docker安装-CSDN博客 安装启动Docker之后 docker run -d -p 81:81 --name nginx nginx 这样没有指定版本 docker run&#xff1a;启动一个新的容器。-d&#xff1a;以分离模式运行容器&#xff08;后台运行&#xff09;。-p 81:81&#xff1a;将主机的 81 端口映射到容器的 …

【网络安全学习】使用Kali做渗透情报收集-01-<域名信息主机信息>

1.收集开源情报 开源情报(Open Source Intelligence&#xff0c;OSINT)是指从各种公开的渠道中寻找和获取有价值的信息 如&#xff1a;互联网、媒体、社交网络、公共数据库等开源情报具有以下特点&#xff1a; - 丰富性&#xff1a;开源情报涵盖了各种类型和领域的信息 - 可…

Linux---系统的初步学习【项目一:Linux操作系统的安装与配置】

项目一 Linux操作系统的安装与配置 1.1 项目知识准备 1.1.1 操作系统是什么&#xff1f; ​ 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理硬件、决定程序运行的优先次序、管理文件系统等…

WPF中的隧道路由和冒泡路由事件

文章目录 简介&#xff1a;一、事件最基本的用法二、理解路由事件 简介&#xff1a; WPF中使用路由事件升级了传统应用开发中的事件&#xff0c;在WPF中使用路由事件能更好的处理事件相关的逻辑&#xff0c;我们从这篇开始整理事件的用法和什么是直接路由&#xff0c;什么是冒…

WDF驱动开发-同步技术

使用自动同步 基于框架的驱动程序中几乎所有的代码都驻留在事件回调函数中。 框架会自动同步驱动程序的大部分回调函数&#xff0c;如下所示&#xff1a; 框架始终将 常规设备对象、 功能设备对象 (FDO) 和 物理设备对象 (PDO) 事件回调函数同步&#xff0c;以便每个设备一次…

Java高阶数据结构-----并查集(详解)

目录 &#x1f9d0;一.并查集的基本概念&实例&#xff1a; &#x1f92a;二.并查集代码&#xff1a; &#x1f602;三&#xff1a;并查集的一些习题&#xff1a; A.省份数量 B.等式方程的可满足性 &#x1f9d0;一.并查集的基本概念&实例&#xff1a; 并查集概念&…

向量化在人工智能领域的深度实践:技术革新与效率提升

在人工智能&#xff08;AI&#xff09;的飞速发展中&#xff0c;向量化技术作为一种基础且关键的数据处理手段&#xff0c;正日益受到广泛关注。向量化是将文本、图像、声音等数据转换为数值向量的过程&#xff0c;这些向量能够表示原始数据的特征和语义信息&#xff0c;为深度…

13.ChatGPT 大模型训练核心技术

ChatGPT 大模型训练核心技术 从 GPT-3 到 ChatGPT 的大模型训练技术演进 基于RLHF训练大模型的三阶段 • Domain Specific Pre-Training: Fine-tune a pre-trained LLM on raw text with a Causal Language Modelling Objective.• Supervised fine-tuning: Fine-tune the do…

外网访问公司内网服务器?

【天联】组网天联可以解决不同地区电脑与电脑、设备与设备、电脑与设备之间的信息远程通信问题。在全国各主要节点部署加速服务器&#xff0c;实现在低带宽、跨运营商的网络环境下高速访问&#xff1b;这为公司内网服务器提供了一个可行的外网访问解决方案。 在现代办公环境中…