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

OpenGL ES 3.0核心技术解析与移动图形开发优化 OpenGL ES作为移动图形开发的核心标准,其3.0版本通过统一着色器架构、多渲染目标(MRT)等关键技术革新,显著提升了移动设备的图形处理能力。在图形渲染领域,可编程管线设计允许开发者通过GLSL ES着色语言实现更复杂的视觉效果,而ETC2纹理压缩等技术则解决了移动平台的内存带宽瓶颈。从工程实践角度看,合理运用实例化渲染、Transform Feedback等特性,可在华为等旗舰设备上实现40%的性能提升。针对Android/iOS跨平台开发,正确的EGL上下文配置和着色器预编译方案能有效降低300m 阅读详情

友情提示 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 : 严格来讲,像素是点,而不是正方形
使用GDAL查询tiff影像任意一点的高程 c++版本的,有详细注释,附有gdal的库,欢迎下载交流学习。 立即下载

相关推荐

【ShaderToy】开篇

写在前面呜呼,好久没有写博客了,好惭愧。题外话,感觉越大就越想家,希望可以一直和家人在一起,哪怕只是坐在一起不说话也觉得很温暖,一想到要分开眼睛就开始酸,哎。开学还是爬上来老实更新博客学习吧~今天爬上来一看,发现优快云的博客编辑终于更新了!进步总是好的,以前的编辑器实在很捉急。使用这种标记语言的确方便了很多,但好像颜色字体没法设置?程序员果然对美观没什么追求。ShaderToy如果你还没听过Sha

candycat 8万+

图像插值

1、最近邻插值 1)原理 最简单的插值方式,目标图像上(des_x,des_ y)处的像素值等于( (des_x, des_y)对应到源图像坐标为(src_x, xrc_y) ):距离(src_x, xrc_y)最近坐标点的像素值。 2)源码 tensorflow实现最近邻的源码如下: template <typename T, bool half_pixel_centers, bool align_corners> struct ResizeNearestNeighbor&lt..

weixin_42227520的博客 1129

Android 导出aar 用于Unity 百度语音唤醒

AndroidStudio版本下载地址Android Studio Arctic Fox Unity版本2021.3.26f1c1 新建AndroidStudio工程 新建module 这里注意一下,网上很多教程说要注意包名要和unity一样,但是测试下来,不一样也可以的 在新建的module里添加这两个jar包,并点击右键add as library 导入jniLibs 右键创建这几个package 代码就安装这个大佬的写参考代码 需要注意的的是在WakeupListener脚本里U

weixin_38777563的博客 633

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

最近在阅读时,章节3.4.3 卷积核中讲到了半格效应0.5 effect等。联想到我之前的GPU计算、渲染时的代码,在做画质bittrue对分的时候,经常会因为GPU中的像素坐标漏掉了0.5的偏移量,而导致GPU输出图像和CPU算法原型无法bittrue对齐。具体可以查看我之前的两篇代码记录,对GPU像素坐标计算都有0.5的偏移量相关计算。之前一直以为0.5的偏移量是GPU中可能存在四舍五入,现在看来我之前的理解都是错误的。[0.5, 0.5]0.5下面转载、翻译相关的文章来解释这个效应/特性。

YoungHong1992 1262

【数据分析生命周期全揭秘】从零开始打造你的数据科学项目 | 最全指南

在当今数据驱动的世界中,数据科学正在颠覆传统行业,成为企业决策和价值创造的重要引擎。然而,如何科学、系统地开展一个数据分析项目?这是很多人关心的核心问题。本篇文章基于经典数据分析课程内容,深入解读数据分析生命周期的每个阶段,让你快速掌握从“发现问题”到“落地应用”的完整流程。如果你正在学习或准备从事数据分析领域,这篇文章一定会对你大有帮助!数据分析生命周期的六大阶段数据分析生命周期的六个阶段相辅相成,每个阶段都至关重要:发现问题:明确需求,提出假设。数据准备:清洗、转换和可视化数据。

AI手套的博客 1741

手把手教你用Github提交CVE漏洞(附完整截图流程)

本文提供了在GitHub平台提交CVE漏洞的完整实战指南。从前期准备、目标搜寻与漏洞验证,到撰写规范的GitHub Issue进行披露,最后通过官方渠道完成CVE提交,手把手教你如何将安全研究成果转化为获得国际认可的CVE编号。

weixin_28309571的博客 327

GDI绘图半个像素问题的偏移解决。

记录一下 pG._pG->SetPageUnit(UnitPixel); pG._pG->SetInterpolationMode(Gdiplus::InterpolationModeNearestNeighbor); pG._pG->SetSmoothingMode(Gdiplus::SmoothingModeNone); pG._pG->SetPixelOffsetMode(G

seafit的专栏 1934

GD32单片机引脚复用指南:如何让JTAG接口的PA15/PB3发挥第二功能?

本文详细介绍了GD32F103Cx系列单片机如何通过AFIO模块进行引脚复用,特别是将默认用于JTAG调试接口的PA15、PB3等引脚释放为普通IO或复用功能引脚。文章从原理出发,结合代码实践,讲解了如何配置调试端口重映射,将JTAG引脚安全地转换为GPIO或定时器通道,并提供了常见问题排查与最佳实践,帮助开发者高效利用有限的引脚资源。

nept的博客 810

Half-Pixel Offset in DirectX 11

Half-Pixel Offset in DirectX 11 There is a problem graphics programmers often have to face known as half-pixel/half-texel offset. In Direct3D 9 the probably most official article about it wasDirectl...

yaorongzhen123的专栏 460

如何用IDEA查看jar包中代码

我们在使用Java进行开放时经常会需要下载些第三方的jar包进行相应的开发。有时候相关jar包的使用文档不足,满足不了我们的特定开发使用要求,这就需要我们查看jar包内的相关代码逻辑,本文将基于IDEA工具介绍如何查看相关jar包的代码逻辑

mystonelxj的博客 2281

微信小程序、H5微信公众号网页JSAPI:解决报错requestMerchantTransfer:fail:internal error(使用wx.requestMerchantTransfer错误)

如何解决requestMerchantTransfer:fail:internal error,微信小程序wx.requestMerchantTransfer报错,微信公众号H5网页使用jssdk调用wx.requestMerchantTransfer报错,JSAPI调起用户确认收款报错errMsg:“requestMerchantTransfer:fail:internal error“,微信小程序/H5 调起确认收款界面,JSAPI调起用户确认收款,微信公众号(H5),用户发起提现,商家转账给用户,用户

✅ 精选推荐文章 4974

DX9纹理半像素偏移-Directly Mapping Texels to Pixels

DX9上纹理的半像素偏移

冠位仓鼠--慕白 1606

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3790

Lightweight Charts 插件开发指南:Canvas 位图像素级完美渲染(Pixel Perfect Rendering)最佳实践

在 TradingView Lightweight Charts 中开发 Custom Series 与 Drawing Primitive 插件时,最影响视觉质量的细节之一就是线条、柱体与矩形在屏幕上是否**锐利无模糊**。本指南以官方文档 [Pixel Perfect Rendering](https://link.gitcode.com/i/866385e0b37c942bb8d43759e

gitblog_00509的博客 457

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Xenia 模拟器性能优化指南:卡顿、闪退、画面异常一次修好

Xenia 是一个在 PC 上运行 Xbox 360 游戏的模拟器研究项目。Xenia 模拟器性能优化最常见的场景就三类:开局卡、直接闪退、画面不对。下面按症状组织修复步骤,先对号入座,再改参数。 ## 动手前:30 秒定位你的症状 先看问题属于哪一类,再进对应小节: - 首次进游戏或进新场景时长时间卡顿、帧率掉下来 → 看「第一次进游戏特别卡」 - 窗口打开后卡死、黑屏、进程直接退出 →

gitblog_00883的博客 387

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

DirectX9中Pixel Coordinates System的一个怪异特性

http://drilian.com/2008/11/25/understanding-half-pixel-and-half-texel-offsets/ 这个文章解释的很详细,他的blog里面也有很多的文章,值得一看哦~. 总结下来就是这样: 在DirectX9中, NDC的坐标系的范围是从左往右x: (-1.0f, 1.0f),  从屏幕上方到下方y: (1.0f, -

?! 676

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TinyEXR 单头文件 OpenEXR 读写库完全指南:格式支持、API 实战与 Instant-NGP 集成

TinyEXR 是一个零外部依赖、以单个头文件分发的 OpenEXR(.exr)图像读写库,采用可移植 C++ 编写,除 STL 外不依赖任何第三方库。本文以 `dependencies/tinyexr/README.md` 为主体骨架,完整讲解其格式支持矩阵、编译开关、从快速读取到深图像读写的全套 API 用法,并结合本仓库(instant-ngp)中 [tinyexr_wrapper.cu](

gitblog_00329的博客 468

PCSX2 新手教程:四步跑通 BIOS 指认与首盘启动,再按显卡抄参数

PCSX2 把 PS2 主机的 MIPS 指令流、图像合成与光盘读取过程原样重放到你的 PC 上,让你直接运行自己的 PS2 游戏光盘镜像。这篇 PCSX2 新手教程面向第一次接触它的人,不假设你有任何模拟经验:照做完,你能合法取得 BIOS 并让设置向导识别、把第一盘镜像推进游戏主菜单、按显卡水平抄一套安全参数、再对着速查表自己处理卡顿和花屏。全文四步展开,每步都写清屏幕上该出现什么,信号不对时

gitblog_00656的博客 91

PowerToys Screen Ruler 深度解析:从热键触发到 DirectX 像素级测量的完整实现

Screen Ruler(Screen Ruler)是 Microsoft PowerToys 中一个"小而精"的测量模块:按下热键后,它会以 DirectX 叠加层覆盖整个屏幕,让你测量像素距离、检测同色连续区域(边距/间距),并把结果直接写入剪贴板。本文以仓库中的开发文档 [Screen Ruler 模块文档](https://link.gitcode.com/i/2ac778bee8553e

gitblog_00587的博客 524

Unity Sprite Shaders 全功能解析:Spine 精灵 Uber Shader 的照明、混合与渲染原理

本文是 spine-runtimes 仓库中 [Sprite 目录 README](https://link.gitcode.com/i/090ecaf7be2734978228b468e848a7bd) 的技术解读与源码级展开。Spine Unity 运行时内置了一套专门为 Sprite 渲染优化的 Uber Shader(一套 shader 通过开关组合覆盖多种渲染需求),支持 Forward

gitblog_00193的博客 172

PCSX2 PS2模拟器:3个阶段让经典游戏跑起来

首次打开PCSX2,配置向导弹了出来,BIOS文件列表是空的;进了游戏列表,星级看不懂;游戏跑起来了,画面却飘着光晕。这些是新手的前三关。PCSX2是开源的PS2模拟器,把主机的主CPU、协处理器和图形系统搬进你的PC。本文按"动手之前 / 首次启动 / 调优与诊所"三个阶段带你跑通第一局,图形故障直接查表拿药方。 ## 动手之前:硬件基线与物料准备 PCSX2模拟PS2三块硬件:EE(主处理

gitblog_00290的博客 354

PCSX2 PS2模拟器配置实战:从 BIOS 到稳定 60 帧的 5 步实操

PCSX2 是目前维护最活跃、兼容性最好的 PS2模拟器。这篇实操指南写给刚装好它、卡在 BIOS 和游戏库界面不知道下一步做什么的新手。照顺序做完,你能独立配好渲染器、按固定顺序排查画面问题,并把一款高负载游戏调到稳定 60 帧。 ## 你的硬件够不够格?跑 PCSX2 前的自检清单 先对号入座,低于最低线的机器,换硬件再来。 | 配置档位 | CPU | GPU | 内存 | |---|

gitblog_00711的博客 644

PCSX2(PS2模拟器)新手配置全指南:10步打通设置、兼容性与图形故障修复

PCSX2 是一款 PS2 模拟器,让 PS2 游戏在现代 PC 上运行。本文从 BIOS 配置讲到渲染器选择、图形故障修复、VU/EE 排除法与单游戏设置卡,帮你在第一晚就跑通游戏并解决常见卡顿与画面问题。 ## 一、PCS2 BIOS 目录设置:启动前的第一道门 很多"打不开游戏"的工单,最后查出来都是 BIOS 没配对。PCSX2 本身不附带 BIOS,它必须读到你真实 PS2 主机的

gitblog_00500的博客 1024

PCSX2模拟器避坑指南:5张表配出稳定60帧的PS2体验

刚把PS2光盘塞进PCSX2,画面就掉帧、花屏、菜单消失?别急着换机器。PCSX2用软件把PS2的EE/IOP处理器、VU向量单元和GS图形系统整套硬件搬进你的电脑,卡顿多半是某个模块没喂对参数。读完这篇,你能独立解决PS2模拟器怎么设置、PCSX2卡顿排查和PS2游戏画质优化这三类最常见的问题。 [![PCSX2模拟器首次配置向导界面](https://raw.gitcode.com/GitH

gitblog_00849的博客 428

PCSX2 配置教程:从 BIOS 到进游戏的 7 个新手步骤

这篇 PCSX2 配置教程带你完整走一遍 PS2 模拟器的搭建流程:先核对硬件、放好 BIOS,再把游戏镜像跑起来,最后按显卡调画质、配手柄。跟着 7 个步骤做,一台普通 PC 就能开始玩。 ## BIOS 文件放哪、放完做什么 这一节解决"没有 BIOS 就不能启动"的问题,顺带核对硬件是否达标。 PCSX2 的门槛不高,逐条对一下: - CPU:64 位且支持 SSE4.1 指令集 -

gitblog_01060的博客 522

PCSX2 实用指南:在 PC 上运行与优化 PS2 经典游戏

PCSX2 是一款免费开源的 PlayStation 2 模拟器,通过 MIPS CPU 解释器、重编译器加虚拟机的方式复现 PS2 硬件,让你在没有主机的情况下在电脑上运行 PS2 游戏。它支持 Windows、Linux 和 macOS,官方兼容性列表已测试超过 2500 款游戏。多数游戏在默认设置下即可直接运行,本文面向首次使用的玩家:讲清楚需要准备什么、最快怎么跑起来、按什么思路调设置,以

gitblog_01153的博客 323
上一篇: 游戏中的富文本.小续
下一篇: 算一算N阶乘的尾随零个数
tkokof1
tkokof1 领域专家: 游戏开发技术领域 领域专家: 游戏开发技术领域
博客等级 码龄18年 368粉丝 198原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值