OpenGL的texelFetch和纹理有何不同?


18

我了解texelFetch和之间的主要区别texture,但对细节有一些疑问:

  • 是否texelFetch涉及性能损失?如不使用缓存等?
  • texelFetchtexture互换使用时GL_NEAREST

1
您可以编写一个测试用例,然后看...
ThorinII

1
您是否忘记了将答案标记为已接受,还是一个未解决的问题?
Anko 2015年

Answers:


23

texelFetch与完全不同texture

texture是您常用的纹理访问函数,该函数可处理过滤和归一化([0,1])纹理坐标。 texelFetch使用未归一化的坐标直接访问纹理中的texel(不过滤)(例如(64,64),与(.5,.5)归一化坐标相比,在128x128纹理中的中等纹理texel中)。


4
+1我想补充一点,当纹理不是特别要显示为图像,而是其他类型的数据时,texelFetch是用于数据访问的,与纹理不同,纹理在需要用作图像时访问纹理,这就是为什么它使用过滤等的原因
。–

性能上有区别吗?
Lenar Hoyt 2014年

1
@mcb:也许吧,但我不希望它很大,并且可能因硬件供应商而有很大差异。在确定要调用以下哪个函数时,性能是绝对错误的度量标准:使用适合您情况的函数(您需要硬件的过滤,因此必须使用,texture或者您需要硬件不进行过滤,因此必须使用texelFetch)。
肖恩·米德迪奇

3
@SeanMiddleditch在这种情况下,性能指标如何错误?如果texelFetch速度更快,并且最近邻居过滤就足够了,则无论出于何种原因,您都不能将上下文更改为NN过滤,因此优先选择它texture
Lenar Hoyt 2015年

@mcb:texelFetchtexture在基本方式上有所不同。另请参见输入:纹理坐标与归一化坐标。它们有不同的用途。一个不仅是另一个的优化。
肖恩·米德迪奇

6

由于没有可接受的答案,因此我添加了一些信息,所以我只想添加Sean在他的答案中尚未说过的内容。

TexelFetch将纹理视为图像,因此您可以精确访问像素的内容。通常,当您确实需要该内容时,通常在少数情况下但有用的情况下执行此操作:

  • 某些后期处理滤镜(高斯模糊使用纹理样本插值,因此不能使用TexelFetch)
  • 当顶点需要从纹理读取数据时,该操作取决于2个坐标

Tex2D将纹理视为纹理。您不想要像素的确切内容,但是想要最真实的结果。标准纹理读取是一项非常复杂的操作,它涉及从一个或多个mipmap级别读取插值数据,然后再次插值。所有这些昂贵的操作都是为了避免视觉伪影。

GL_NEAREST无法正常工作,因为在最远的多边形上,您正在读取较小的mipmap级别的数据,而这与从texel提取中读取的数据完全不同。

在一种情况下,Tex2D(几乎)与TexelFetch相同:

  1. 过滤器为GL_NEAREST
  2. 您正在使用1级的不完整mipmap金字塔
  3. 您的UV不是标准化的顶点分量(但是您必须在着色器中对其进行标准化)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.