C++ OpenGL纹理使用

C++ OpenGL纹理使用,c++,opengl,C++,Opengl,所以最近我开始阅读OpenGL维基文章。这就是我从中描述OpenGL纹理的方式。不过,有几点尚不清楚 以下陈述是正确的、错误的还是依赖的 将两个纹理绑定到同一纹理单元是不可能的 将两个采样器绑定到同一纹理单元是不可能的 将一个纹理绑定到两个不同的纹理单元是不可能的 将一个采样器绑定到两个不同的纹理单元是不可能的 应用程序的责任是明确将什么样的采样器类型传递给什么样的统一变量 着色器程序负责确保采样器为正确类型的均匀变量 纹理单元的数量足够大。让加载到应用程序的每个网格占据尽可能多的纹理单元 某些

所以最近我开始阅读OpenGL维基文章。这就是我从中描述OpenGL纹理的方式。不过,有几点尚不清楚

以下陈述是正确的、错误的还是依赖的

  • 将两个纹理绑定到同一纹理单元是不可能的
  • 将两个采样器绑定到同一纹理单元是不可能的
  • 将一个纹理绑定到两个不同的纹理单元是不可能的
  • 将一个采样器绑定到两个不同的纹理单元是不可能的
  • 应用程序的责任是明确将什么样的采样器类型传递给什么样的统一变量
  • 着色器程序负责确保采样器为正确类型的均匀变量
  • 纹理单元的数量足够大。让加载到应用程序的每个网格占据尽可能多的纹理单元
  • 某些采样器参数与纹理参数重复。它们将覆盖纹理参数设置
  • 某些采样器参数与着色器程序中的采样器描述重复。着色器程序的描述将覆盖采样器参数

  • 我将在下面介绍你的陈述。有时候,我会引用《圣经》中的名言进行辩论。这些都不是GL4.5所特有的,我之所以选择它,是因为它是最新的版本

    1。将两个纹理绑定到同一纹理单元是不正确的 不可能。

    如果我说“假”,那可能是误导。确切的说法是“将两个纹理绑定到同一纹理单元的同一目标是不可能的。”从技术上讲,可以说,将2D纹理和3D纹理绑定到同一单元。但不能在同一个draw调用中同时使用这两种方法。请注意,这是一种动态错误情况,取决于您将采样器设置为的值。引用德国劳埃德船级社规范第7.10节“采样器”:

    不允许有不同采样器类型的变量 指向程序对象内的同一纹理图像单元。这 只能在发出下一个渲染命令时检测到这种情况 这会触发着色器调用,并且会出现
    无效\u操作
    错误 然后生成

    因此,当您实际尝试使用该着色器绘制某些东西(或以其他方式触发着色器调用)时,GL将立即检测此错误情况,同时您将其配置为两个采样器制服引用同一单元的不同目标。但这以前不是一个错误。如果临时将两个制服设置为相同的值,但不尝试在该状态下绘制,则不会生成任何错误

    2。无法将两个采样器绑定到同一纹理单元。

    您的意思可能是(与GLSL中的“采样器”类型相反),所以这是真的

    3。无法将一个纹理绑定到两个不同的纹理单元。

    错。可以将同一纹理对象绑定到尽可能多的可用单元。然而,这是一个毫无用处的操作。在固定功能管道的时代,有一些角落的情况下,这是有限的使用。例如,我看到有人两次绑定同一纹理,并使用寄存器组合器将两者相乘,因为他需要一些平方运算。但是,使用着色器,可以对纹理进行一次采样,并对结果执行任何操作,因此实际上没有任何用例可供使用

    4。无法将一个采样器绑定到两个不同的纹理单元。

    错。单个采样器对象可以由多个纹理单元引用。您只需为所需的每个采样状态创建一个采样器对象,无需创建冗余的采样器对象

    5。应用程序的责任是明确将什么样的采样器类型传递给什么样的统一变量。

    6。着色器程序负责确保采样器为正确类型的均匀变量。

    我不太清楚你在问什么问题。着色器中的采样器变量选择纹理目标,并且还必须与要使用的纹理对象的内部数据相匹配(即,对于
    isampler
    usampler
    ,您将需要非标准化的整数纹理格式,否则结果将未定义)

    但我不知道“什么样的采样器类型被传递给什么样的统一变量”在这里意味着什么。就GL客户端而言,不透明取样器制服只是可以设置为要使用的纹理单元的索引的东西,并且可以通过
    glUniform1i
    等作为整数来完成。没有传递给统一变量的“采样器类型”

    7。纹理单元的数量足够大。让加载到应用程序的每个网格占据尽可能多的纹理单元。

    一般情况下不是这样。GL 4.5规范所需的
    GL_MAX_TEXTURE_IMAGE_UNITS
    (定义片段着色器可以访问多少不同的纹理单元)仅为16。(每个shder阶段有单独的限制,因此有
    GL\u MAX\u vertext\u IMAGE\u UNITS
    GL\u MAX\u GEOMETRY\u TEXTURE\u IMAGE\u UNITS
    等。在当前规范中,它们都必须至少为16。)

    通常,必须在绘制调用之间切换纹理。和的使用可能会进一步减少必要的状态开关(以及最终的draw调用)的数量

    非常现代的GPU也支持,它完全绕过间接的“纹理单元”层,允许着色器通过一些不透明的句柄直接引用纹理对象(基本上归结为引用引擎盖下的某个虚拟GPU内存地址)。但是,该功能还不是OpenGL标准的一部分

    8。某些采样器参数与纹理参数重复。它们将覆盖纹理参数设置。

    对。茶