OpenGL(全写Open Graphics Library)开放图形库一个跨编程语言、跨平台(Windows、类Unix、Linux、MacOS)的编程接口规格的专业的
图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL是行业领域中最为广泛接纳的 2D/3D 图形 API。
1. glGenTextures函数
是用来生成纹理的函数。对应glDeleteTextures函数
void glGenTextures(GLsizei n, GLuint *texture);
n:用来生成纹理的数量
textures:存储纹理索引的第一个元素指针
这里纹理名称GLuint *texture是整型的,因此也可以理解为这个函数为这n个纹理指定了n个不同的ID。纹理名称集合不必是一个连续的整数集合。
在用GL渲染的时候,纹理是很常见的东西。使用纹理之前,必须执行这句命令为你的texture分配一个ID,然后绑定这个纹理,加载纹理图像,这之后,这个纹理才可以使用。
此外遇到过在类的构造函数中调用glGenTextures失败,分配纹理对象会失败,具体原因是什么,我也不太清楚,貌似是
还没有调用wglMakeCurrent。这时候当前线程的关联RC为空,当然不能分配纹理ID。
2.glIsTexture函数
用于判断一个值是否是纹理的ID。
函数原型:GLboolean glIsTexture(GLuint texture);
3.glActiveTexture函数
void glActiveTexture(GLenum texUnit);
该函数选择一个纹理单元,线面的纹理函数将作用于该纹理单元上,参数为符号常量GL_TEXTUREi ,i的取值范围为0~K-1,K是OpenGL实现支持的最大纹理单元数,可以使用GL_MAX_TEXTURE_UNITS来调用函数glGetIntegerv()获取该值。
可以这样简单的理解为:显卡中有N个纹理单元(具体数目依赖你的显卡能力),每个纹理单元(GL_TEXTURE0、GL_TEXTURE1等)都有GL_TEXTURE_1D、GL_TEXTURE_2D等,如下:
struct TextureUnit
{
GLuint targetTexture1D;
GLuint targetTexture2D;
GLuint targetTexture3D;
GLuint targetTextureCube;
...
};
TextureUnit textureUnits[GL_MAX_TEXTURE_IMAGE_UNITS]
GLuint currentTextureUnit = 0;
默认情况下当前活跃的纹理单元为0.
void glActiveTexture(GLenum textureUnit)
{
currentTextureUnit = textureUnit - GL_TEXTURE0 ;
}
Active应理解为选择(Select)某纹理单元(Texture Unit), 即表示后续的glEnable(GL_TEXTURE_2D)和glBindTexture(GL_TEXTURE_2D, texture)作用于此所选的纹理单元,所以glActiveTextue 并不是激活纹理单元,而是选择当前活跃的纹理单元。
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;
}
}
从示例代码中可以看到:当绑定纹理目标时,所作用的是当前活跃的纹理单元。
4.glBindTexture函数
函数说明: 允许建立一个绑定到目标纹理的有名称的纹理。
void glBindTexture(GLenum target, GLuint texture );
target —— 纹理被绑定的目标,它只能取值GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D或者GL_TEXTURE_CUBE_MAP;
texture —— 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。
纹理的名称是一个无符号的整数。在每个纹理目标中,0被保留用以代表默认纹理。纹理名称与相应的纹理内容位于当前GL rendering上下文的共享对象空间中。
实际上是改变了OpenGL的这个状态,它告诉OpenGL下面对纹理的任何操作都是对它所绑定的纹理对象的,比如glBindTexture(GL_TEXTURE_2D,1)告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的。
产生纹理函数假定目标纹理的面积是由glBindTexture函数限制的。先前调用glGenTextures产生的纹理索引集不会由后面调用的glGenTextures得到,除非他们首先被glDeleteTextures删除。你不可以在显示列表中包含glGenTextures。
5.glDeleteTextures函数
删除纹理对象
void glDeleteTextures( GLsizei n, const GLuint * textures);
删除n个纹理对象数组元素。删除后,该纹理不再可用,如果被删除的纹理已经被绑定,那么程序将绑定一个为0的纹理对象。
被glDeleteTextures函数delete掉的纹理,可以通过glGenTextures再次返回,重复使用。如果glDeleteTextures要删除的纹理是一个为0的纹理对象,或者不存在的纹理对象,那么也不会有什么影响。
OpenGL是行业领域中最为广泛接纳的 2D/3D 图形 API。
1. glGenTextures函数
是用来生成纹理的函数。对应glDeleteTextures函数
void glGenTextures(GLsizei n, GLuint *texture);
n:用来生成纹理的数量
textures:存储纹理索引的第一个元素指针
这里纹理名称GLuint *texture是整型的,因此也可以理解为这个函数为这n个纹理指定了n个不同的ID。纹理名称集合不必是一个连续的整数集合。
在用GL渲染的时候,纹理是很常见的东西。使用纹理之前,必须执行这句命令为你的texture分配一个ID,然后绑定这个纹理,加载纹理图像,这之后,这个纹理才可以使用。
此外遇到过在类的构造函数中调用glGenTextures失败,分配纹理对象会失败,具体原因是什么,我也不太清楚,貌似是
还没有调用wglMakeCurrent。这时候当前线程的关联RC为空,当然不能分配纹理ID。
2.glIsTexture函数
用于判断一个值是否是纹理的ID。
函数原型:GLboolean glIsTexture(GLuint texture);
3.glActiveTexture函数
void glActiveTexture(GLenum texUnit);
该函数选择一个纹理单元,线面的纹理函数将作用于该纹理单元上,参数为符号常量GL_TEXTUREi ,i的取值范围为0~K-1,K是OpenGL实现支持的最大纹理单元数,可以使用GL_MAX_TEXTURE_UNITS来调用函数glGetIntegerv()获取该值。
可以这样简单的理解为:显卡中有N个纹理单元(具体数目依赖你的显卡能力),每个纹理单元(GL_TEXTURE0、GL_TEXTURE1等)都有GL_TEXTURE_1D、GL_TEXTURE_2D等,如下:
struct TextureUnit
{
GLuint targetTexture1D;
GLuint targetTexture2D;
GLuint targetTexture3D;
GLuint targetTextureCube;
...
};
TextureUnit textureUnits[GL_MAX_TEXTURE_IMAGE_UNITS]
GLuint currentTextureUnit = 0;
默认情况下当前活跃的纹理单元为0.
void glActiveTexture(GLenum textureUnit)
{
currentTextureUnit = textureUnit - GL_TEXTURE0 ;
}
Active应理解为选择(Select)某纹理单元(Texture Unit), 即表示后续的glEnable(GL_TEXTURE_2D)和glBindTexture(GL_TEXTURE_2D, texture)作用于此所选的纹理单元,所以glActiveTextue 并不是激活纹理单元,而是选择当前活跃的纹理单元。
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;
}
}
从示例代码中可以看到:当绑定纹理目标时,所作用的是当前活跃的纹理单元。
4.glBindTexture函数
函数说明: 允许建立一个绑定到目标纹理的有名称的纹理。
void glBindTexture(GLenum target, GLuint texture );
target —— 纹理被绑定的目标,它只能取值GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D或者GL_TEXTURE_CUBE_MAP;
texture —— 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。
纹理的名称是一个无符号的整数。在每个纹理目标中,0被保留用以代表默认纹理。纹理名称与相应的纹理内容位于当前GL rendering上下文的共享对象空间中。
实际上是改变了OpenGL的这个状态,它告诉OpenGL下面对纹理的任何操作都是对它所绑定的纹理对象的,比如glBindTexture(GL_TEXTURE_2D,1)告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的。
产生纹理函数假定目标纹理的面积是由glBindTexture函数限制的。先前调用glGenTextures产生的纹理索引集不会由后面调用的glGenTextures得到,除非他们首先被glDeleteTextures删除。你不可以在显示列表中包含glGenTextures。
5.glDeleteTextures函数
删除纹理对象
void glDeleteTextures( GLsizei n, const GLuint * textures);
删除n个纹理对象数组元素。删除后,该纹理不再可用,如果被删除的纹理已经被绑定,那么程序将绑定一个为0的纹理对象。
被glDeleteTextures函数delete掉的纹理,可以通过glGenTextures再次返回,重复使用。如果glDeleteTextures要删除的纹理是一个为0的纹理对象,或者不存在的纹理对象,那么也不会有什么影响。