#OSG+VS#第七周 关于osgearth中shadowing的理解

2023-10-29 17:30

本文主要是介绍#OSG+VS#第七周 关于osgearth中shadowing的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

成果总结:

本周三天工作日,完成两件事。

一是重写了shadowing.h和shadowing.cpp,因为直接修改原始的库代码不起作用,师姐说是因为我们的代码开头只是包含头文件,对应的.lib和.dll没有变化(实际运行的是dll)。(还是基础不够啊)

重写之后,还要修改类的命名(不与shadowing重复),删除命名空间,并在mainwindow中作相应修改。这样就能对其进行操作,修改参数看效果了。

尝试删除bias,发现屋顶的Peter panning基本消失,猜测整个房屋的阴影偏移应该也能解决,但是由于房屋是悬空的,所以不敢确定。也就不能进一步确定自投影问题是否完全解决。

二是弄懂shadowing.cpp的后半部分,也就是矩阵变换部分。


下面是我对整个shadowing.cpp的理解。

1.原理

shadow map深度纹理算法分为两步,首先将视点放在光源位置,得到此时的深度图,将光源距最近物体的距离(depth)与每个纹理坐标采样点的深度(c.z-bias)比较,判断是否处于阴影中;再将视点放在正常的观察位置,正常渲染出光亮和阴影。

2.代码

cpp文件的主体可分为两个部分,(按代码的书写顺序)一是GLSL着色语言部分,对深度的判断和着色;二是矩阵变换,投影变换用于第一部分深度判断。所以还是从矩阵变换开始讲。


(图片来自网上)

osg::Matrix MV = *cv->getModelViewMatrix();osg::Matrix inverseMV;inverseMV.invert(MV);
↑得到模型视图矩阵。

osg::Vec4d lp4 = _light->getPosition();osg::Vec3d lightVectorWorld( -lp4.x(), -lp4.y(), -lp4.z() );lightVectorWorld.normalize();osg::Vec3d lightPosWorld = osg::Vec3d(0,0,0) * inverseMV;//视点坐标系下的视点(0,0,0)在世界坐标系下为:Pworld=(0,0,0)* MV逆
↑得到光源的世界坐标。

osg::Matrix lightViewMat;lightViewMat.makeLookAt(lightPosWorld, lightPosWorld+lightVectorWorld, camUp);//相机放在光源位置to be a view matrix
↑得到光源的视图矩阵。
osg::Matrix proj = _prevProjMatrix;//cv->clampProjectionMatrix(proj, n, f);double fovy,ar,zn,zf;proj.getPerspective(fovy,ar,zn,zf);

这篇关于#OSG+VS#第七周 关于osgearth中shadowing的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302208

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态