sampler2DRect与sampler2D的区别是什么?如何构造结果不同的场景?
sampler2D 与 sampler2DRect 的核心区别
坐标体系本质不同:
sampler2D使用归一化坐标,范围固定为[0, 1],和图像实际分辨率无关,比如(0,0)对应图像左上角,(1,1)对应右下角。sampler2DRect使用像素坐标,范围是[0, 图像宽度) × [0, 图像高度),坐标值直接对应像素的实际位置,比如256×256的图像,有效坐标上限是(255,255)。
采样功能支持差异:
sampler2D支持mipmap采样、各向异性过滤,还能通过bias参数调整mipmap采样层级;sampler2DRect完全不支持mipmap,只能采样图像的基础层级,因此函数签名里没有bias参数。
能得到不同结果的测试场景
场景1:用相同数值的坐标采样
假设绑定的图像是256×256分辨率:
- 用
sampler2D传入(0.5, 0.5),采样的是图像中心区域的像素; - 用
sampler2DRect传入同样的(0.5, 0.5),采样的是图像左上角的第一个像素(坐标小于1,对应像素(0,0)附近)。
两者采样结果必然不同。
场景2:开启mipmap的情况
- 给
sampler2D绑定带多级mipmap的图像,采样时添加bias参数,比如texture(sampler2D_obj, vec2(0.5,0.5), 2.0),此时会采样第2级mipmap; - 用
sampler2DRect绑定同一图像,哪怕图像有mipmap层级,也只会采样第0级基础图,结果自然不同。
场景3:坐标超出有效范围时
sampler2D对[0,1]外的坐标,会按sampler设置的地址模式(重复、镜像、clamp等)处理,比如(2.0,2.0)在重复模式下等价于(0,0);sampler2DRect对超出像素坐标范围的数值,默认返回透明黑(具体实现可能略有差异,但不会像sampler2D那样做地址模式处理)。
这种情况下两者输出结果完全不同。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

