GPU中的半格效应(half-pixel)

最近在阅读《GPGPU编程技术从GLSL、CUDA到OpenCL》时,章节3.4.3 卷积核中讲到了半格效应,该书中的英文标注为:0.5 effect,也有被称为:half pixel offset等。

联想到我之前的GPU计算、渲染时的代码,在做画质bittrue对分的时候,经常会因为GPU中的像素坐标漏掉了0.5的偏移量,而导致GPU输出图像和CPU算法原型无法bittrue对齐。具体可以查看我之前的两篇代码记录,对GPU像素坐标计算都有0.5的偏移量相关计算。

之前一直以为0.5的偏移量是GPU中可能存在四舍五入,现在看来我之前的理解都是错误的。正确的认识是:GPU会使用像素的中心点作为坐标值,也就是是[0.5, 0.5]这样,因此会存在0.5的偏移量。

下面转载、翻译相关的文章来解释这个效应/特性。

附录1:《GPGPU编程技术从GLSL、CUDA到OpenCL》 3.4.3 卷积核

纹理元是离散的,即不存在0.3个纹理元这样的概念。然而,纹理坐标是连续的,它们在GPU中是以浮点数表示的。在着色器中,GLSL内建变量glTexCoord[i]保存的纹理坐标自动对齐到了纹理元的几何中心。在这样的效应下,GPGPU使用纹理同CPU编程使用数组时的下标有所不同。举例来说,纹理图上的第三行、第二列的纹理元的坐标不是[1,2],而是[1.5,2.5],如图3- 11所示。

这个效应在GPGPU中称为半格效应(0.5 effect)。虽然纹理在经典GPGPU中起到的作用同数组完全一致(见 3.2.2节 第一部分关于纹理和数组的类比),但用户需要注意到像这样的用法差异。
半格效应

附录2:《Bilinear down/upsampling, aligning pixel grids, and that infamous GPU half pixel offset》

原文地址:https://bartwronski.com/2021/02/15/bilinear-down-upsampling-pixel-grids-and-that-half-pixel-offset/

什么是半像素偏移?
假设您有一个大小为4的一维纹理,那么它的像素/纹素坐标是什么?

如果我们向使用一维数组一样,直接按照下标来访问这4个像素,那么这4个像素的坐标理应是[0, 1, 2, 3],对应的坐标范围是[0, width - 1]

但GPU使用半像素偏移的约定,所以它们实际上是[0.5, 1.5, 2.5, 3.5],对应的坐标范围是[0.5, width - 0.5]。标准化(归一化)后的坐标值为:[0.5/4, 1.5/4, 2.5/4, 3.5/4],范围是:[0.5/width, 1 - 0.5/width]

GPU的半像素偏移这种表示法起初可能看起来不太直观,但它为我们提供了一个保证和约定:即图像的坐标范围(最大)可以表示为非标准化的[0, width - 1],或标准化后的[0, 1]

这对于重新采样图像和处理不同分辨率的图像非常有帮助。

让我们在下面的图表上进行比较,例如将大小为4的一维纹理,上采样为大小为8的一维纹理:半像素偏移约定通过对齐像素网格的角/边缘来完美对齐像素网格
图1:半像素偏,定通过对齐像素网格的角/边缘来完美对齐像素网格。

没有偏移约定可以完美对齐第一个像素中心 - 在 2 倍缩放的情况下,也可以完美对齐所有其他像素。但图像在 0,1 范围之外“重叠”并且不对称!
图2:没有半像素偏移,可以对齐第1个像素中心,直到最后一个像素的中心。但图像在 0,1 范围之外“重叠”并且不对称!

《The Center of the Pixel is (0.5,0.5)》

原文地址:https://www.realtimerendering.com/blog/the-center-of-the-pixel-is-0-50-5/

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

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

相关文章

TUP通信

一,概括 二,常用方法 三, 实现步骤(一发一收) 四,案例(一接一收) (1),客户端 (2),服务端 (3&…

歌手荆涛作品《父与子》:一首深情演绎父子情感的歌曲

在华语乐坛中,有很多歌曲以亲情为主题,其中歌手荆涛演唱的《父与子》就是其中的代表作之一。这首歌以朴实的歌词和深情的演唱,打动了无数听众的心灵,让人感受到了亲情之间的温暖和牵绊。 《父与子》这首歌以父子为主题&#xff0c…

【C++】类型转换 ④ ( 子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast )

文章目录 一、子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast1、构造父类和子类2、子类 和 父类 之间的类型转换 - 隐式类型转换3、子类 和 父类 之间的类型转换 - 静态类型转换 static_cast4、子类 和 父类 之间的类型转换 - 重新解释类型转换 reinterpret_cast5、…

【Java Spring】SpringBoot Bean详解

文章目录 1、Bean方法注解简介2、Bean注解重命名3、对象装配(获取Bean对象)3.1 对象装配之属性注入3.2 对象装配之Set 注入3.3 对象装配之构造方法注入 4、Resource VS Autowired5、Bean对象的作用域5.1 验证Bean对象的默认作用域5.2 Bean对象的六大作用…

论文解读:《数据增强:通过强化学习引导的条件生成进行文本数据扩充》

Title:<Data Boost: Text Data Augmentation Through Reinforcement Learning Guided Conditional Generation> 期刊&#xff1a;EMNLP &#xff08;顶级国际会议&#xff09; 作者 Ruibo Liu; Guangxuan Xu; Chenyan Jia; Weicheng Ma; Lili Wang; et al 出版日期 20…

基于Springboot的墙绘产品展示交易平台(有报告),Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的墙绘产品展示交易平台&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff0…

手势监听类GestureDetector Listener源码解析

手势监听类GestureDetector 前言一、GestureDetector是什么&#xff1f;二、Listener源码解析1.OnGestureListener2.OnDoubleTapListener3.OnContextClickListener4.SimpleOnGestureListener 总结 前言 在写自定义view的时候&#xff0c;涉及到了手势监听这块的知识&#xff0…

FLV 文件格式分析

前言 flv 是 flash video 的缩写&#xff0c;是 Adobe Flash payler 支持的一种流媒体播放格式。flv 是一种层级格式&#xff0c;除了一个 flv header 外&#xff0c;剩下全是由 一个个 tag 组成。tag 是由 tag 头和 tag 数据组成。tag 类型分为音频、视频、脚本&#xff0c;一…

交换机的VRRP主备配置例子

拓朴如下&#xff1a; 主要配置如下&#xff1a; [S1] vlan batch 10 20 # interface Vlanif10ip address 10.1.1.1 255.255.255.0vrrp vrid 1 virtual-ip 10.1.1.254vrrp vrid 1 priority 200vrrp vrid 1 preempt-mode timer delay 20 # interface Vlanif20ip address 13.1.1…

IDEA的安装与删除插件

不小心安装了一个英文转中文的插件&#xff0c;看不习惯&#xff0c;决定重新变回英文 先点击这个settings的安装 然后就看到这个下面这张图了 如果是安装就点install&#xff0c;不用了就和我一样把这个勾给去掉

MUI框架从新手入门【webapp开发教程】

文章目录 MUI -最接近原生APP体验的高性能前端框架APP开发3.25 开发记录miu框架介绍头部/搜索框&#xff1a;身体>轮播图轮播图设置数据自动跳转&#xff1a;九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器 心得与总结&#xff1a;MUI框架在移动应用开发中的应用M…

openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项

文章目录 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项133.1 检查openGauss状态133.2 检查锁信息133.3 统计事件数据133.4 对象检查133.5 SQL报告检查133.6 备份133.7 基本信息检查 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项 …

数据结构——利用堆进行对数组的排序

今天文章的内容是关于我们如何利用堆的特性对我们的数组进行排序&#xff0c;还有就是我们的TopK的问题&#xff0c;这次我们放在的是文件种&#xff0c;我们放入一亿个数字&#xff0c;然后我们取出一亿个数字中最大的十个数&#xff0c;利用上章堆的问题进行解决。 首先就是我…

【SQL Server2019SSMS】安装 | 卸载手册

目录 &#x1f4cb;前言 ⛳️【SQL Serverssms】安装 1. SQL Server自定义安装 2. SSMS安装 ⛳️【SQL Server】卸载 &#x1f4cb;前言 &#x1f308;个人主页&#xff1a;Sarapines Programmer &#x1f525; 系列专栏&#xff1a;本期文章收录在《宝藏工具使用手册》&am…

区块链介绍

区块链提供了比特币的公共账本&#xff0c;这是一个有序的、带有时间戳的交易记录。这个系统用于防止重复消费和修改之前的交易记录。 Introduction 比特币网络中的每个完全节点都独立存储只包含该节点验证的块的区块链。当多个节点在他们的区块链中都有相同的块时&#xff0…

00TDI 这件红色大衣也太适合过年穿了

分享女儿的时尚穿搭—红色大衣 这款大衣非常厚实 摸起来很软糯的触感 复合了660-700g绵羊绒 厚实度堪比一件厚实的羽绒服 门禁处做了立体的爱心装饰 精致又可爱&#xff01;&#xff01;&#xff01;

java--单继承、Object

java是单继承的&#xff0c;java中的类不支持多继承&#xff0c;但是支持多层继承。 反证法&#xff1a; 如果一个类同时继承两个类&#xff0c;然后两个类中都有同样的一个方法&#xff0c;哪当我创建这个类里的方法&#xff0c;是调用哪父类的方法 所以java中的类不支持多继…

【Linux】:信号的产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.通过终端按键产生信号 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 …

【云备份】数据管理模块

文章目录 1. 数据管理模块要管理什么数据&#xff1f;2. 数据管理模块如何管理数据&#xff1f;3. 数据管理模块的具体实现BackupInfo 数据信息类NewBackupInfo —— 获取各项属性信息 DataManager 数据管理类构造函数析构函数insert —— 新增update —— 修改GetOneByURL——…

数据结构之时间复杂度与空间复杂度

1.算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 比方说我们非常熟悉的斐波拉契数列&#xff1a; long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 递归实现方式非常简洁&#xff0c;但一定好吗&#xff1f;如何衡量其好与坏&#xff1f; 1…