我對我的場景中的「加載」或綁定單獨對象的不同紋理有點困惑。爲每個對象綁定不同的紋理
這是我設置紋理的方式(從加載的硬盤和結合紋理):
setTexture (const std::string& t_filename)
{
int width, height, nrChannels;
glBindTexture(GL_TEXTURE_2D, m_TEX);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
unsigned char* image = stbi_load(t_filename.c_str(), &width, &height, &nrChannels, 0);
if (image)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
throw std::string("Texture could not get loaded. Abort");
}
stbi_image_free(image);
glBindTexture(GL_TEXTURE_2D, 0);
}
功能屬於一個稱爲Rectangle
類。
我對VAO,VBO和紋理對象的成員變量:
GLuint m_VAO{ 0 };
GLuint m_VBO{ 0 };
GLuint m_VEBO{ 0 };
GLuint m_TEX{ 0 };
所以Rectangle
每個實例有一個紋理對象m_Tex
。
每次我畫我的對象在主函數用於繪製框架我用這樣的方式:
glBindVertexArray(m_VAO);
glBindTexture(GL_TEXTURE_2D, m_TEX);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
glBindVertexArray(0);
問題:我所有的物體(比方說我有3個Rectangle
實例)使用相同的儘管它們都在繪製之前綁定了自己的紋理對象。這是爲什麼?
編輯:好吧,我的錯!我忘了產生我這樣setTexture
功能的紋理對象:
glGenTextures(1, &m_TEX);
現在如預期,我可以載入我的紋理和它們之間的「開關」!
什麼樣的問題是,你的記憶力不是無限的,所以當然會有一個限度。 –
答案:這是不可能的。 textue單元的數量取決於硬件。 'GLint否; glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,&no)'。 – Rabbid76
我能想象的唯一事情是['ARB_bindless_texture'](https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_bindless_texture.txt) - 請參閱[Bindless Texture](https://www.khronos .ORG/OpenGL的/維基/ Bindless_Texture)。但我認爲這不是標準的一部分,也不是每個硬件都支持的。 – Rabbid76