OpenGL 的glDisable(GL_TEXTURE_2D)函数和glBindTexture(GL_TEXTURE_2D,0)有什么区别?
OpenGL glDisable(GL_TEXTURE_2D) vs glBindTexture(GL_TEXTURE_2D,0)
These are two fundamentally different things.
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0)
glDisable (GL_TEXTURE_2D)
- Disables 2D textures for the active Texture Unit in the fixed-function OpenGL pipeline.
- In programmable OpenGL (GLSL or the older ARB VP/FP assembly languages), enabling or disabling GL_TEXTURE_2D is meaningless.
glBindTexture (GL_TEXTURE_2D,0)
- Binds the "default" texture to the active Texture Image Unit.
- For all intents and purposes, there is always a texture bound to a Texture Image Unit; 0 is just a special-case with an initially incomplete set of states, thus complicating validation (see below).
There is a little bit of validation overhead associated with binding any OpenGL resource (GLSL programs and FBOs tend to have the most complicated validation). In general, changing an object binding tends to be more expensive than changing one or two states associated with a bound object.
Therefore, unnecessarily changing the bound texture is inadvisable.
If your intention by binding 0 was simply to "disable" a texture, you would be better off setting a uniform value to communicate this intent to a shader. Uniforms are extremely cheap to set (assuming you do not do something stupid like query their location everytime you set them). Changing a uniform is orders of magnitude quicker than binding a different texture or even worse a different GLSL program.
If you are using fixed-function OpenGL: OpenGL1.0
- Disabling GL_TEXTURE_2D is a better way of approaching this problem.
- Changing bound objects should be done as little as possible.
If you are using programmable OpenGL: OpenGL2.0
- Neither of these things make much sense.
- Work your desired behavior into your shaders.