在使用d3d来渲染GUI元素时,可能很多人都碰到过一些让人抓狂的灵异问题,例如整个界面变模糊,边缘偏差一个像素,甚至在不同显卡上的表现还不一样……

这一般都是Pixel和Texel的对应出了问题导致的,界面元素的渲染的主要特点是一般是要求屏幕像素和纹理像素严格一一对应,这个在2d绘图中看来很自然的事,到了3d环境下似乎变得不那么简单。

d3d的特点是确定投影范围(记住渲染UI要使用正交投影)以后,“整数位置坐标”对应的是屏幕像素中心,而“整数纹理坐标”对应的却是纹理像素的边缘,这就是一切罪恶的根源。怎么理解这句话呢?请继续往下看……

一般来说渲染GUI时我们会把视口大小设置为和背缓分辨率一致,这样3d坐标的单位“1”就和屏幕上1个像素对应;而纹理坐标则用待渲染图元的像素尺寸占整张纹理像素尺寸的比例来确定。这里面有什么问题呢?

我们举个极端的例子,假设我们要在坐标0,0点附近用一张4×4的纹理渲染一个4×4像素的正方形,我们用两个三角形来渲染,4个顶点坐标(这里忽略z值)分别为(0,0),(4,0),(0,4),(4,4);因为图元使用了整张纹理,所以三角形的uv坐标为左上角(0,0),右下角(1,1)。

上中黑色的X,Y轴为投影后的逻辑坐标轴,可以看到它们是穿过像素(灰色方格代表像素)中心的。另外红色方格代表的是纹理坐标的像素。

现在大家可以比较直观的看到,屏幕像素和纹理像素是不重合的。那实际绘制的结果会是什么样的呢?我们知道,显卡在光栅化的时候决定一个像素是否渲染是看该像素中心是否位于三角形内。再看上图我们会发现,三角形边缘刚好穿过了某些像素的中心,那到底这些像素是算在三角形内还是三角形外呢?很遗憾,由于浮点精度,显卡驱动等原因,结果可能是不确定的,也就是说你最终可能得到的是下面两个之一(运气好的话)

同时,采样纹理时也是按像素中心点的uv坐标来采样的,图中可以看出要采样uv位置也都落在纹理像素的边缘上!如果用的是点采样(D3DTEXF_POINT)的话这里又是另一个不确定因素。

那这个问题怎么解决呢?说出来很简单(虽然感觉有点土),就是把三角形的顶点位置偏移半个像素(下图左),或者将摄像机位置偏移半个像素(这样投影坐标轴就落在像素边缘,而不是中心了,下图右)也可以,总之就是让Pixel和Texel重合,三角形的边(除了“斜边”)都落在像素边缘,Pixel的uv也都落在Texel中心点,于是天下就太平了……

以上讨论的仅限于我相对熟悉的D3d9,据说在OpenGL里不是这样,而且我印象中D3d10也有所改变。

参考:

http://www.360doc.com/content/12/0311/02/655789_193396009.shtml

屏幕像素与纹理像素(Pixel和Texe,像素和纹素l)相关推荐

  1. 史上最强像素画教程「Pixel Art」像素画入门教学本

    转载,成体系很良心,并且免费 感谢!!! 作者官网:https://www.doujin.com.tw/authors/info/yinshi

  2. 史上最强像素画教程「Pixel Art2」像素食物構圖教學本

    转载,成体系很良心,并且免费 感谢千穗!!! 作者官网:https://www.doujin.com.tw/authors/info/yinshi 作者:此非名 https://www.bilibil ...

  3. 史上最强像素画教程 「Pixel Art5」像素背景教學本

    非常受益于是转载,成体系很良心,并且免费 感谢千穗大大!!! 作者官网:https://www.doujin.com.tw/authors/info/yinshi 第4期讲建筑的非常棒!!!

  4. 史上最强像素画教程「Pixel Art4」像素房間教學本

    非常受益于是转载,成体系很良心,并且免费 感谢千穗大大!!! 作者官网:https://www.doujin.com.tw/authors/info/yinshi 建筑这个真的厉害了!!!还有后续!!

  5. 当我们在讨论设备像素比(device pixel ratio,dpr)的时候我们在讨论什么?

    目录 0. 为什么要写这篇文章? 1. 设备像素比的问题在哪里? 1.1. 不同的论述导致不同的理解 1.2. 设备独立像素与CSS像素 1.3. 小结 2. 设备像素比 = 设备物理像素/CSS像素 ...

  6. 像素级动态模糊(Pixel Motion Blur)

    像素级动态模糊(Pixel Motion Blur) 动态模糊近几年广泛应用于游戏制作的一种特效,可以使得游戏所呈现出的运动画面更接近于真实相机所拍摄出的效果.      在真实世界中,运动模糊是指在 ...

  7. 单像素相机(single pixel camera,SPC)

    单像素相机(single pixel camera,SPC) 在我学习的领域(利用单像素探测器实现无成像的目标识别/分类-),经常接触到的是像单像素相机这种的成像系统(光源将物体的像投射到DMD上进行 ...

  8. [虚幻引擎][UE][UE5]像素流送(Pixel Streaming),像素流去掉黑边和按钮[UE5.1.0],鼠标控制

    [虚幻引擎][UE][UE5]像素流送Pixel Streaming,像素流去掉黑边和按钮[UE5.1.0] 1.写在前面 01.作者碎碎念 02.结果 演示截图 视频教程 2.需要准备的软件 3.U ...

  9. UE4 4.24像素流送实践 pixel streaming

    UE4 4.24像素流送实践 pixel streaming 4.24电脑运行成功了 在实践像素流送的过程中,我参考了 ①官方视频https://www.bilibili.com/video/BV1U ...

最新文章

  1. 【CV】Numpy|Python中矩阵和数组乘法及向量相关问题
  2. Go 初体验 - 令人惊叹的语法 - defer.3 - defer 函数参数计算时机
  3. java_OA管理系统(一):Servlet总结案例仿网络聊天室
  4. oracle 清空表数据的2种方式及速度比较
  5. lgg8各个版本_lgg8参数
  6. UVA - 1378 A Funny Stone Game(博弈+sg函数)
  7. 使用HANA Web-based Development Workbench创建最简单的Server Side JavaScript
  8. 【自定义控件】自定义属性
  9. Python_共轭梯度法与最速下降法之间的比较
  10. Excel VBA 入门(零)
  11. 阿里程序员双11加班吃什么?
  12. dubbo分布式服务子系统的划分
  13. 传智播客-刘意-java深入浅出精华版学习笔记Day10
  14. oracle asm文件查找,Oracle ASM 文件管理
  15. 数据库特点分析| 寻找你心中的数据库漫威英雄
  16. 已解决 | burp无法抓取iphone https数据包
  17. 计算机键盘卡扣原理,笔记本键盘怎么拆?笔记本键盘卡扣、排线如何打开?
  18. 【系统】Win10 新装系统提示 OOBEIDPS
  19. jrtplib学习目录及总结
  20. Sublime插件安装与提高Verilog编写效率插件推荐

热门文章

  1. 网页错误代码200,300,400,500
  2. Go 语言 fmt.Scanln() 与 fmt.Scanf() 包使用
  3. html 转义方法,java html 转义方法
  4. flex实现上中下布局
  5. 7.requests详解
  6. 博弈论总结 必胜点 SG函数 巴什博弈 尼姆博弈
  7. 基于Springboot+Vue的MOBA类游戏攻略分享平台
  8. 哪里可以买到真正的华强北耳机呢?
  9. 第二次作业:“深度学习基础”
  10. 恒玄BES调试笔记-BES2500如何修改蓝牙发射功率