Half-Pixel Offset 究竟是个什么鬼?

2023-11-01 11:40
文章标签 究竟 pixel half offset

本文主要是介绍Half-Pixel Offset 究竟是个什么鬼?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

友情提示 Half-Pixel Offset 其实算是个过时话题,请依据个人情况谨慎了解 :)

讲述之前我们先明确几个概念:

  • 窗口由正方形(注1)的像素(pixel)组成,每个像素只能显示一种颜色,并且像素坐标的原点在左上角像素的中心点(重要)

    以 3 * 3 的窗口为例

  • 纹理也是由正方形的纹素(texel)组成,每个纹素代表一种颜色,并且纹素坐标的原点在左上角纹素的左上角(重要)

    以 2 * 2 的纹理为例

  • 纹理的采样使用的是双线性(Bilinear)插值的方式(更多的细节可以看这里)

    以采样 2 * 2 的纹理的(0.5, 0.5)点为例

需要了解的概念就是这些,现在我们尝试在像素坐标的原点处绘制一个 2 * 2 大小的正方形,还记的像素坐标的原点是在像素的中心吗?我们想要绘制的正方形大概是这个样子:

示意图

由于像素是离散的,我们需要将绘制的正方形与像素尽可能的”对齐”(这里涉及到光栅化的规则,有兴趣的朋友可以去这里了解),所以实际绘制的正方形是这个样子的:

示意图

考虑到我们是从像素坐标的原点开始定义正方形的,所以上图所示的实际绘制结果也是符合预期的(正方形左上角与窗口左上角是对齐的)

现在我们想要将上面的纹理映射到刚才所绘制的正方形上去,为此我们需要为正方形的每个顶点计算纹素坐标,计算过程很简单,相关结果如下图所示:

示意图

简单想象一下,通过上面的纹理映射,我们期望得到的绘制结果是这个样子的:

示意图

但实际上,我们得到的绘制结果却是这个样子的:

示意图

什么鬼 ?

不急,我们来简单梳理一下~

回忆一下最开始需要绘制的的正方形示意图,我们在上面标注下纹素坐标:

示意图

根据上图中像素对应的纹素坐标,我们可以计算出像素对应的纹素颜色(此处我们没有详细讲解计算的方法,不清楚的朋友可以理解为取纹素坐标附近的四个像素的加权平均值即可):

计算公式

于是我们便得到了上面那个令人诧异的绘制结果~

怎么修正这个问题呢?

一种方法是直接偏移像素的纹素坐标,拿上面的正方形绘制为例,我们在采样纹素点(0, 0)时做一个(0.25, 0.25)的偏移,即采样(0 + 0.25, 0 + 0.25)点的纹理,这样我们便能采样到预期的纹理颜色了

不过更通用的做法,还是直接偏移顶点的像素坐标,仍然拿上面的正方形绘制举例,我们对正方形的各个顶点做一个(-0.5, -0.5)像素的偏移,那么实际绘制的正方形就是这个样子的:

示意图

此时,各个像素中点对应的纹素坐标如下图所示:

示意图

根据纹素坐标计算一下像素颜色即可发现我们采样到了预期的纹理颜色:

计算公式

而上述那么(-0.5, -0.5)的像素偏移,即是 Half-Pixel Offset

Half-Pixel Offset 只会在 Direct3D 9 及之前的Direct3D版本上出现,本质原因是像素坐标和纹素坐标定义不一致,OpenGL的像素坐标和纹素坐标定义是一致的,Direct3D 10以后也统一了像素坐标和纹素坐标的定义, Half-Pixel Offset 的问题也就不再存在了

如果你对于这个话题还有进一步了解的兴趣,可以再看看这里,这里,这里,和这里

注1 : 严格来讲,像素是点,而不是正方形

这篇关于Half-Pixel Offset 究竟是个什么鬼?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

算法备案究竟难在哪里?

算法备案究竟难在哪里? 在当今数字化社会中,算法备案已成为人工智能技术应用中的一个关键环节。然而,对于初学者和企业来说,这一过程充满了挑战和复杂性。本文将深入探讨算法备案的难度和应对策略。 算法备案的挑战 首先,算法备案要求申请者具备深厚的专业知识。要成功通过备案,不仅需要了解AI技术的细节,还必须熟悉相关的法律法规。例如,《互联网信息服务算法推荐管理规定》和《互联网信息服务深度合成管

滚动偏移量 scroll offset

滚动偏移量 scroll offset 一、获取滚动偏移量二、滚动事件性能三、使用场景 滚动偏移量(scroll offset):文档在垂直和水平方向上滚动的距离 一、获取滚动偏移量 // 获取上下滚动偏移量const scrollTop = window.pageYOffset || document.documentElement.scrollTop || docu

Orderby limit offset分页

SELECT * FROM table_name WHERE some_column = #{value} ORDER BY id LIMIT #{limit} OFFSET #{offset} // 假设你已经配置了 SqlSession try (SqlSession session = sqlSessionFactory.openSession()) { // 调用 countTotal

谈一谈一条SQL查询语句究竟是如何执行的?

这里写目录标题 理解执行流程衍生知识最后 本篇文章是基于《MySQL45讲》来写的个人理解与感悟。 理解 先看下图: 大体来说,MySQL可以分为Server层和存储引擎层两部分。就是对应着图中的两个圈。 server层包含查询缓存、分析器、优化器、执行器等,以及及所有的内置函数(如日期、时间…)所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存

offset of 和 container of 解析

在Linux源码中,经常看到大名鼎鼎offsetof 和 container of 的宏定义,这里就此进行解析,并做了实验验证用途,仅用于自己参考记录。   1. offsetof   主要作用是获取类型的偏移量   定义如下: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)   这里我们一层一层分析下of

jQuery 获取元素位置 offset() 和 position()

本篇文件向大家介绍的方法是 offset() 和 position() ,这两个方法有什么关系?下面的内容做详细介绍。 offset()功能描述:在匹配的元素集合中,获取的第一个元素的当前坐标,坐标相对于文档。 position() 功能描述:获取匹配元素中第一个元素的当前坐标,相对于offset parent的坐标。( 注:offset parent指离该元素最近的而且被定位过的祖先元素 )

苹果录屏功能究竟何在?深入探寻苹果设备上的录屏功能:简便、高效、一键达成

在当下这一数字化的时代,不论是教学演示,还是游戏分享,抑或是工作汇报,录屏软件皆已成为我们日常生活中不可或缺之工具。苹果设备以其出类拔萃的用户体验而声名远播,而其内置的录屏功能更是将便捷性与功能性精妙融合。今日,就让我们共同深入探究如何于苹果设备上轻松启用并运用录屏功能,使您的记录过程变得殊为简便。 苹果设备上的录屏功能极为直观且易于操作,以下为在不同苹果设备上启用和使用录屏功能的基本步

15年期权停交易的时候究竟发生了什么?期权零门槛开户怎么做?

今天带你了解15年期权停交易的时候究竟发生了什么事情?!加入50ETF期权市场的投资者们,都应该听过15年8月50ETF期权停交易事件,那么这一天究竟是怎么了呢?发生了什么呢? 15年8月50ETF期权停交易 8月7日上午,上证50ETF期权合约交易因技术原因出现涨跌停价格异常。上交所再上午9:56暂时停止了上证50ETF期权合约的交易。随后,上交所进行了紧急处置,排除了异常因素,下午14:0

cv.VideoCapture()的摄像头ID究竟是如何编码的?为什么有的是从700开始编码??彻底读懂它!

背景         最近在进行开发的时候,针对摄像头ID的问题总是让人恼火至极,有时候直接cv.VideoCapture(0)、cv.VideoCapture(1)就可以调用摄像头,有时候却需要cv.VideoCapture(700)或者cv.VideoCapture(701)才能调用摄像头。这给平台化开发带来了困难。 简述         在使用OpenCV的cv.VideoCaptur