研究纹理采样器在像素级别的采样位置

2024-09-06 23:38

本文主要是介绍研究纹理采样器在像素级别的采样位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

【纹理采样器】是一个基础的概念。假设有一个正方形面片,顶点的UV范围是0.0~1.0,那么在这个正方形面片上采样一张纹理时,会呈现出完整的纹理。

但我现在关注的问题是,在像素级别上,采样的位置是怎样的。具体来讲:对于UV值是(0.0,0.0)的点,它对应的采样位置是纹理最左上角像素的中心?还是纹理最左上角像素的左上角?即,下面左右哪个是正确的情况?
在这里插入图片描述
在宏观上,尤其是像素较多的时候,二者看起来应该差异很小。但,存在一些对像素级别的差异较为敏感的场合,因此需要对这个问题进行明确。

问题的答案是:右者

下面我想通过实验来验证这个答案。不过,就算不做实验,其实也能推理出来左边的情况是有问题的。

实验

我选择在UE4里做实验

测试用方形面片

方形面片直接将Plane拖入场景,可以认为它的UV是范围是0.0~1.0
在这里插入图片描述

测试用纹理

一个4×4像素尺寸的棋盘格状贴图:
在这里插入图片描述
将其拖入UE4中。
在这里插入图片描述

测试用材质

在这里插入图片描述

结果

在这里插入图片描述
这验证了最初的问题里确实右者是答案。因为:假设是左者,那么(0.0,0.0)位置对应了纹理左上角像素的中心,那么它一定是最黑的位置,但显然结果上(0.0,0.0)位置不是最黑的,(0.125,0.125)才是最黑的。

另一个更有说服力的结果

改变贴图的采样方式为Nearest(临近采样)
在这里插入图片描述
然后查看渲染结果:
在这里插入图片描述
假设一开始的问题是左者,那么第一个黑与白的分界线的位置应该是1/6处,但这里是1/4,显然一开始问题答案是右者

不需要实验的推理

首先,从上一部分的【另一个更有说服力的结果】也可以看到,假设采样的方式是按照左者进行,那么最终采样出的结果,势必和原图有较大差异,会是这样:
在这里插入图片描述
这将会一般性的认识相矛盾:在一般性的认识里,我用一个UV范围是0.0~1.0的面片进行采样,得到的结果一定是完整的纹理,而不是看起来“少了一圈”。


不过在我看来,最重要的是:如果使用左者进行采样,那么会使Tilling(重复平铺)出问题。

设想在左者采样方式下:
一个U方向上0.001(趋近于0.0稍微比0.0大)的位置,采样时的值将趋近于最左边像素的值;而一个0.999(趋近于1.0稍微比1.0小)的位置,采样时的值将趋近于最右边像素的值。然而0.0010.999在空间上是趋近的,因此在最左边像素不等于最右边像素时,势必会有颜色的跳变出现。而如果强制最左边像素等于最右边像素,那也意味着资源上的浪费。

而在右者采样方式下:
0.001采样时的值将趋近于最左边像素最右边像素的均值,而0.999也一样。

需要关注此问题的情况

正如开头提到,这个问题在大多数情况下不需要关注。

目前我意识到的需要关注这个问题的情况是:需要将顶点与实际纹理中像素对应起来的时候。
例如,对于n个依次排列的顶点,希望其对应纹理上依次排列的n个像素。那么对于X方向(或者说贴图上的U方向),第0个顶点不是0.0,最后一个顶点也不是1.0。而是比0.0~1.0的这个范围“缩小”一圈。即,第x01-n)个顶点的U值是:
U = x + 0.5 n U=\frac{x+0.5}{n} U=nx+0.5

这篇关于研究纹理采样器在像素级别的采样位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2

MySQL中隔离级别的使用详解

《MySQL中隔离级别的使用详解》:本文主要介绍MySQL中隔离级别的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言undo log的作用MVCC的实现有以下几个重要因素如何根据这些因素判断数据值?可重复读和已提交读区别?串行化隔离级别的实现幻读和可

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2