glGenTextures和glGenSamplers有什么区别?

Ell*_*ome 0 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);
}
Run Code Online (Sandbox Code Playgroud)

glGenSamplers是未定义的,我认为因为它需要GL v3.3或更高版本,我大学的实验室有GL v3.2所以我不能使用它.

我正在努力弄清楚glGenTextures和glGenSamplers之间的区别,它们是可以互换的吗?

der*_*ass 7

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

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

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

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

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