opengl函数(0)

来源:互联网 发布:西门子plc编程电缆 编辑:程序博客网 时间:2024/06/06 00:55

glutInit():负责初始化GLUT库。它会处理向程序输入的命令行参数,并且移除其中与控制GLUT如何操作相关的部分(例如设置窗口的大小)。glutInit()必须是应用程序调用的第一个GLUT函数,它会负责设置其他GLUT例程所必须的数据结构。

例:glutInit(&argc,argv);

glutInitDisplayMode():设置了程序所使用的窗口的类型

例:glutInitDisplayMode(GLUT_RGBA);设置窗口使用RGBA颜色空间

glutInitWindowSize():设置所需的窗口大小

例:glutInitWindowSize(512,512);

glutInitContextVersion(),glutInitContextProfile():设置了我们所需的OpenGL环境(context)的类型--这是OpenGL内部用于记录状态设置和操作的数据结构

例:glutInitContextVersion(4,3);glutInitContextProfile(GLUT_CORE_PROFILE);

glutCreateWindow():如果当前系统环境可以满足glutInitDisplayMode()的显示模式要求,就会调用计算机窗口系统的接口,创建一个窗口。只有GLUT创建一个窗口之后,(其中也包含创建OpenGL环境的过程),我们才可以使用OpenGL相关的函数。

例:glutCreateWindow(argv[0]);

glewInit():函数属于一个辅助库GLEW(OpenGL Extension Wrangler).GLEW可以简化获取函数地址的过程,并且包含了可以跨平台使用的其他一些OpenGL编程方法。

glutDisplayFunc():设置显示回调,即GLUT在每次更新窗口内容的时候会自动调用的例程。

例:glutDisplayFunc(display);

glutMainLoop():这是一个无限执行的循环,它会负责一直处理窗口和操作系统的用户输入等操作。例如:glutMainLoop()会判断窗口是否需要进行重绘,然后它就会自动调用glutDisplayFunc()中注册的函数。特别要注意的是,glutMainLoop()是一个无限循环,因此不会执行在它之后的所有命令。

void glGenVertexArrays(GLsizei n,GLuint * arrays):返回n个未使用的对象名到数组arrays中,用作顶点数组对象。返回的名字可以用来分配更多的缓存对象,并且他们已经使用未初始化的顶点数组集合的默认状态进行了数值的初始化。

例:enum VAO_IDs{Triangles,NumVAOs};

GLuint VAOs[NumVAOs];

glGenVertexArrays(NumVAOs, VAOs);

void glBindVertexArray(GLuint array):如果输入的变量array非0,并且是glGenVertexArrays()所返回的,那么它将创建一个新的顶点数组对象并且与其名称关联起来。如果绑定到一个已经创建的顶点数组对象中,那么会激活这个顶点数组对象,并且直接影响对象中所保存的顶点数组状态。如果输入的变量array为0,那么OpenGL将不再使用程序所分配的任何顶点数组对象,并且将渲染状态重设为顶点数组的默认状态。如果array不是glGenVertexArrays()所返回的数值,或者它已经被glDeleteVertexArrays()函数释放了,那么这里将产生一个GL_INVALID_OPERATION错误。

例:glBindVertexArray(VAOs[Triangles]);

void glDeleteVertexArrays(GLsizei n,GLuint *arrays):删除n个在arrays中定义的顶点数组对象,这样所有的名称可以再次用作顶点数组。如果绑定的顶点数组已经被删除,那么当前绑定的顶点数组对象被重设为0(类似执行了glBindBuffer()函数,并且输入参数为0),而默认的顶点数组会变成当前对象。在arrays当中未使用的名称都会被释放,但是当前顶点数组的状态不会发生任何变化。

GLboolean gllsVertexArray(GLuint array):如果array是一个已经用glGenVertexArrays()创建且没有被删除的顶点数组对象的名称,那么返回GL_TRUE。如果array为0或者不是任何顶点数组对象的名称,那么返回GL_FALSE.

void glGenBuffers(GLsizei n,GLuint * buffers):返回n个当前未使用的缓存对象名称,并保存到buffers数组中。返回到buffers中的名称不一定是连续的整形数据。这里返回的名称只用于分配其他缓存对象,他们在绑定之后只会记录一个可用的状态。0是一个保留的缓存对象名称,glGenBuffers()永远都不会返回这个值的缓存对象。

例:enum Buffer_IDs{ ArrayBuffer, NumBuffers };GLuint Buffers[NumBuffers];

glGenBuffers(NumBuffers, Buffers);

void glBindBuffer(GLenum target,GLuint buffer):指定当前激活的缓存对象。target必须设置为以下类型中的一个:GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER,GL_PIXEL_UNPACK_BUFFER,GL_COPY_READ_BUFFER,GL_COPY_WRITE_BUFFER,GL_TRANSFORM_FEEDBACK_BUFFER和GL_UNIFORM_BUFFER。buffer设置的是要绑定的缓存对象名称。

glBindBuffer()完成了三项工作:(1)如果是第一次绑定buffer,且它是一个非零的无符号整形,那么将创建一个与该名称相对应的新缓存对象。(2)如果绑定到一个已经创建的缓存对象,那么它将成为当前被激活的缓存对象。(3)如果绑定的buffer值为0,那么OpenGL将不再对当前target应用任何缓存对象。

例:glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);

void glDeleteBuffers(GLsizei n,const GLuint * buffers):删除n个保存在buffers数组中的缓存对象。被释放的缓存对象可以重用(例如:使用glGenBuffers())。如果删除的缓存对象已经被绑定,那么该对象的所有绑定将会重置为默认的缓存对象,即相当于用0作为参数执行glBindBuffer()的结果。如果试图删除不存在的缓存对象,或者缓存对象为0,那么将忽略该操作(不会产生错误).

GLboolean gllsBuffer(GLuint buffer):如果buffer是一个已经分配并且没有释放的缓存对象的名称,则返回GL_TRUE.如果buffer为0或者不是缓存对象的名称,则返回GL_FALSE;

void glBufferData(GLenum target,GLsizeiptr size,const GLvoid *data,GLenum usage):在OpenGL服务端内存中分配size个存储单元(通常为byte),用于存储数据或者索引。如果当前绑定的对象已经存在了关联的数据,那么首先删除这些数据。对于顶点属性数据,target设置为GL_ARRAY_BUFFER;索引数据为GL_ELEMENT_ARRAY_BUFFER;OpenGL的像素数据为GL_PIXEL_UNPACK_BUFFER;对于从OpenGL中获取的像素数据为GL_PIXEL_PACK_BUFFER;对于缓存之间的复制数据为GL_COPY_READ_BUFFER和GL_COPY_WRITE_BUFFER;对于纹理缓存中存储的纹理数据为GL_TEXTURE_BUFFER;对于通过transform feedback着色器获得的结果设置为GL_TRANSFORM_FEEDBACK_BUFFER,而一致变量要设置为GL_UNIFORM_BUFFER.size表示存储数据的总数量。这个数值等于data中存储的元素的总数乘以单位元素存储空间的结果。data要么是一个客户端内存的指针,以便初始化缓存对象,要么是NULL.如果传入的指针合法,那么将会有size大小的数据从客户端拷贝到服务端。如果传入NULL,那么将保留size大小的未初始化的数据,以备后用。usage用于设置分配数据之后的读取和写入方式。可用的方式包括GL_STREAM_DRAW,GL_STREAM_READ,GL_STREAM_COPY,GL_STATIC_DRAW,GL_STATIC_READ,GL_STATIC_COPY,GL_DYNAMIC_DRWA,GL_DYNAMIC_READ和GL_DYNAMIC_COPY.

如果所需的size大小超过了服务端能够分配的个度,那么glBufferData()将会产生一个GL_OUT_OF_MEMORY错误。如果usage设置的不是可用的模式值,那么将产生GL_INVALID_VALUE错误。

例:

GLfloat vertices[NumVertices][2] = 
{
{-0.90,-0.90},
{0.85,-0.90},
{-0.90,0.85},
{0.90,-0.85},
{0.90,0.90},
{-0.85,0.90}
};

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

void glVertexAttribPointer(GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const GLvoid *pointer):设置index(着色器中的属性位置)位置对应的数据值。pointer表示缓存对象中,从起始位置开始计算的数组数据的偏移值(假设起始地址为0),使用基本的系统单位(byte)。size表示每个顶点需要更新的分量数目,可以是1,2,3,4或者GL_BGRA.type指定了数组中每个元素的数据类型(GL_BYTE,GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT,GL_INT,GL_UNSIGNED_INT,GL_FIXED,GL_HALF_FLOAT,GL_FLOAT或GL_DOUBLE)。normalized设置顶点数据在存储前是否进行归一化(或者使用glVertexAttribFourN*()函数)。stride是数组中没2个元素之间的大小偏移值(byte).如果stride为0,那么数据应该紧密地封装在一起。

例:#define BUFFER_OFFSET(x)  ((const void*) (x))

enum Attrib_IDs{vPosition = 0};

GLfloat vertices[NumVertices][2] = {
{-0.90,-0.90},
{0.85,-0.90},
{-0.90,0.85},
{0.90,-0.85},
{0.90,0.90},
{-0.85,0.90}
};

glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

其中:index = 0,这就是顶点着色器中输入变量的location值,也就是之前的vPosition.在着色器中这个值用来直接指定布局限位符,不过也可以用于着色器编译后的判断。size = 2,这是数组中每个顶点的元素数目。vertices中共有NumVertices个顶点,每个顶点有2个元素值。type = GL_FLOAT:这个枚举量表示GLfloat类型。normalized = GL_FALSE:表示设置为GL_FALSE的原因有2个,最重要的第一点是因为它表示位置坐标值,因此可以是任何数值,不应当限制在[-1,1]的归一化范围内,第二点是因为它不是整形(GLint或者GLshort).stride = 0:数据在这里是“紧密封装”的,即每组数据值在内存中都是立即与下一组数据值想衔接的,因此可以直接设置为0.pointer = BUFFER_OFFSET(0):这里设置为0,因为数据是从缓存对象的第一个字节(地址为0)开始的。

void glEnableVertexAttribArray(GLuint index);void glDisableVertexAttribArray(GLuint index):设置是否启用与index索引相关联的顶点数组。index必须是一个介于0到GL_MAX_VERTEX_ATTRIBS-1之间的值。

例:enum Attrib_IDs{vPosition = 0};

glEnableVertexAttribArray(vPosition);

void glClear(GLbitfield mask):清除指定的缓存数据并重设为当前的清除值。mask是一个可以通过逻辑“或”操作来指定多个数值的参数。其中GL_COLOR_BUFFER_BIT:颜色缓存,GL_DEPTH_BUFFER_BIT:深度缓存,GL_STENCIL_BUFFER_BIT:模板缓存

例:glClear(GL_COLOR_BUFFER_BIT);使用OpenGL默认的清除颜色黑色,清除。可用glClearColor()设置清除颜色。

void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha):设置当前使用的清除颜色值,用于RGBA模式下对颜色缓存的清除工作。这里的red,green,blue,alpha都会被截断到[0,1]的范围内。默认清除颜色是(0,0,0,0)在RGBA模式下它表示黑色。

void glDrawArrays(GLenum mode,GLint first,GLsizei count):使用当前绑定的顶点数组元素来建立一系列的几何图元,起始位置为first,而结束位置为first+count-1.mode设置了构建图元的类型。它可以是GL_POINTS,GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN和GL_PATCHES中的任意一种。其中GL_PATCHES类型是不会输出任何结果的,因为它是用于细分着色器的。

void glFlush(void):强制之前的OpenGL命令立即执行,这样就可以保证它们在一定时间内全部完成。

void glFinish(void):强制所有当前的OpenGL命令立即执行,并且等待它们全部完成。

void glEnable(GLenum capability);void glDisable(GLenum capability):glEnable()会开启一个模式,glDisable()会关闭它。例如GL_DEPTH_TEST可以用来开启或者关闭深度测试。GL_BLEND可以用来控制融合的操作,而GL_RASTERIZER_DISCARD用于transform feedback过程中的高级渲染控制。

GLboolean gllsEnabled(GLenum capability):根据是否启用当前指定的模式,返回GL_TRUE或者GL_FALSE.





























0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 试电笔电阻坏了怎么办 父子间车辆过户怎么办 房子卖了天然气怎么办 社保这个月没扣怎么办 员工不交社保怎么办 公司没交社保怎么办 微信转账受限怎么办 支付宝违规限制怎么办 微信转账不还钱怎么办 碳放久了不爱起火怎么办 闻碳火时间久了怎么办 被代运营诈骗怎么办 被上海聚连骗了怎么办? 蓝领贷逾期半年怎么办 淘宝店倒闭售后怎么办 淘宝店铺宝贝被下架怎么办 医院被托管编制怎么办 领码分百万账号异常怎么办 拼多多帐号异常怎么办 qq钱包交易异常怎么办 托管公司跑了怎么办? 花呗退款没到账怎么办 车辆过户了车牌怎么办 货车资格证脱审怎么办 廉租房夫妻离婚怎么办 二手车行驶证怎么办的? 卖二手车后车牌怎么办 房子动迁没过户怎么办? 北京买车指标怎么办 签合同不交社保怎么办 养老保险交重了怎么办 公司克扣员工工资应该怎么办 天猫拒绝退款怎么办 一看书就犯困怎么办 擦了风油精过敏怎么办 擦了清凉油过敏怎么办 脸上擦风油精过敏怎么办 搽了风油精过敏怎么办 背带裤显屁股大怎么办 打底衫肥了怎么办 天猫卖家总是发信息怎么办