图形API学习工程(30):尝试使用panorama来代替Cubemap作为全景图

news2024/11/25 6:44:58

工程GIT地址:https://gitee.com/yaksue/yaksue-graphics

前言

为了能得到全方位的光照数据,我之前学习了使用CubeMap作为全景图。CubeMap包含六张贴图对应了上下左右前后六个方向的数据。但是最近在下载全景图的资源时,看到很多并非是CubeMap的格式,而是Panorama的格式,就像从这里下载的数据。Panorama是一个单张的贴图。所以为了能使用这些数据,我想我也应该实现对这种格式的采样。

目标

学习 CubeMap 和 panorama 这两种全景图格式。
在工程中实现 panorama 的采样来代替CubeMap。

CubeMap 和 Panorama

CubeMap是六张贴图,对应了上下左右前后六个方向的数据。
Panorama是一个单张的贴图,但是也包含了所有的方向。
在这里插入图片描述
二者可以相互转换:(不过从理论上讲,这种转换应该不是无损的)

Panorama转CubeMap:https://jaxry.github.io/panorama-to-cubemap/

CubeMap转Panorama:https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html

接下来,我就用上面CubeMap转Panorama的工具,生成当前工程里所用的天空盒的Panorama版本(各个面的对应关系需要注意,详见附录)。然后对其采样,理论上效果应和CubeMap版本一致。

采样Panorama贴图

我本想在网上找一个比较权威的采样方式,但可惜没找到。后来意识到,大概是因为本身比较简单,毕竟采用极坐标的方式采样是很自然的想法。

我这里就尝试用极坐标的方式,具体的对应关系如下:
在这里插入图片描述
在shader中,将一个三维方向转换成一个极坐标最后转换为采样贴图UV的代码如下:(这里以Y轴正方向为向上方向,以Z轴正方向为方位角0度的方向)

//将一个三维方向转换为采样Panorama贴图的UV
float2 PanoramaUV(float3 direction)
{
	//用极坐标作为采样Panorama贴图的UV

	//首先,以下面的对应关系来构建一个极坐标系:
	//Y轴正方向 = 极轴的正方向(“向上”的方向)
	//Z轴正方向 = 方位角为0度的方向

	//使用正弦来计算极角
	//极角,弧度制,范围[-pi/2,pi/2]:
	float polar = asin(direction.y / length(direction));

	//先算出与Z轴正方向的夹角:
	float angle_between_Z = acos(direction.z / length(direction.xz));
	//由于Z轴正方向两边的角度是镜像的,所以需要再乘算上X方向的正负性来做区分才能算出方位角
	//方位角,弧度制,范围[-pi,pi]:
	float azimuth = angle_between_Z * (direction.x / abs(direction.x));

	//将极坐标转换为采样2D贴图的坐标:
	float2 result;
	result.x = azimuth / PI / 2 + 0.5;  //将方位角范围映射到[0,1]
	result.y = 1.0 - (polar / PI + 0.5);//先将极角范围映射到[0,1],然后再翻转,因为V的正方向朝下

	return result;
}

效果

和预期一样,和CubeMap的效果一致。
在这里插入图片描述
也测试下在这里下载的数据:
在这里插入图片描述

问题

对于当前工程里的D3D12版本来说,有条1像素宽的忽隐忽现的黑线:
在这里插入图片描述
对于当前工程里的D3D11版本来说,有条2像素宽的忽隐忽现的黑线,在极轴的两端还有黑点。
在这里插入图片描述
初步怀疑和纹理在边界的采样设置有关,具体待后续研究。

附录:用链接里的工具转换时,CubeMap各个面对应关系

上下保持不变,其他四个方向对应如下:
在这里插入图片描述

在这里插入图片描述
结果如下:
在这里插入图片描述

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

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

相关文章

Python基于Django的毕业设计论文提交过程管理系统

项目介绍 在各学校的教学过程中,django过程管理系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的django过程管理系统的平台,这…

c#入门-访问基类成员

调用基类构造器 在构建派生类前,会首先构建出完整的基类。 即便是派生类无权访问的成员,也会存在。 因此才能保证派生类能完全地当作基类来使用。 因此,在执行派生类的构造器前,首先需要先调用基类的构造器。 而如果基类没有&am…

017 | 精准扶贫视野下非遗传承的研究与启示——以三峡皮影为例 | 大学生创新训练项目申请书 | 极致技术工厂

(一)研究目的 百年党建视域下,全面建成小康社会的历史目标已成功达成,但东西部经济发展的不平衡、不平均依旧是新时代发展中亟需解决的问题。坚持党的领导,响应西部大开发的战略号召,本团队深入探访于2018…

S2SH药膳馆会员管理系统计算机专业毕业论文java毕业设计开题报告

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH药膳馆会员管理系统-IT实战营_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzygog…

基于jsp+mysql+ssm足球新闻发布网站-计算机毕业设计

项目介绍 同完成整个足球新闻发布系统的设计开发。系统实现的功能主要包括:前台浏览足球新闻的功能;后台用户在成功登录该系统的后台时,可以对用户、足球新闻类别、足球新闻、留言进行添加、修改和删除等功能;以及对用户名密码等…

Arthas(Java 应用诊断利器)

文章目录Arthas使用背景Arthas(阿尔萨斯)能做什么?Arthas Spring Boot StarterArthas Arthas 是由Alibaba开源的Java监控诊断工具,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情…

Pytorch中的损失函数

L1损失函数:又称,L1 范数损失、最小绝对值偏差(LAD)、最小绝对值误差(LAE) MAE也是指L1损失函数。 把目标值 yi 与模型输出(估计值) f(xi) 做绝对值得到的误差。 通常用于回归任务、…

uniapp实战仿写网易云音乐(二)—promise接口请求的封装和主页功能的实现,组件封装

文章目录前言promise请求接口的封装主入口功能的实现:推荐歌单模块新碟新歌模块精选视频模块最后前言 本篇文章继续完成上篇文章的部分,主要实现prromise接口的封装和首页主入口的实现 promise请求接口的封装 在上篇文章中请求我们是这样写的&#xf…

(详细及解决方法)关于Vue.prototype中定义的变量不是响应式

目录 一、背景 二、原因 三、解决方法 四、扩展 当时第一眼看到下面的图,就想这个不会是写错了吧,咋还能这样写,在这里我承认,我以前说话确实很大声了 一、背景 在项目中需要将全局变量存放到Vue的实例对象上面 Vue.protot…

【历史上的今天】12 月 13 日:时代杂志将“你”评为年度人物;苹果发布 AirPods;互联网传出欧洲

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2022 年 12 月 13 日,国家公祭日。从 2014 年开始,12 月 13 日被定为缅怀先烈的国家公祭日,网站也会在这一天变为全灰色&#xff0c…

墙裂推荐c++的学习网站(OJ)

目录 墙裂推荐OJ 墙裂推荐学习软件 墙裂推荐线上编辑器 墙裂推荐OJ 要想学好c,更好的OJ少不了啊!!! 为了让诸多小白们有更好的学习测试环境,特此准备了一下几个OJ, 1.Openjudge 网站: OpenJudge openjudge网站中储存着大量的题目,而且还提前帮你们把板块分好了,就问你们…

[Java] HashMap是如何实现的?扩容机制是什么?树化机制知道吗?结合源码带你理解HashMap的原理。

文章目录前言HashMap是什么?Map接口散列表(HashTable)HashMap的扩容机制扩容机制?扩谁的容?HashMap的容量(Capacity)属性HashMap的扩容因子(load factor)属性HashMap的树…

【js逆向基础】crypto 之 hash和hmac

▒ 目录 ▒🛫 导读需求开发环境1️⃣ hash对象创建Hash常见方法例封装成 stream 实例封装成管道流(piped stream)2️⃣ hmac对象创建Hmac常见方法例封装成 stream 实例封装成管道流(piped stream)🛬 文章小结📖 参考资…

mysql学习---流程控制函数(条件判断)case when ,if使用

文章目录流程控制函数流程控制函数的介绍流程函数的使用流程控制函数 流程控制函数的介绍 if(value,value1,value2) 解释:如果value的结果为true ,返回value1,否则返回value2 例如: select if(1>0,正确,错误) ->正确ifnull(value1,val…

Babel快速入门

一、简介 Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行执行。 这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持。 二、安装 安装命令行转码工具 Babel提供babel-cli工具&#xff…

Mysql调优(三)——通过索引进行优化、 查询优化

接上:Mysql调优(二)——schema与数据类型优化、执行计划 本篇文章在一定程度上与下面两篇文章重合,笔者建议优先读下面两篇文章,本文偏向概念,而它们偏向原理: Mysql索引的本质深入浅出&#x…

全栈Jmeter接口测试(五):json提取器元件及jsonpath介绍,响应断言元件

Jmeter(10):json提取器元件及jsonpath介绍 json提取器元件介绍: json提取器与正则表达式提取器功能类似,也是用来截取响应信息的部分保 存到指定的变量中去,不同的是,它只能用来处理响应正文,并且响应正文…

ITE Super IO 学习 – 串口

串口都算是一个比较古老的功能了,也就是比较成熟了。Super IO中的大部分是硬件已经做好的,BIOS这边只需做小小的改动甚至默认便可以工作了。 串口寄存器 串口有关的寄存器总的来说有4个,两个用来设置IO资源的地址,一个是中断号选择,还有一个特殊配置寄存器。 Seri…

高级路由期末命令配置

文章目录前提要求(1)拓扑图搭建及IP地址规划拓扑图配置:IP地址表规划表1网络连接规划表表2 网络设备明细表表3 IP规划表(2)OSPF(3)BGP(4)路由引入(5)路由选择&#xff08…

PicoDet代码学习记录

推理步骤 [picodet_s_320_coco.yml] Infer.py main()->run()Trainer.py __init__() self.model create(cfg.architecture) Picodet.py from_config()->__init__() head create(cfg[head], **kwargs)时候调用: Layers.py MultiClassNMS __…