glGenTextures 和 glGenSamplers 有什么区别?
What is the difference between glGenTextures and glGenSamplers?
我正在学习处理纹理加载的教程,里面有这个方法:
void CTexture::CreateEmptyTexture(int a_iWidth, int a_iHeight, GLenum format)
{
glGenTextures(1, &uiTexture);
glBindTexture(GL_TEXTURE_2D, uiTexture);
if(format == GL_RGBA || format == GL_BGRA)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
// We must handle this because of internal format parameter
else if(format == GL_RGB || format == GL_BGR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
else
glTexImage2D(GL_TEXTURE_2D, 0, format, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
glGenSamplers(1, &uiSampler);
}
glGenSamplers 未定义,我假设因为它需要 GL v3.3 或更高版本,我大学的实验室有 GL v3.2,所以我不能使用它。
我正在努力找出 glGenTextures 和 glGenSamplers 之间的区别,它们可以互换吗?
不能互换使用。纹理对象和采样器对象是不同的东西,但在 GL 中有些相关。
纹理对象包含图像数据,因此它代表我们通常所说的"texture"。然而,传统上,GL中的纹理对象也包含采样器状态。这控制影响纹理实际 采样 操作的参数,如过滤、纹理坐标环绕模式、边框颜色、LOD 偏差等。当提到 "texture" 一词时,人们通常不会想到这一点。
纹理数据和采样器状态在单个对象中的这种组合也不是 GPU 的工作方式。采样器状态完全独立于纹理图像数据。可以在一种情况下使用 GL_NEAREST
过滤对纹理进行采样,在另一些情况下使用 GL_LINEAR
过滤。为了反映这一点,创建了 GL_ARB_sampler_objects
GL 扩展。
采样器对象仅包含采样纹理的状态。它不包含图像数据本身。如果当前绑定了采样器对象,则纹理本身的采样器状态将被完全覆盖,因此只有采样器对象定义了这些参数。如果没有绑定采样器对象(采样器名称 0),则使用旧行为,以便使用每个纹理采样参数。
并非绝对需要使用采样器对象。在许多用例中,在纹理对象本身中定义采样参数的概念非常合适。而且您始终可以在不同的绘制调用之间切换纹理对象中的状态。但是,使用采样器可能更有效。如果使用它们,绑定新纹理不需要 GL 更新采样器状态。此外,使用采样器,您可以使用 不同的 采样模式,将相同的纹理绑定到不同的单元。
我正在学习处理纹理加载的教程,里面有这个方法:
void CTexture::CreateEmptyTexture(int a_iWidth, int a_iHeight, GLenum format)
{
glGenTextures(1, &uiTexture);
glBindTexture(GL_TEXTURE_2D, uiTexture);
if(format == GL_RGBA || format == GL_BGRA)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
// We must handle this because of internal format parameter
else if(format == GL_RGB || format == GL_BGR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
else
glTexImage2D(GL_TEXTURE_2D, 0, format, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
glGenSamplers(1, &uiSampler);
}
glGenSamplers 未定义,我假设因为它需要 GL v3.3 或更高版本,我大学的实验室有 GL v3.2,所以我不能使用它。
我正在努力找出 glGenTextures 和 glGenSamplers 之间的区别,它们可以互换吗?
不能互换使用。纹理对象和采样器对象是不同的东西,但在 GL 中有些相关。
纹理对象包含图像数据,因此它代表我们通常所说的"texture"。然而,传统上,GL中的纹理对象也包含采样器状态。这控制影响纹理实际 采样 操作的参数,如过滤、纹理坐标环绕模式、边框颜色、LOD 偏差等。当提到 "texture" 一词时,人们通常不会想到这一点。
纹理数据和采样器状态在单个对象中的这种组合也不是 GPU 的工作方式。采样器状态完全独立于纹理图像数据。可以在一种情况下使用 GL_NEAREST
过滤对纹理进行采样,在另一些情况下使用 GL_LINEAR
过滤。为了反映这一点,创建了 GL_ARB_sampler_objects
GL 扩展。
采样器对象仅包含采样纹理的状态。它不包含图像数据本身。如果当前绑定了采样器对象,则纹理本身的采样器状态将被完全覆盖,因此只有采样器对象定义了这些参数。如果没有绑定采样器对象(采样器名称 0),则使用旧行为,以便使用每个纹理采样参数。
并非绝对需要使用采样器对象。在许多用例中,在纹理对象本身中定义采样参数的概念非常合适。而且您始终可以在不同的绘制调用之间切换纹理对象中的状态。但是,使用采样器可能更有效。如果使用它们,绑定新纹理不需要 GL 更新采样器状态。此外,使用采样器,您可以使用 不同的 采样模式,将相同的纹理绑定到不同的单元。