glGenTextures和glGenSamplers有什么区别?

时间:2015-01-25 16:32:43

标签: c++ opengl textures

我正在学习处理纹理加载的教程,它有这个方法:

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之间的区别,它们是可以互换的吗?

1 个答案:

答案 0 :(得分:7)

不能互换使用。纹理对象和采样器对象是不同的东西,但在GL中有些相关。

纹理对象包含图像数据,因此它代表我们通常称之为“纹理”的东西。但是,传统上,GL中的纹理对象还包含采样器状态。这控制影响纹理的实际采样操作的参数,如过滤,纹理坐标包裹模式,边框颜色,LOD偏差等。当提到术语“纹理”时,这不是人们通常想到的一部分。

单个对象中纹理数据和采样器状态的这种组合也不是GPU的工作方式。采样器状态完全独立于纹理图像数据。可以在一种情况下使用GL_NEAREST过滤来采样纹理,在某些其他情况下使用GL_LINEAR进行采样。为了反映这一点,创建了GL_ARB_sampler_objects GL扩展。

采样器对象仅包含用于采样纹理的状态。它不包含图像数据本身。如果当前绑定了采样器对象,则纹理本身的采样器状态将完全覆盖,因此只有采样器对象才会定义这些参数。如果没有绑定采样器对象(采样器名称为0),则使用旧行为,以便使用每纹理采样参数。

使用sampler对象并非绝对必要。在许多用例中,在纹理对象本身中定义采样参数的概念非常合适。并且您始终可以在不同的绘制调用之间切换纹理对象中的状态。但是,使用采样器可能更有效。如果使用它们,绑定新纹理不需要GL更新采样器状态。此外,对于采样器,您可以使用不同的采样模式来执行将相同纹理绑定到不同单位的技巧。