什么是依赖纹理读取?

26

我一直在阅读有关计算机图形学的论文,偶尔会遇到“依赖纹理读取”或“依赖纹理获取”这样的术语,用于查询着色器代码中的纹理。什么是依赖纹理读取,以及与“普通”纹理读取的区别是什么?

3个回答

33

接受的答案(以及下面的答案)错误地限制了依赖纹理读取只使用另一个纹理读取的输出。那是不正确的。

任何具有不是直接传递到程序片段着色器中的精确坐标的坐标的纹理读取都是依赖纹理读取。甚至混合也会导致依赖纹理读取。

这直接引用自苹果的OpenGL ES编程指南


@benthehutt 什么是 swizzle? - duhaime
1
这个答案还有一个澄清改进: “不是程序的片段着色器传递的确切坐标”。 在将它们作为varyings输出之前,您可以在顶点着色器中自由地对UV进行任何操作,而不触发依赖纹理读取。 - Poniros
1
依赖纹理读取非常重要,因为它们会带来性能损失(使得很难预测计算单元缓存哪些数据)。从这个角度来看,它在硬件/驱动程序上肯定存在差异。如果使用基本的代数运算修改纹理坐标,则某些硬件/驱动程序可以预测要加载哪些数据。 - Justin Meiners
2
@JustinMeiners 这曾经是一个更大的问题,但是在任何支持OpenGLES 3.0的硬件上(目前几乎所有硬件都支持),依赖纹理读取不再带来性能损失。请参阅苹果文档:https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html - benthehutt
1
@benthehutt 这就是我试图表达的观点。即使它仍然被称为依赖读取,简单的数学修改也可能没有惩罚。但是,如果您对纹理进行采样,并使用该结果对另一个纹理进行采样,则我认为仍然存在重大惩罚。因此,这应该是值得命名的“依赖纹理读取”的唯一子集。 - Justin Meiners
显示剩余2条评论

30
"Dependent texture read"是指将一次贴图查找(或其他着色器计算)的返回值用于确定从第二个贴图中查找的位置。这意味着贴图坐标(查找位置)直到着色器执行中间才被确定...即使已知所有参数的值,也不能对着色器进行任何静态分析,以提前知道坐标将是什么。它还严格排序了两次纹理读取并限制了驱动程序等优化能够改变执行顺序的程度。
在旧的图形卡上,这种情况曾经有很多限制。例如,在某个时刻(如果我没记错的话),您可以从多个纹理中查找,但只能使用少量不同的纹理坐标。硬件实际上是以某种方式实现的,某些类型的依赖纹理读取要么不可能,要么非常低效。
在最近一两代的显卡中,您无需担心这个问题。但是,您可能正在阅读几年前的书籍或文章时,当时您确实需要密切关注此类问题。

8
根据PowerVR的说法,实际上你需要关注一些相当新的硬件 :-) http://bit.ly/yvSnM - Justicle
在我的GTX 570上,片段着色器中的依赖纹理查找比独立纹理查找慢一个数量级。(这使我正在工作的引擎从零/卡顿FPS提高到20 FPS。) 我在几何着色器中删除了一个依赖的“常量数组查找”,也体验到了略微减少的速度提升。(原始计数取决于此值。) 上下文是关键! - Philip Guin

10

普通的纹理读取只使用传递到着色器中的纹理坐标。依赖纹理读取是使用部分计算自另一个先前在着色器中访问的纹理中提取的值来计算的纹理坐标。因此第二个纹理访问“依赖于”从第一个中提取的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接