gpt4 book ai didi

c++ - glGenTextures 和 glGenSamplers 有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:44 25 4
gpt4 key购买 nike

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

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 中有些相关。

纹理对象包含图像数据,因此它代表我们通常所说的“纹理”。但是,传统上,GL 中的纹理对象还包含采样器状态。这控制影响纹理实际采样操作的参数,如过滤、纹理坐标环绕模式、边框颜色、LOD 偏差等。当提到“纹理”一词时,人们通常不会想到这一点。

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

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

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

关于c++ - glGenTextures 和 glGenSamplers 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28138674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com