2017-10-29 84 views
0

我對我的場景中的「加載」或綁定單獨對象的不同紋理有點困惑。爲每個對象綁定不同的紋理

這是我設置紋理的方式(從加載的硬盤和結合紋理):

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); 

現在如預期,我可以載入我的紋理和它們之間的「開關」!

+0

什麼樣的問題是,你的記憶力不是無限的,所以當然會有一個限度。 –

+0

答案:這是不可能的。 textue單元的數量取決於硬件。 'GLint否; glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,&no)'。 – Rabbid76

+0

我能想象的唯一事情是['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

回答

3

怎麼可能在開始時加載理論上無限的物體的每個紋理,然後在它們之間進行「切換」?

通過只創建幾個紋理對象,並綁定它們,當你想使用它們。紋理單位與此無關。

// at init time 
GLuint texA, texB; 

// create texture A 
glGenTextures(1, &texA); 
glBindTexture(GL_TEXTURE_2D, texA); 
glTexParameter(...); glTexImage(...); 

// create texture B 
glGenTextures(1, &texB); 
glBindTexture(GL_TEXTURE_2D, texB); 
glTexParameter(...); glTexImage(...); 


// at draw time 
glBindTexture(GL_TEXTURE_2D, texA); 
glDraw*(...); // draw with texture A 
glDraw*(...); // still draw with texture A 

glBindTexture(GL_TEXTURE_2D, texB); 
glDraw*(...); // now draw with texture B 

目前尚不清楚什麼m_TEX在你的代碼,但它看起來像一類的一些成員變量。但是,你不會顯示你的代碼片段屬於哪個類,所以很難猜測你到底在做什麼。對我來說,它看起來像只有一個m_TEX變量,這意味着您只能記住一個紋理對象名稱,因此可以一次又一次地重複使用相同的紋理。即,您的加載程序代碼不會生成新的紋理對象,而只是重新使用m_TEX

紋理單元多紋理,爲了能夠在同一時間(單個繪圖調用期間意義)到多於一個紋理結合:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texA); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texB); 
glDraw*(...) // draw with both texA and texB 

當然這將需要使用兩種紋理的着色器,以及如何組合它們(或將它們用於不同類型的數據)完全取決於您。

+0

我編輯我的文章 –

相關問題