我分析了以下遗留的opengl代码:
GLboolean textur2d;
glIsEnabled(texture2d, GL_TEXTURE_2D);
GLboolean rectangleNV;
glIsEnabled(rectangleNV, GL_TEXTURE_RECTANGLE_NV);
GLboolean texture3d;
glIsEnabled(texture3d, GL_TEXTURE_3D);
GLboolean cubeMap;
glIsEnabled(cubeMap,GL_TEXTURE_CUBE_MAP);
glDisable(GL_TEXTURE_RECTANGLE_NV);
glDisable(GL_TEXTURE_3D);
glDisable(GL_TEXTURE_CUBE_MAP);
glEnable(GL_TEXTURE_2D);
///some drawing
if(!texture2d)
glDisable(GL_TEXTURE_2D);
if(rectangleNV)
glEnable(GL_TEXTURE_RECTANGLE_NV);
if(texture3d)
glEnable(GL_TEXTURE_3D);
if(cubeMap)
glEnable(GL_TEXTURE_CUBE_MAP)
如您所见,在绘制纹理2d之前,其他纹理类型已被禁用。在旧版opengl中是否有必要?
答案 0 :(得分:2)
此代码遵循成为好客人并清理自己的原则。由于OpenGL是状态机,因此可能是从一个地方开始的,该地方期望状态机在代码运行后与以前一样处于同一状态。
纹理目标有一定的优先级,如果要使用2D纹理,则启用3D,立方体和矩形会对此产生干扰,因此必须首先禁用它们。但是,一旦完成,就可以还原状态。
这是一个好习惯,尤其是在库和插件中。