您的位置:首页 > 运维架构

OpenGL简介

2018-01-24 13:10 183 查看
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