可以這樣簡單的理解為:顯卡中有N個紋理單元(具體數目依賴你的顯卡能力),每個紋理單元(GL_TEXTURE0、GL_TEXTURE1等)都有GL_TEXTURE_1D、GL_TEXTURE_2D等,如下代碼:
[cpp] view plain copy print ? struct TextureUnit { GLuint targetTexture1D; GLuint targetTexture2D; GLuint targetTexture3D; GLuint targetTextureCube; ... }; TextureUnit textureUnits[GL_MAX_TEXTURE_IMAGE_UNITS] GLuint currentTextureUnit = 0;
預設情況下當前活躍的紋理單元為0.
[cpp] view plain copy print ? void glActiveTexture(GLenum textureUnit) { currentTextureUnit = textureUnit - GL_TEXTURE0 ; }
glActiveTextue 並不是啟用紋理單元,而是選擇當前活躍的紋理單元。
[cpp] view plain copy print ? void glBindTexture(GLenum textureTarget, GLuint textureObject) { TextureUnit *texUnit = &textureUnits[currentTextureUnit]; switch(textureTarget) { case GL_TEXTURE_1D: texUnit->targetTexture1D = textureObject; break; case GL_TEXTURE_2D: texUnit->targetTexture2D = textureObject; break; case GL_TEXTURE_3D: texUnit->targetTexture3D = textureObject; break; case GL_TEXTURE_CUBEMAP: texUnit->targetTextureCube = textureObject; break; } }
從範例程式碼中可以看到:當綁定紋理目標時,所作用的是當前活躍的紋理單元。