【发布时间】:2015-05-13 00:58:07
【问题描述】:
我正在尝试接受 OpenGL ES 2.0 片段着色器中 mipmaped 纹理的细节级别。
根据this answer,不可能使用texture2D 的bias 参数来访问片段着色器中特定级别的细节。根据this post,详细程度是根据相邻片段的并行执行自动计算的。我必须相信事情就是这样运作的。
我无法理解的是它的原因。 为什么无法访问特定级别的详细信息,而这样做确实应该非常简单? 为什么必须依赖复杂的固定功能?
对我来说,这似乎非常违反直觉。毕竟,整个 OpenGL 相关的东西都是从固定的功能演变而来的。并且 OpenGL ES 旨在覆盖比 OpenGL 更广泛的硬件范围,因此仅支持许多事物的更简单版本。因此,如果规范的开发人员决定 LOD 参数是强制性的(可能默认为零),并且着色器程序员以他认为合适的任何方式来制定适当的 LOD,我将完全理解。添加一个自动执行该计算的函数似乎是我在桌面 OpenGL 中所期望的。
不提供对特定级别的直接访问对我来说根本没有任何意义,无论我如何看待它。特别是因为bias 参数表明我们确实被允许调整细节级别,所以显然这不是关于从内存中只为并行处理的一堆片段的单个级别获取数据。我想不出任何其他原因。
当然,为什么问题往往会吸引意见。但由于 Stack Overflow 不接受基于意见的答案,因此请将您的意见仅作为 cmets 发表。另一方面,答案应该基于可验证的事实,例如有明确知识的人的陈述。如果有开发者讨论这个事实的记录,那就完美了。如果里面有人发博文讨论这个问题,那还是很好的。
由于堆栈溢出问题应该处理真正的编程问题,有人可能会争辩说询问原因是一个糟糕的问题。获得答案不会使明确的 lod 访问突然出现,因此不会帮助我解决眼前的问题。但我觉得这里的原因可能是由于 OpenGL ES 如何工作的一些重要方面,我到目前为止还没有掌握。如果是这样,那么理解这一决定背后的动机将有助于我和其他人更好地理解 OpenGL ES 作为一个整体,从而在他们的程序中更好地利用它,在性能、准确性、可移植性等方面.因此,我可能会将这个问题表述为“我错过了什么?”,这对我来说是一个非常现实的编程问题。
【问题讨论】:
-
基本的“为什么”是 OpenGL ES 2.0 是一个相对较旧的 API(于 2007 年发布,基于 2005 年的桌面 API)设计用于在手机上实现,当时手机是在 130nm 硅上构建的,并且是根本没有真正使用 3D 图形。更多访问功能的方法 = 更大的 GPU、更慢的驱动程序,以及当你拥有一部 8 年前的手机时,这被视为一个问题。智能手机现在功能更加强大,因此对真正精简 API 的需求已经减少,因此大多数限制正在消失,移动 GPU 现在几乎与桌面 GPU 在功能上相当。
标签: opengl-es fragment-shader texture2d glsles level-of-detail