OpenGL3.3_C++_Windows(24)

news2024/11/25 11:41:08

渲染平行光阴影

  • 阴影作用:

  • 有了阴影的渲染,更容易地区分出物体之间的位置关系,
  • 如何判断片段是否在阴影中?
  • 普通思路:

  • 以光的位置为视角进行渲染,我们绘制一条从光源出发的射线,测试更新射线经过的所有片段,与当前min最近片段比较,如果更远,就在阴影中
  • 弊端:

  • 射线上的成千上万个点进行遍历是个极端消耗性能,所以换种思路,利用深度缓冲
  • 深度缓冲:

  • 深度缓冲大小符合窗口的宽高,当运行深度测试时,每个像素的深度值和已经存储在这个像素的深度值(深度缓冲)进行比较,根据深度测试函数,决定片段是否丢弃
  • 深度/阴影/shadow Mapping贴图

  • 从光源的透视图来渲染场景,并把深度值的结果储存到纹理中,深度值因为会不断测试更新,最后的结果,就是最近的片段的深度值,通过纹理坐标,可以对它进行采样,获取深度值
  • T变换

  • 来自光源的视图投影矩阵,可以将任何三维位置(从世界坐标)转变到光源的可见坐标空间
  • 如何利用深度贴图判断片段是否在阴影中?

  • 首先T变换到光源的坐标空间里,使用生成的深度贴图计算片段是否在阴影之中,z深度 如果 > 片段的深度缓冲的深度值,则在阴影中

运算:

  • 创建新的帧缓冲

  • 因为要对深度值采样,所以应存储在纹理附件(非渲染缓冲对象附件),应用的纹理格式为GL_DEPTH_COMPONENT,
  • 注意:不包含颜色缓冲的帧缓冲对象是不完整的,所以我们需要显式告诉OpenGL我们不适用任何颜色数据进行渲染。glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE);
  • 平行光源空间的T变换矩阵

  • LookAt()计算光(位置+看的方向)的view矩阵(实质,将物体坐标变换到相机坐标的视角下),

  • 如果使用一个所有光线都平行的定向光,使用正交投影矩阵,否则点光源和聚光灯,使用透视投影矩阵(因为投影矩阵实质,是决定可见的范围,以及范围的形状,光空间的范围,即光线的散射组成的范围,被光覆盖的范围)

  • 渲染到深度贴图

  • 启用帧缓冲,渲染场景,使用的新glsl中,将每个顶点变换到光空间,从而深度值保存到了深度纹理附件中,fragment什么都不用做,我们只需要深度缓冲(默认更新),也可以手动设置gl_FragDepth = gl_FragCoord.z;
  • //深度缓冲视觉化

  • 这次渲染quad,并应用深度纹理附件作为quad 的纹理。
  • 但是注意:正交不受深度值影响,透视投影矩阵,当深度缓冲视觉化经常会得到一个几乎全白的结果,深度变成了非线性的深度值,只有距离很近,颜色亮度才会骤降。
  • 解决方案就是变为线性深度值。
深度缓冲视觉化
  • 渲染阴影:Fragment glsl

  • 将要产生阴影的物体,在vs中将世界空间顶点位置转换为光空间,传入fs,计算出一个shadow值,当fragment在阴影中时是1.0,在阴影外是0.0
  • 将(1 - shadow )* 其他冯氏颜色分量(由于当shadow = 1的时候(在阴影),结果颜色为0),由于阴影不会是全黑的,把ambient分量从乘法中剔除。
  • 这样保证,当片断位于阴影,结果为ambient * 其他冯氏颜色分量,当非阴影 = ((ambient + 1 * 其他冯氏颜色分量
  • 计算阴影():

  • 光空间的片段位置(被判断的像素)和第一个渲染阶段得到的深度贴图(取深度值)
    • 光空间片段位置转换为裁切空间的标准化设备坐标。
    • 当运行到gl_Position时,OpenGL自动进行一个透视除法,x、y、z元素除以向量的w元素来实现,我们必须自己做透视除法
    • 因为来自深度贴图的深度在0到1的范围,我们再次将NDC坐标变换为0到1的范围
    • 从深度贴图,采样片段坐标,对应的深度值,如果片段的z高于采样的深度值,则表明片段在阴影中,返回1,否则返回0 

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

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

相关文章

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

seq2seq原理介绍

视频介绍 seq2seq 一、介绍 Seq2Seq模型,即序列到序列模型,是一种深度学习架构,它能够接收一个序列作为输入,并通过特定的生成方法生成另一个序列作为输出。这种模型的一个关键特点是,输入序列和输出序列的长度可以是…

恢复策略(下)-事务故障后的数据库恢复、系统故障后的数据库恢复(检查点技术)、介质故障后的数据库恢复

一、数据库恢复-事务故障 系统通过对事物进行UNDO操作和REDO操作可实现故障后的数据库状态恢复 1、对于发生事务故障后的数据库恢复 恢复机制在不影响其他事务运行的情况下,强行回滚夭折事务,对该事务进行UNDO操作,来撤销该事务已对数据库…

【Python系列】Python 项目 Docker 部署指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Hadoop3:MapReduce中的ETL(数据清洗)

一、概念说明 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库&#…

bgr24包装为bmp图像

code void BGR24ToBMP(const int width, const int height, uint8_t *framedata, const char *outfile) {BITMAPFILEHEADER bmp_header; // 声明BMP文件的头结构BITMAPINFOHEADER bmp_info; // 声明BMP文件的信息结构unsigned int data_size (width * 3 3) / 4 * 4 * heig…

springboot系列六: springboot底层机制实现 下

实现SpringBoot底层机制[Tomcat启动分析 Spring容器初始化 Tomcat如何关联Spring容器] 实现任务阶段1-创建Tomcat, 并启动🥦说明:创建Tomcat, 并启动🥦分析代码实现🥦完成测试 实现任务阶段2-创建Spring容器🥦说明&a…

isdigit()方法——判断字符串是否只由数字组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isdigit()方法用于判断字符串是否只由数字组成。isdigit()方法的语法格式如下: str.isdigit() 如果字符串只包含数字则返回T…

路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab) 1.利用蜣螂算法DBO优化栅格地图机器人路径规划,效果如图所示,包括迭代曲线图、栅格地图等等&#xff5e…

014、Flask模板在数据可视化中的深度应用

目录 Flask模板在数据可视化中的深度应用 1. Flask模板系统简介 1.1 Jinja2模板语法基础 1.2 Flask中渲染模板 2. 静态图表生成 2.1 使用Matplotlib生成图表 3. 交互式图表:使用Charts.js 3.1 创建柱状图 3.2 创建折线图 4. 高级交互式可视化:…

记某次攻防演练:大战UEditor并突破

前言 最近参与某次攻防演练,通过前期信息收集,发现某靶标单位存在某域名备案。 通过fofa搜索子域名站点,发现存在一个子域名的61000端口开放着一个后台,于是开始进行渗透。 目录扫描 进行目录扫描吗,发现/bin.rar路径…

Vue3实现点击按钮实现文字变色

1.动态样式实现 1.1核心代码解释: class"power-station-perspective-item-text": 为这个 span 元素添加了一个 CSS 类,以便对其样式进行定义。 click"clickItem(item.id)": 这是一个 Vue 事件绑定。当用户点…

Springboot与xxl-job

一、下载xxl-job项目 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 从GitHub上面将项目clone下来,如果网络问题导致速度慢也可以从Gitee上面拉…

Apache POI Excel 处理最佳实践

1、需求背景 问题的背景是在需求设计的时候 ,我们在业务专家的配合下设计了一些表,但是为了方便的和他们讨论我们把表结构的描述通过Excel文件的方式记录了下来,然后我们需要根据excel文件中的内容生成对应的DDL。今天就给大家分享一下我们的…

python-求出 e 的值

[题目描述] 利用公式 e11/1!1/2!1/3!⋯1/𝑛!,求 e 的值,要求保留小数点后 10 位。输入: 输入只有一行,该行包含一个整数 n,表示计算 e 时累加到1/n!。输出: 输出只有一行,该行包含计…

解锁数据资产的无限潜能:深入探索创新的数据分析技术,挖掘其在实际应用场景中的广阔价值,助力企业发掘数据背后的深层信息,实现业务的持续增长与创新

目录 一、引言 二、创新数据分析技术的发展 1、大数据分析技术 2、人工智能与机器学习 3、可视化分析技术 三、创新数据分析技术在实际应用场景中的价值 1、市场洞察与竞争分析 2、客户细分与个性化营销 3、业务流程优化与风险管理 4、产品创新与研发 四、案例分析 …

单片机的学习(15)--LCD1602

LCD1602 14.1LCD1602的基础知识1.LCD1602介绍2.引脚及应用电路3.内部结构框图4.时序结构5.LCD1602指令集6.字符值7.LCD1602操作流程 14.2LCD1602功能函数代码1.显示一个字符(1)工程目录(2)main.c函数(3)LCD…

mysql8.0-学习

文章目录 mysql8.0基础知识-学习安装mysql_8.0登录mysql8.0的体系结构与管理体系结构图连接mysqlmysql8.0的 “新姿势” mysql的日常管理用户安全权限练习查看用户的权限回收:revoke角色 mysql的多种连接方式socket显示系统中当前运行的所有线程 tcp/ip客户端工具基于SSL的安全…

error: Sandbox: rsync.samba in Xcode project

在Targets 的 Build Settings 搜索:User script sandboxing 设置为NO

什么是TOGAF?TOGAF应用场景有哪些?TOGAF优缺点

一、什么是TOGAF? TOGAF,全称The Open Group Architecture Framework,即开放组体系结构框架,是由国际开放标准组织The Open Group制定的一套企业架构(Enterprise Architecture, EA)框架。 The TOGAF Libra…