【发布时间】:2015-08-17 20:03:29
【问题描述】:
我找到了很多资源,这些资源可以告诉您键入什么内容才能在屏幕上显示纹理,但希望对 openGL API “在做什么”以及术语的所有差异有更高层次的概念性理解“意思”。
我将尽我所能解释我所了解的内容,但希望有任何更正/添加,或指向我可以进一步阅读的资源的指针(以及我找到的文档的说明)实际的 API 调用只是在圈子中引用自己并且在概念上缺乏)。
glGenTextures- 这实际上不会为显卡上的纹理数据分配任何内存(您只需告诉它“您希望它生成多少”纹理,因此它对大小...),而是设置了一种“名称”,以便您可以一致地引用给定的纹理(我一直认为它是一种“分配指针”)。
glBindTexture- 使用在glGenTexture 中生成的“名称”来指定“我们现在正在讨论此纹理以供将来的 API 调用,直至另行通知”,此外,我们正在指定一些有关该纹理的元数据“指针”我们已经分配说它指向(/将指向)的纹理是GL_TEXTURE_2D或..._3D或其他类型。 (是我一个人,还是奇怪的是这个调用有这两个看似完全不同的功能?)
glTexParameter- 设置有关当前“绑定”纹理的其他指定元数据。 (我喜欢这个 API,因为它看起来很容易解释,并且可以让你明确地设置元数据......但我想知道为什么让 OpenGL 知道它是一个 GL_TEXTURE_2D 不是这个调用的一部分,而不是之前的调用?特别是因为你有指定它是一个GL_TEXTURE_2D 无论如何你每次调用它?为什么你必须这样做?)
glTexImage2D- 为显卡上纹理的实际数据分配内存(并可选择上传)。它进一步指定了一些关于应该如何读取的元数据:它的宽度、高度、格式(GL_RGB、GL_RGBA 等...)。再说一遍,为什么我再次必须指定它是GL_TEXTURE_2D,而我在之前的所有调用中都这样做了?另外,我想我可以理解为什么这包括一些元数据(而不是将所有纹理元数据调用卸载到glTexParameter,因为这些是非常基本/非可选的信息位,但也有一些奇怪的参数似乎他们应该'没有成功?哦,好吧......)
glActiveTexture- 这是我真的不明白的一点......所以我猜显卡只能有有限数量的“纹理单元”......什么是纹理单元?是不是只能有 N 个纹理缓冲区?还是只有 N 个纹理指针?或者(这是我最好的猜测......)给定的绘图调用只能主动读取 N 个指针?一旦我明白了,我必须在哪里/多久指定一次“活动纹理”? glBindTexture 是否将绑定的纹理与当前活动的纹理相关联?还是反过来(绑定,然后设置为活动)?或者上传/分配显卡内存可以做到吗?
sampler2D- 现在我们开始讨论 glsl 的东西......所以,采样器是可以从着色器中引用纹理的东西。我可以通过glGetUniformLocation 获取它的位置,所以我可以设置采样器引用的纹理——这是否对应于“活动纹理”?所以如果我想谈谈我指定为GL_TEXTURE0 的纹理,我会打电话给glUniform1i(location_of_sampler_uniform,0)?还是那两个不同的东西?
我想这就是我得到的全部......如果我明显缺少一些直觉或什么,请告诉我!谢谢!
【问题讨论】:
-
纹理单元是一个非常以硬件为中心的概念。考虑它的最简单方法是处理一组纹理计算的 GPU 上的“处理器”。它是通过纹理处理硬件的众多途径之一。在大多数情况下,您不需要使用 glActiveTexture(),因为从您的角度来看它应该是无缝的。将 glActiveTexture() 包含在 API 中的原因是允许您进行特定于硬件的优化,例如将所有纹理保存在单个纹理单元上,但即使您不访问它,GL 驱动程序应该为您处理纹理管理。
-
@Phildo: 可能这个diagram 有点帮助。
-
@stix:如果我不需要使用 glActiveTexture,我如何为我的统一 sampler2D 指定它应该引用的纹理?我应该将 int 值设置为 glGenTextures 生成的 int 吗? @derhass:这确实有帮助-谢谢!但我仍然觉得我错过了完整的画面......
-
我试图在这里详细回答一些术语:stackoverflow.com/questions/30960403/…。