Opengl函数(3)

来源:互联网 发布:股票开户软件 编辑:程序博客网 时间:2024/05/21 10:42

1.void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
void glClearDepth(GLclampd depth);
void glClearDepthf(GLclampf depth);
void glClearStencil(GLint s);
设置当前颜色缓存、深度缓存和模板缓存的清除值。GLclampf和GLclampd类型(即截断后的GLfloat和GLdouble)需要被截断到0.0~1.0区间内。默认的深度清除值是1.0;而所有其他缓存的默认清除值都是0.使用这些命令设置的数值会一直有效,直到再次使用同样的命令将它改变为止。

2.void glClear(GLbitfield mask)
清除特定的缓存。mask的值是以下几种枚举量之间按位“或”操作的结果:GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT以及GL_STENCIL_BUFFER_BIT,它们用来指定要清除的缓存类型。GL_COLOR_BUFFER_BIT可以清除RGBA的颜色缓存,以及其他所有可写入的颜色缓存。如果启用了像素的所有权测试,剪切测试,或者抖动特性,那么它们会对清除操作产生影响,同理还有glColorMask()所设置的掩码操作。不过深度和模板测试不会影响到glClear()的结果。

3.void glColorMask(GLboolean red,GLboolean green,GLboolean blue,GLboolean alpha)
void glColorMaski(GLuint buffer,GLboolean red,GLboolean green,GLboolean blue,GLboolean alpha)
void glDepthMask(GLboolean flag)
void glStencilMask(GLboolean mask)
void glStencilMaskSeparate(GLenum face,GLuint mask);
设置用于控制写入不同缓存的掩码。
如果glDepthMask()的参数flag为GL_TRUE,那么深度缓存可以写入,否则,无法写入。glStencilMask()的mask参数用于与模板值进行按位“与”操作,如果对应位操作的结果为1,那么像素的模板值可以写入,如果为0则无法写入。
所有GLboolean掩码的默认值均为GL_TRUE,而所有GLuint掩码的默认值都是1.
glStencilMaskSeparate()可以为多边形的正面和背面设置不同的模板掩码值。
如果需要渲染到多个颜色缓存,glColorMaski()可以对特定的缓存对象(通过buffer参数指定)设置颜色掩码。

4.void glGetMultisamplefv(GLenum pname,GLuint index,GLfloat* val)
如果设置pname为GL_SAMPLE_POSITION,那么glGetMultisamplefv()会返回第index个样本的位置信息作为存储在val参数中的一对浮点数值。位置信息的区间为[0,1],即该样本相对于像素左下角位置的偏移值。
如果index大于或者等于系统所支持的样本数(即通过glGetIntegerv())设置参数为GL_SAMPLES来获取结果),那么将产生一个GL_INVALID_VALUE错误。

5.void glMinSampleShading(GLfloat value)
设置每个像素中独立着色的样本值数量。value设置的是独立着色样本占总样本数的比率,因此需要限制在[0,1]区间内,其中1.0表示所有的样本都会使用唯一一组采样数据。

6.void glScissor(GLint x,GLint y,GLsizei width,GLsizei height)
设置剪切矩形(或者剪切盒)的位置与大小。函数的参数定义了矩形的左下角(x,y)以及宽度(width)和高度(height).所有位于矩形之内的像素都会通过剪切测试。剪切可以通过glEnable()和glDisable()来开启或者禁止。相应的参数为GL_SCISSOR_TEST.默认条件下,剪切矩形与窗口的大小是相等的,并且剪切测试是关闭的。

7.void glSampleCoverage(GLfloat value,GLboolean invert)
设置多重采样覆盖率的参数,以正确解算alpha值。如果开启GL_SAMPLE_COVERAGE或者GL_SAMPLE_ALPHA_TO_COVERAGE,那么value是一个临时的采样覆盖值。invert是一个布尔变量,用于设置这个临时覆盖值是否需要先进行位反转,然后再与片元覆盖率进行合并(“与”操作)。

8.void glSampleMaski(GLuint index,GLbitfield mask)
设置一个32位的采样掩码mask.掩码本身的索引位置通过index来设置,而新的掩码值通过mask来设置。当采样结果准备写入到帧缓存时,只有当前采样掩码值中对应位的数据才会被更新,而其他的数据将会被丢弃。

9.void glStencilFunc(GLenum func,GLint ref,GLuint mask)
void glStencilFuncSeparate(GLenum face,GLenum func,GLint ref,GLuint mask)
设置比较函数func,参数值ref以及掩码mask以完成模板测试。参考值将与模板缓存中已有的值进行比较,但是在此之前需要与mask参数进行按位“与”操作,丢弃结果为0的位平面。比较函数可以是GL_NEVER,GL_ALWAYS,GL_LESS,GL_LEQUAL,GL_EQUAL,GL_GEQUAL,GL_GREATER或者GL_NOTEQUAL中的一种。
举例来说,如果函数为GL_LESS,那么当ref比模板缓存中的数值更小时,片元将通过测试。如果模板缓存包含了s个位平面,那么mask参数中较低的s个位数据将分别与模板缓存中的值,以及参考值进行“与”操作,然后再执行具体的比较。
经过掩码操作的数据均被解析成非负数据。模板测试的开启和禁止是通过glEnable()和glDisable(),以及参数GL_STENCIL_TEST来完成的。默认情况下,func为GL_ALWAYS,ref为0,而mask的所有位均为1,并且模板测试默认禁止。
glStencilFuncSeparate()允许我们为多边形的正面和背面单独设置模板函数参数。

10.void glStencilOp(GLenum fail,GLenum zfail,GLenum zpass)
void glStencilOpSeparate(GLenum face,GLenum fail,GLenum zfail,GLenum zpass)
设置当前片元通过或者没有通过模板测试的时候,要如何处理模板缓存中的数据。三个函数参数fail,zfail和zpass都可以设置为GL_KEEP,GL_ZERO,GL_REPLACE,GL_INCR,GL_INCR_WRAP,GL_DECR,GL_DECR_WRAP或者GL_INVERT中的一个。它们依次等价于保持当前值、替换为0值、替换为参考值、增加1(使用饱和运算)、增加1(不使用饱和运算)、减少1(使用饱和运算),减少1(不使用饱和运算)、以及按位反转。加1和减1函数的结果值总是落在0到最大无符号整数值(如果模板缓存有s位,那么就是2^s-1)的区间内。
如果片元没有通过模板测试,将执行fail函数;如果通过了模板测试,但是没有通过深度测试,那么执行zfail函数;如果通过深度测试或者没有开启深度测试,则执行zpass函数。默认情况下,这三个模板操作的函数均设置为GL_KEEP.
glStencilOpSeparate()允许我们为多边形的正面和背面单独设置模板测试参数。

11.void glDepthFunc(GLenum func)
设置深度测试的比较函数。比较函数可以是GL_NEVER、GL_ALWAYS、GL_LESS、GL_LEQUAL、GL_EQUAL、GL_GEQUAL、GL_GREATER或者GL_NOTEQUAL中的一种。对于任何输入的片元,如果它的z值与深度缓存中已有的值相比符合函数定义的条件,则测试通过。默认的比较函数为GL_LESS,即只有输入片元的z值比深度缓存中已有的值更小的时候,深度测试才会通过。而这里的z值也就对应于物体到视点的距离,更小的值意味着对应的物体更靠近视点所在的位置。

12.void glPolygonOffset(GLfloat factor,GLfloat units)
开启之后,每个片元的深度值都会被修改,在执行深度测试之前添加一个计算偏移值。这个偏移值的计算过程为:offset = m · factor + r · units
其中m是多边形的最大深度斜率(在光栅化过程中计算得到),r是两个不同深度值之间的、可识别的最小差值,它是一个与平台相关的常量。参数factor和units也可以是负数。

13.void glBlendFunc(GLenum srcfactor,GLenum destfactor)
void glBlendFunci(GLuint buffer,GLenum srcfactor,GLenum destfactor)
控制片元输出的颜色值(源)与存储在帧缓存中的值(目标)来进行混合。各参数的可用值如下。参数srcfactor设置源融混参数的计算方式,而destfactor设置目标融混参数的计算方式。
glBlendFunc()设置所有可绘制缓存的融混参数,而glBlendFunci()只会设置缓存buffer的融混参数。
对于无符号和有符号的归一化帧缓存格式,融混参数将分别限制在[0,1]或者[-1,1]的区间内。如果帧缓存采用浮点数格式,那么参数是不存在上限和下限的。
源和目标融混参数:
枚举常量 RGB融混参数 Alpha融混参数
GL_ZERO (0,0,0) 0
GL_ONE (1,1,1) 1
GL_SRC_COLOR (Rs,Gs,Bs) As
GL_ONE_MINUS_SRC_COLOR (1,1,1)-(Rs,Gs,Bs) 1-As
GL_DST_COLOR (Rd,Gd,Bd) Ad
GL_ONE_MINUS_DST_COLOR (1,1,1)-(Rd,Gd,Bd) 1-Ad
GL_SRC_ALPHA (As,As,As) As
GL_ONE_MINUS_SRC_ALPHA (1,1,1)-(As,As,As) 1-As
GL_DST_ALPHA (Ad,Ad,Ad) Ad
GL_ONE_MINUS_DST_ALPHA (1,1,1)-(Ad,Ad,Ad) 1-Ad
GL_CONSTANT_COLOR (Rc,Gc,Bc) Ac
GL_ONE_MINUS_CONSTANT_COLOR (1,1,1)-(Rc,Gc,Bc) 1-Ac
GL_CONSTANT_ALPHA (Ac,Ac,Ac) Ac
GL_ONE_MINUS_CONSTANT_ALPHA (1,1,1)-(Ac,Ac,Ac) 1-Ac
GL_SRC_ALPHA_SATURATE (f,f,f),f=min(As,1-Ad) 1
GL_SRC1_COLOR (Rs1,Gs1,Bs1) As1
GL_ONE_MINUS_SRC1_COLOR (1,1,1)-(Rs1,Gs1,Bs1) 1-As1
GL_SRC1_ALPHA (As1,As1,As1) As1
GL_ONE_MINUS_SRC1_ALPHA (1,1,1)-(As1,As1,As1) 1-As1

14.void glBlendFuncSeparate(GLenum srcRGB,GLenum destRGB,GLenum srcAlpha,GLenum destAlpha)
void glBlendFuncSeparatei(GLuint buffer,GLenum srcRGB,GLenum destRGB,GLenum srcAlpha,GLenum destAlpha);
glBlendFuncSeparate()与glBlendFunc()类似,是控制片元输出的颜色值(源)与存储在帧缓存中的值(目标)之间的混合方式。glBlendFuncSeparate()能够接受的参数类型与glBlendFunc()也是相同的。参数srcRGB设置颜色值的源融混参数,destRGB设置颜色值的目标融混参数。而参数srcAlpha设置alpha值的源融混参数,destAlpha设置alpha值的目标融混参数.
glBlendFuncSeparate()设置所有可绘制缓存的融混参数,而glBlendFuncSeparatei()只会设置缓存buffer的融混参数。

15.void glBlendColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha)
如果融混模式为GL_CONSTANT_COLOR,那么设置一组红色,绿色,蓝色和alpha值作为常量颜色(Rc,Gc,Bc,Ac);

16.void glBlendEquation(GLenum mode)
void glBlendEquationi(GLuint buffer,GLenum mode)
设置帧缓存和源数据颜色之间混合的方法。mode可用的数值包括GL_FUNC_ADD(默认值)、GL_FUNC_SUBTRACT、GL_FUNC_REVERSE_SUBTRACT、GL_MIN和GL_MAX.这些模式的意义如下。
glBlendEquation()为所有的缓存设置融混模式,而glBlendEquationi()可以为buffer参数指定的缓存设置模式,buffer指的是缓存的整数索引名。
融混方程的数学操作符
融混模式参数 数学操作
GL_FUNC_ADD CsS+CdD
GL_FUNC_SUBTRACT CsS-CdD
GL_FUNC_REVERSE_SUBTRACT CdD-CsS
GL_MIN min(CsS,CdD)
GL_MAX max(CsS,CcD)
其中Cs和Cd分别表示源和目标的颜色。其中的S和D参数表示glBlendFunc()或者glBlendFuncSeparate()设置的源融混参数和目标融混参数。

17.void glBlendEquationSeparate(GLenum modeRGB,GLenum modeAlpha)
void glBlendEquationSeparatei(GLuint buffer,GLenum modeRGB,GLenum modeAlpha)
设置帧缓存和源数据颜色之间混合的方法、并且允许RGB和alpha颜色分量使用不同的融混模式。参数modeRGB和modeAlpha可用的枚举量与glBlendEquation()中的模式相同。
再次强调glBlendEquationSeparate()设置的是所有缓存的融混模式,而glBlendEquationSeparatei()设置由buffer索引所指定的缓存融混模式。

18.void glLogicOp(GLenum opcode)
对于给定的输入片元(源)和当前颜色缓存的像素(目标),选择需要执行的逻辑操作。opcode的可用值以及它们的意义如下(s表示数据源,d表示目标),默认值为GL_COPY.对于浮点型缓存,或者sRGB格式的缓存来说,逻辑操作奖杯自动忽略。
GL_CLEAR:0
GL_COPY:s
GL_NOOP:d
GL_SET:1
GL_COPY_INVERTED:¬s
GL_INVERT:¬d
GL_AND_REVERSE:s∧¬d
GL_OR_REVERSE:s∨¬d
GL_AND:s∧d
GL_OR:s∨d
GL_NAND:¬(s∧d)
GL_NOR:?(s∨d)
GL_XOR:s XOR d
GL_EQUIV:¬(s XOR d)
GL_AND_INVERTED:¬s∧d
GL_OR_INVERTED:¬s∨d

19.void glGenQueries(GLsizei n,GLuint * ids)
返回n个当前未使用的遮挡查询对象名称,并保存到ids数组当中。ids中返回的名称不一定是一组连续的整数。
这里返回的名称在系统内部已经做了标识,因此再生成新的查询对象时,不会产生重复,只要在调用glBenginQuery指定了某个名称,那么它就是有效的。
0是一个保留的遮挡查询对象名称,glGenQueries()不可能返回0值作为有效名称。

20.GLboolean gllsQuery(GLuint id)
如果id是一个遮挡查询对象的名称,那么返回GL_TRUE.如果id为0或者是一个非零值,但是不是遮挡查询对象的名称,那么返回GL_FALSE.

21.void glBeginQuery(GLenum target,GLuint id)
启动遮挡查询操作。target必须是GL_SAMPLES_PASSED、GL_ANY_SAMPLES_PASSED或者GL_ANY_SAMPLES_PASSED_CONSERVATIVE.id是一个无符号整型的标识符,用于标识本次遮挡查询操作。

22.void glEndQuery(GLenum target)
结束遮挡查询操作。target必须是GL_SAMPLES_PASSED或者GL_ANY_SAMPLES_PASSED.

23.void glGetQueryObjectiv(GLenum id,GLenum pname,GLint* params)
void glGetQueryObjectuiv(GLenum id,GLenum pname,GLuint* params)
获取遮挡查询对象的状态信息。id是遮挡查询物体的名称。如果pname是GL_QUERY_RESULT,那么通过深度测试的片元或者样本(如果开启了多重采样)的数量将被写入到params中,如果返回值为0,那么表示这个物体已经完全遮挡了。
遮挡查询操作结束之后可能会有一点延迟才能获取结果。如果pname为GL_QUERY_RESULT_AVAILABLE,并且查询id的结果已经可以读取,那么params中会写入GL_TRUE;否则会写入GL_FALSE.

24.void glDeleteQueries(GLsizei n,const GLuint *ids)
删除n个遮挡查询对象,他们的名字为数组ids中的元素。
释放查询对象之后,就可以重新使用了(例如通过glGenQueries()函数再次生成)。

25.void glBeginConditionalRender(GLuint id,GLenum mode)
void glEndConditionalRender(void)
记录一系列OpenGL渲染命令,系统会根据遮挡查询对象id的结果来决定是否自动抛弃他们。mode设置OpenGL中要如何使用遮挡查询的结果,它必须是以下枚举量之一:GL_QUERY_WAIT,GL_QUERY_NO_WAIT,GL_QUERY_BY_REGION_WAIT或者GL_QUERY_BY_REGION_NO_WAIT.
如果id不是有效的遮挡查询对象,那么将产生GL_INVALID_VALUE错误。如果在条件渲染队列已经开始执行的时候再次调用glBeginConditionalRender(),或者在条件渲染没有启用的时候调用了glEndConditionalRender(),或者id作为遮挡查询对象被设置为GL_SAMPLES_PASSED以外的模式,或者id对应的遮挡查询还在进行中,都会产生GL_INVALID_OPERATION错误。
mode的取值:
GL_QUERY_WAIT:GPU将等待遮挡查询的结果返回,然后判断它是否要继续进行渲染。
GL_QUERY_NO_WAIT:GPU可以不等待遮挡查询的结果返回就继续进行渲染。如果结果还未返回的话,那么它将选择条件渲染区域内的一部分场景进行渲染。
GL_QUERY_BY_REGION_WAIT:GPU将判断片元的结果是否对条件渲染有所贡献,并等待这些结果渲染完成。同时它也会等待完整的遮挡查询结果返回
GL_QUERY_BY_REGION_NO_WAIT:GPU将会抛弃帧缓存中所有对遮挡查询没有贡献的区域,并且即使结果还没有返回,它也会开始渲染其他区域的内容。

26.void glHint(GLenum target,GLenum hint)
控制OpenGL的一些具体特性。target参数用来设置要控制的特性类型,它的可用值如下。hint参数可以设置为GL_FASTEST,表示使用效率最高的方式,而GL_NICEST表示使用质量最高的方式,GL_DONT_CARE表示没有偏好。hint参数的解析方式是与平台相关的;有些OpenGL的实现可能会完全忽略他们的影响。
可用参数值:
GL_LINE_SMOOTH_HINT:线的反走样质量
GL_POLYGON_SMOOTH_HINT:多边形的反走样质量
GL_TEXTURE_COMPRESSION_HINT:纹理图像压缩的质量和性能
GL_FRAGMENT_SHADER_DERIVATIVE_HINT:片元处理内置函数的导数精度,包括dFdx、dFdx以及fwidth

27.void glGenFramebuffers(GLsizei n,GLuint* ids)
分配n个未使用的帧缓存对象名称,并且将它们存储到ids中
如果n为负数,那么将产生一个GL_INVALID_VALUE错误。

28.void glBindFramebuffer(GLenum target,GLuint framebuffer)
设置一个可读或者可写的帧缓存。如果target为GL_DRAW_FRAMEBUFFER,那么framebuffer设置的是绘制时的目标帧缓存。类似地,如果target设置为GL_READ_FRAMEBUFFER,那么framebuffer就是读取操作的数据源。如果target设置为GL_FRAMEBUFFFER,那么framebuffer所设置的帧缓存是可读也可写的。
framebuffer设置为0的话,表示将目标绑定到默认的窗口系统帧缓存,或者设置为一个glGenFramebuffers()所生成的帧缓存对象。
如果framebuffer不是0也不是一个可用的帧缓存对象(可用的对象是通过glGenFramebuffers()生成的,并且没有被glDeleteFramebuffers()所释放),那么将产生一个GL_INVALID_OPERATION错误。

29.void glDeleteFramebuffers(GLsizei n,const GLuint * ids)
将n个帧缓存对象释放,对象的名称保存在ids中。如果某个帧缓存对象当前已经被绑定(例如它的名称在最近一次调用glBindFramebuffer()时被使用),那么删除它意味着帧缓存的目标立即重置为0(也就是窗口系统的帧缓存),同时释放帧缓存对象本身。
如果n为负数,那么glDeleteFramebuffers()将产生一个GL_INVALID_VALUE错误。如果传入的名称是未分配的,或者传入0,那么函数不会产生错误,而是直接忽略这些值。

30.GLboolean gllsFramebuffer(GLuint framebuffer)
如果framebuffer是某个glGenFramebuffers()所生成的帧缓存名称,那么返回GL_TRUE.如果framebuffer为0(窗口系统默认的帧缓存),或者值是未分配的,或者已经被glDeleteFramebuffers()删除,那么将返回GL_FALSE.

31.void glFramebufferParameteri(GLenum target,GLenum pname,GLint param)
设置帧缓存对象的参数,前提是帧缓存对象还没有进行关联,否则这些参数的值将通过帧缓存附件来设置。
target必须是DRAW_FRAMEBUFFER,READ_FRAMEBUFFER或者FRAMBUFFER.
FRAMEBUFFER与DRAW_FRAMEBUFFER是等价的。pname设置的是target对应的帧缓存对象的参数,它必须是以下枚举量之一:GL_FRAMEBUFFER_DEFAULT_WIDTH、GL_FRAMEBUFFER_DEFAULT_HEIGHT、GL_FRAMEBUFFER_DEFAULT_LAYERS、
GL_FRAMEBUFFER_DEFAULT_SAMPLES或GL_FRAMBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS.

32.void glGenRenderbuffers(GLsizei n,GLuint* ids)
分配n个未使用的渲染缓存对象名称,并且将他们保存到ids中。对象必须关联到glBindRenderbuffer()之后才能使用。

33.void glDeleteRenderbuffers(GLsizei n,const GLuint* ids)
释放n个渲染缓存对象,它们的名称由ids提供。如果某个渲染缓存当前已经被绑定,然后我们又调用了glDeleteRenderbuffers()的话,那么当前的帧缓存附件点会被重新绑定到0,然后将这处渲染缓存释放。
glDeleteRenderbuffers()不会产生任何错误。如果名称是不可用的或者是0,那么它们将被直接忽略。

34.void gllsRenderbuffer(GLuint renderbuffer)
如果renderbuffer是glGenRenderbuffers()所产生的一个渲染缓存的话,那么则返回GL_TRUE.如果当前帧缓存为0(窗口系统的默认帧缓存),或者给定的值是未分配的,或者已经被glDeleteRenderbuffers()所删除,那么返回GL_FALSE.

35.void glBindRenderbuffer(GLenum target,GLuint renderbuffer)
创建并绑定一个名称为renderbuffer的渲染缓存,target必须是GL_RENDERBUFFER.而renderbuffer可以是0,即移除当前的绑定,也可以是glGenRenderbuffers()所生成的一个名称;否则系统将产生一个GL_INVALID_OPERATION错误。

36.void glRenderbufferStorage(GLenum target,GLenum internalformat,GLsizei width,GLsizei height)
void glRenderbufferStorageMultisample(GLenum target,GLsizei samples,GLenum internalformat,GLsizei width,GLsizei height);
为当前绑定的渲染缓存分配图像数据的空间。target必须是GL_RENDERBUFFER。对于一个可以绘制颜色信息的缓存来说,internalformat必须是下面枚举量中的一个:GL_RED,GL_R8,GL_R16,GL_RG,GL_RG8,GL_RG16,GL_RGB,GL_R3_G3_B2,GL_RGB4,GL_RGB5,GL_RGB8,GL_RGB10,GL_RGB12,GL_RGB16,GL_RGBA,GL_RGBA2,GL_RGBA4,GL_RGB5_A1,GL_RGBA8,GL_RGB10_A2,GL_RGBA12,GL_RGBA16,GL_SRGB,GL_SRGB8,GL_SRGB_ALPHA,GL_SRGB8_ALPHA8,GL_R16F,GL_R32F,GL_RG16F,GL_RG32F,GL_RGB16F,GL_RGB32F,GL_RGBA16F,GL_RGBA32F,GL_R11F_G11F,B10F,GL_RGB9_E5,GL_R8I,GL_R8UI,GL_R16I,GL_R16UI,GL_R32I,GL_R32UI,GL_RG8I,GL_RG8UI,GL_RG16I,GL_RG16UI,GL_RG32I,GL_RG32UI,GL_RGB8I,GL_RGB8UI,GL_RGB16I,GL_RGB16UI,GL_RGB32I,GL_RGB32UI,GL_RGBA8I,GL_RGBA8UI,GL_RGBA16I,GL_RGBA16UI,GL_RGBA32I,GL_R8_SNORM,GL_R16_SNORM,GL_RG8_SNORM,GL_RG16_SNORM,GL_RGB8_SNORM,GL_RGB16_SNORM,GL_RGBA8_SNORM,GL_RGBA16_SNORM
如果渲染缓存是作为深度缓存使用的,那么它必须可以写入深度信息,也就是设置internalformat为GL_DEPTH_COMPONENT,GL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT32或者GL_DEPTH_COMPONENT32F.
如果渲染缓存要作为模板缓存使用,那么internalformat必须设置为GL_STENCIL_INDEX,GL_STENCIL_INDEX1,GL_STENCIL_INDEX4,GL_STENCIL_INDEX8或者GL_STENCIL_INDEX16.
对于压缩的深度模板格式,internalformat必须设置为GL_DEPTH_STENCIL,这样就允许渲染缓存绑定到深度缓存或者模板缓存,甚至是合并的深度模板附件点了。
width和height用来设置渲染缓存的像素大小,而samples可以设置逐像素多重采样的样本个数。对于glRenderbufferStorageMultisample()来说,如果samples设置为0的话,那么与glRenderbufferStorage()就已经是等价的了。
如果width和height超出了GL_MAX_RENDERBUFFER_SIZE所定义的数值范围,或者samples超出GL_MAX_SAMPLES所定义的范围,那么将产生一个GL_INVALID_VALUE错误。如果internalformat是有符号或者无符号的整数类型(例如名称中带有I或者UI字样的格式枚举量),并且samples非零,以及硬件实现无法支持多重采样的整数缓存的话,那么系统将产生一个GL_INVALID_OPERATION错误。最后,如果渲染缓存的大小和格式合起来超出了可分配的内存范围的话,那么系统将产生一个GL_OUT_OF_MEMORY错误。

37.void glFramebufferRenderbuffer(GLenum target,GLenum attachment,GLenum renderbuffertarget,GLuint renderbuffer)
将渲染缓存renderbuffer关联到当前绑定的帧缓存对象的附件attachment上。target必须是GL_READ_FRAMEBUFFER、GL_DRAW_FRAMEBUFFER或者GL_FRAMEBUFFER(等价于GL_DRAW_FRAMEBUFFER)
attachment必须是GL_COLOR_ATTACHMENTi、GL_DEPTH_ATTACHMENT、GL_STENCIL_ATTACHMENT或者GL_DEPTH_STENCIL_ATTACHMENT
renderbuffertarget必须设置为GL_RENDERBUFFER,而renderbuffer必须是0(表示将附件所关联的渲染缓存移除)或者是glGenRenderbuffers()生成的渲染缓存名称,否则将会产生一个GL_INVALID_OPERATION错误。

38.GLenum glCheckFramebufferStatus(GLenum target)
返回帧缓存完整性状态检查的结果,返回值如下所示。target必须是GL_READ_FRAMEBUFFER,GL_DRAW_FRAMERBUFFER或者GL_FRAMEBUFFER(等价于GL_DRAW_FRAMEBUFFER).如果glCheckFramebufferStatus()产生了一个错误,那么返回值将为0.
错误信息:
GL_FRAMEBUFFER_COMPLETE:帧缓存和它的附件完全符合渲染或者数据读取的需求。
GL_FRAMEBUFFER_UNDEFINED:绑定的帧缓存可能是默认的帧缓存(例如:glBindFramebuffer()中设置帧缓存的参数为0),而默认的帧缓存是不存在的。
GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:绑定的帧缓存没有设置必须的附件信息。
GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:帧缓存没有关联任何图像(例如纹理层或者渲染缓存)。
GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:每个绘制缓存(例如glDrawBuffers()所指定的GL_DRAW_BUFFERi)都必须有一个附件。
GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:每个用glReadBuffer()设置的缓存都必须有一个附件。
GL_FRAMEBUFFER_UNSUPPORTED:关联到帧缓存对象的图像数据与OpenGL设置实现的需求不兼容。
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:帧缓存各个附件所关联的所有图像的采样值数量互相不匹配。

39.void glClearBuffer{fi ui}v(GLenum buffer,GLint drawbuffer,const TYPE* value)
void glClearBufferfi(GLenum buffer,GLint drawbuffer,GLfloat depth,GLint stencil)
清除drawbuffer所对应的缓存中的数据,清除值为value.buffer必须是GL_COLOR,GL_DEPTH或者GL_STENCIL.
如果buffer为GL_COLOR,那么drawbuffer设置的是绘制缓存的索引值,而value是一个4分量的数组,其中包含清除后的颜色值。如果drawbuffer所对应的缓存有多个绘制缓存(可以通过glDrawBuffers()方法来指定),那么所有的绘制缓存都会被清除到value对应的数值。
如果buffer为GL_DEPTH或者GL_STENCIL,那么drawbuffer必须为0,而value是一个单一元素的数组,其中包含清除后的初始值(深度值需要遵循截断和类型的转换,而模板值需要经过掩码和类型转换)。我们只需要调用glClearBufferfv()就可以清除深度缓存,而glClearBufferiv()可以用来清除模板缓存。
glClearBufferfi()可以用来同时清除深度和模板缓存。此时参数buffer的设置必须是GL_DEPTH_STENCIL.
如果缓存不是上面列举的值,那么glClearbuffer{if ui}v函数回产生一个GL_INVALID_ENUM错误。如果buffer的设置不是GL_DEPTH_STENDIL,那么使用glClearBufferfi()也会产生一个GL_INVALID_ENUM错误。
如果buffer设置为GL_COLOR,而drawbuffer设置为小于0或者大于等于GL_MAX_DRAW_BUFFERS;或者buffer参数为GL_DEPTH,GL_STENCIL或者GL_DEPTH_STENCIL,而drawbuffer参数设置不是0,那么都会产生一个GL_INVALID_VALUE错误。

40.void glInvalidateFramebuffer(GLenum target,GLsizei numAttachments,const GLenum* attachments)
void glInvalidateSubFramebuffer(GLenum target,GLsizei numAttachmens,const GLenum* attachments,GLint x,GLitn y,GLsizei width,GLsizei height);
设置绑定的帧缓存对象的一部分或者整体将不再保留。对于这两个函数而言,target参数必须是GL_DRAW_FRAMEBUFFER、GL_READ_FRAMEBUFFER或者GL_FRAMEBUFFER(同时指向绘制和读取目标)。attachments中保存了一系列附件的标识符,包括GL_COLOR_ATTACHMENTi、GL_DEPTH_ATTACHMENT,以及GL_STENCIL_ATTACHMENT;而numAttachments设置这个附件列表中元素的个数。
对于glInvalidateSubFramebuffer()来说,可以通过左下角的坐标(x,y)以及宽度width和高度height(从(x,y)出发)来设置它的作用区域,而这个区域对于所有attachments中的附件而言,都将不再使用。
这两个函数可能会触发以下错误:如果标识符不是来自上面的列表,那么返回GL_INVALID_ENUM;如果某个附件的索引(例如GL_COLOR_ATTACHMENTi的i值)大于等于颜色附件的最大索引值,那么返回GL_INVALID_OPERATION;如果numAttachments、width、或者height为负数,那么返回GL_INVALID_VALUE.

41.void glBindFragDataLocation(GLuint program,GLuint colorNumber,const GLchar*name)
void glBindFragDataLocationIndexed(GLuint program,GLuint colorNumber,GLuint index,const GLchar* name)
使用colorNumber的值来对应片元着色器的变量name,从而与着色器程序program的输出位置进行关联。对于颜色索引的情形,index可以用来同时设置输出索引和位置。
如果program不是一个着色器程序,或者index大于1,或colorNumber大于等于最大的颜色附件索引值,那么都将生成GL_INVALID_VALUE错误。

42.GLint glGetFragDataLocation(GLuint program,const GLchar* name);
GLint glGetFragDataIndex(GLuint program,const GLchar* name)
如果它已经与链接后的着色器程序相关联,那么将返回片元着色器name的位置或者索引。如果name不是一个可用的程序变量,或者program已经链接但是没有设置片元着色器,或者program没有完成链接,那么返回值均为-1.对于program链接失败的情形,同时还会产生一个GL_INVALID_OPERATION错误。

43.void glDrawBuffer(GLenum mode)
void glDrawBuffers(GLsizei n,const GLenum* buffers);
设置可以进行写入或者清除操作的颜色缓存,同时将禁止之前一次glDrawBuffer()或者glDrawBuffers()所设置的缓存。我们可以一次性启用多个缓存。mode的值必须是下面几种枚举量中的一种:GL_FRONT,GL_FRONT_LEFT,GL_NONE,GL_BACK,GL_FRONT_RIGHT,GL_FRONT_AND_BACK,GL_LEFT,GL_BACK_LEFT,GL_COLOR_ATTACHMENTi、GL_RIGHT、GL_BACK_RIGHT.
如果mode或者buffers中的对象不属于上述任何一种,那么将产生一个GL_INVALID_ENUM错误。此外,如果当前绑定了一个帧缓存对象,并且它不是默认帧缓存,那么我们只能使用GL_NONE或者GL_COLOR_ATTACHMENTi模式,否则也将产生GL_INVALID_ENUM错误。
名称中忽略LEFT和RIGHT的枚举量,可以同时用于立体缓存中的左缓存和右缓存,以此类推,名称中不包含FRONT或者BACK的枚举量也可以同时用于前缓存和后缓存。默认条件下,mode设置为GL_BACK,以用于双重缓冲的情形。
glDrawBuffers()函数可以设置多个颜色缓存来接收多组颜色值。buffers是一个缓存枚举量的数组,它只能接受GL_NONE、GL_FRONT_LEFT、GL_FRONT_RIGHT、GL_BACK_LEFT和GL_BACK_RIGHT这几种类型。

44.void glReadBuffer(GLenum mode)
设置可以用作像素读取的缓存,像素读取的相关函数包括glReadPixels()、glCopyTexImage*()和glCopyTexSubImage*()等。这个函数会禁止上一次使用glReadBuffer()所设置的缓存。mode的值必须是下面的几种枚举量中的一种:
GL_FRONT、GL_FRONT_LEFT、GL_NONE、GL_BACK、GL_FRONT_RIGHT、GL_FRONT_AND_BACK、GL_LEFT、GL_BACK_LEFT、GL_COLOR_ATTACHMENTi、GL_RIGHT、GL_BACK_RIGHT。如果mode的值不属于上述任何一种,那么将产生一个GL_INVALID_ENUM错误。

45.void glEnablei(GLenum capability,GLuint index)
void glDisablei(GLenum capability,GLuint index)
开启或者关闭缓存index的某项功能。
如果index大于等于GL_MAX_DRAW_BUFFERS,那么将产生一个GL_INVALID_VALUE错误。

46.GLboolean glIsEnabledi(GLenum capability,GLuint index)
判断缓存index是否已经开启某项功能。
如果index超出了许可的范围,那么将产生一个GL_INVALID_VALUE错误。

47.void glReadPixels(GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type,void* pixels);
从可读的帧缓存中读取像素数据,读取的矩形区域范围的左下角定义为窗口坐标的(x,y),尺寸为width和height,然后将数据数组保存到pixels中。format用于指定要读取的像素数据元素的类型(颜色、深度、或者模板值)而type用于指定每个元素的数据类型。
glReadPixels()的错误使用也会产生一些OpenGL的错误信息。如果format设置为GL_DEPTH但是不存在深度缓存,或者format为GL_STENCIL但是不存在模板缓存,或者format为GL_DEPTH_STENCIL,但是帧缓存当中没有同时关联深度和模板缓存,那么都会产生GL_INVALID_OPERATION错误。如果format为GL_DEPTH_STENCIL,但是type不是GL_UNSIGNED_INT_24_8也不是GL_FLOAT_32_UNSIGNED_INT_24_8_REV,则会产生GL_INVALID_ENUM错误。
format取值:
枚举量 像素格式
GL_RED或者GL_RED_INTEGER 单一的红颜色分量
GL_GREEN或者GL_GREEN_INTEGER 单一的绿色颜色分量
GL_BLUE或者GL_BLUE_INTEGER 单一的蓝色颜色分量
GL_ALPHA或者GL_ALPHA_INTEGER 单一的alpha分量
GL_RG或者GL_RG_INTEGER 依次为红色分量、绿色分量
GL_RGB或者GL_RGB_INTEGER 依次为红色分量、绿色分量、蓝色分量
GL_RGBA或者GL_RGBA_INTEGER 依次为红色分量、绿色分量、蓝色分量、alpha分量
GL_BGR或者GL_BGR_INTEGER 依次为蓝色分量、绿色分量、红色分量
GL_BGRA或者GL_BGRA_INTEGER 依次为蓝色分量、绿色分量、红色分量、alpha分量
GL_STENCIL_INDEX 单一的模板索引值
GL_DEPTH_COMPONENT 单一的深度分量
GL_DEPTH_STENCIL 深度和模板值的合并结果。
type的取值:
枚举量 数据类型 是否压缩格式
GL_UNSIGNED_BYTE GLubyte 否
GL_BYTE GLbyte 否
GL_UNSIGNED_SHORT GLushort 否
GL_SHORT GLshort 否
GL_UNSIGNED_INT GLuint 否
GL_INT GLint 否
GL_HALF_FLOAT GLhalf
GL_FLOAT GLfloat 否
GL_UNSIGNED_BYTE_3_3_2 GLubyte 是
GL_UNSIGNED_BYTE_2_3_3_REV GLubyte 是
GL_UNSIGNED_SHORT_5_6_5 GLushort 是
GL_UNSIGNED_SHORT_4_4_4_4 GLushort 是
GL_UNSIGNED_SHORT_4_4_4_4_REV GLushort 是
GL_UNSIGNED_SHORT_5_5_5_1 GLushort 是
GL_UNSIGNED_SHORT_1_5_5_5_REV GLushort 是
GL_UNSIGNED_INT_8_8_8_8 GLuint 是
GL_UNSIGNED_INT_8_8_8_8_REV GLuint 是
GL_UNSIGNED_INT_10_10_10_2 GLuint 是
GL_UNSIGNED_INT_2_10_10_10_REV GLuint 是
GL_UNSIGNED_INT_24_8 GLuint 是
GL_UNSIGNED_INT_10F_11F_11F_REV GLuint 是
GL_UNSIGNED_INT_5_9_9_9_REV GLuint 是
GL_FLOAT_32_UNSIGNED_INT_24_8_REV GLfloat 是

48.void glClampColor(GLenum target,GLenum clamp)
控制浮点数和定点数缓存的颜色值截断方式,如果target设置为GL_CLAMP_READ_COLOR则开启截断如果clamp设置为GL_TRUE,那么从缓存读回的颜色值将被截断到[0,1]范围;反之如果clamp为GL_FALSE,那么不会进行截断。如果用户程序使用的是定点数与浮点数混合的缓存类型,那么设置clamp为GL_FIXED_ONLY的时候,只截断定点数数据;而浮点数数据仍然保留原始形式返回。

49.void glBitFramebuffer(GLint srcX0,GLint srcY0,GLint srcX1,GLint srcY1,GLint dstX0,GLint dstY0,GLint dstX1,GLint dstY1,GLbitfield buffers,GLenum filter)
将矩形的像素数据从可读帧缓存的一处区域拷贝到可绘制帧缓存的另一处区域中,在这一个过程中可能会存在自动缩放、反转、转换和滤波的操作。srcX0、srcY0,srcX1,和srcY1表示像素数据源的区域范围,目标区域的矩形通过dstX0、dstY0、dstX1和dstY1来设置.buffers中可以通过按位”或”的方式设置GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT以及GL_STENCIL_BUFFER_BIT,以设置拷贝所在的缓存类型.最后,如果两处矩形区域的大小不同的话,那么filter用设置插值的方法,可用的值包括GL_NEAREST和GL_LINEAR;如果区域的大小是一致的,那么不会产生滤波的操作.
如果当前存在多个颜色绘制缓存,那么每个缓存都会进行一次源数据的拷贝.
如果srcX1 < srcX0或者dstX1 < dstX0,那么图像将在水平方向进行反转。类似地,如果srcY1 < srcY0或者dstY1 < dstY0,那么图像将在竖直方向进行反转.但是如果源和目标的尺寸值在相同方向均设置为负数,那么不会产生任何的翻转操作.
如果源数据缓存和目标数据缓存的格式不同,那么多数情况下像素数据的转换操作会自动进行.但是如果可读颜色缓存是浮点数类型,而任何一个写入的颜色不是(反之亦然),或者可读颜色缓存是有符号(无符号)的整数类型,但是某个写入的缓存不是的话,那么都会产生GL_INVALID_OPERATION的错误,并且不会拷贝任何像素数据。
多重采样的缓存对于像素数据的拷贝也有一定影响。如果源缓存是多重采样的,而目标缓存不是的话,那么所有的样本值都会被归总到单一的像素值并存入目标缓存。反之,如果目标缓存是多重采样的,但是源缓存不是的话,那么源数据将被多次拷贝,以匹配所有的样本值。最后,如果两个缓存都是多重采样的形式,并且采样数是相同的,那么所有的样本不需要修改就可以直接拷贝.但是,如果两个缓存的采样数不同,那么无法拷贝像素,并且会产生一个GL_INVALID_OPERATION错误。
如果buffers中含有多余的类型值,或者filter不是GL_LINEAR或者GL_NEAREST,那么将会产生GL_INVALID_VALUE错误。

0 0
原创粉丝点击