OpenGL帧缓冲:渲染缓冲区对象 Renderbuffer Objects

OpenGL帧缓冲:渲染缓冲区对象 Renderbuffer Objects

渲染缓冲对象是OpenGL中用于存储单个渲染图像的数据存储对象。

API

void glBindRenderbuffer( enum target, uint renderbuffer );
void glCreateRenderbuffers( sizei n, uint *renderbuffers );
void glGenRenderbuffers( sizei n, uint *renderbuffers );
void glDeleteRenderbuffers( sizei n, const uint *renderbuffers );
boolean glIsRenderbuffer( uint renderbuffer );

void glRenderbufferStorageMultisample( enum target, sizei samples, enum internalformat, sizei width, sizei height );
void glNamedRenderbufferStorageMultisample( uint renderbuffer, sizei samples, enum internalformat, sizei width, sizei height );
void glRenderbufferStorage( enum target, enum internalformat, sizei width, sizei height );
void glNamedRenderbufferStorage( uint renderbuffer, enum internalformat, sizei width, sizei height );

void glGetRenderbufferParameteriv( enum target, enum pname, int *params );
void glGetNamedRenderbufferParameteriv( uint renderbuffer, enum pname, int *params );

将一个渲染缓冲对象绑定到特定的目标上

void glBindRenderbuffer( enum target, uint renderbuffer );
  • target:指定要绑定的渲染缓冲目标,必须是 GL_RENDERBUFFER。
  • renderbuffer:指定要绑定的渲染缓冲对象的名称。

当前的 RENDERBUFFER 绑定可以通过调用 GetIntegerv 函数并设置 pnameRENDERBUFFER_BINDING 来确定。

创建新的渲染缓冲对象

void glCreateRenderbuffers( sizei n, uint *renderbuffers );

通过 CreateRenderbuffers 创建的每个渲染缓冲对象的状态类似于将从 GenRenderbuffers 返回的名称绑定到 RENDERBUFFER 目标时获得的状态。但是,对 RENDERBUFFER 的现有绑定不受影响。

生成渲染缓冲对象名称

void glGenRenderbuffers( sizei n, uint *renderbuffers );

调用此函数时,并不会创建具有实际内存和状态的渲染缓冲,它仅仅为每个请求的对象分配一个未使用的名称。

删除渲染缓冲对象

void glDeleteRenderbuffers( sizei n, const uint *renderbuffers );

当一个渲染缓冲对象被删除后,它将不再包含任何内容,并且其名称会被释放,再次变为未使用状态。如果当前绑定到RENDERBUFFER目标的渲染缓冲对象被删除,那么效果等同于执行了BindRenderbuffer函数,将目标设为RENDERBUFFER且名称设为0(即解除绑定)。

判断给定的renderbuffer是否为一个有效的渲染缓冲对象名称

boolean glIsRenderbuffer( uint renderbuffer );

如果 renderbuffer 参数是一个现有渲染缓冲对象的名称,则 IsRenderbuffer 返回 TRUE。
如果 renderbuffer 是零,或者它是一个非零值,但不对应于渲染缓冲对象的名称,则 IsRenderbuffer 返回 FALSE。

为渲染缓冲对象分配存储空间并指定多重采样参数

void glRenderbufferStorageMultisample( enum target, sizei samples, enum internalformat, sizei width, sizei height );

void glNamedRenderbufferStorageMultisample( uint renderbuffer, sizei samples, enum internalformat, sizei width, sizei height );

  • 参数:

    • target:指定目标,必须为 GL_RENDERBUFFER,表示渲染缓冲对象。
    • samples:指定多重采样的期望采样数量。如果 samples 为零,则 RENDERBUFFER_SAMPLES 为零。否则,为渲染缓冲图像分配的实际采样数取决于实现,但保证大于或等于 samples
    • internalformat:指定渲染缓冲对象的内部格式,必须为可进行颜色渲染、深度渲染或模板渲染的格式,如:GL_RGBA8, GL_DEPTH_COMPONENT24, 或 GL_STENCIL_INDEX8。
    • widthheight:指定渲染缓冲对象的像素尺寸。
  • 当调用该函数时,它会创建一个新的、具有指定大小和采样率的渲染缓冲区,并且根据internalformat参数设置其内部数据格式。原有的数据会被删除,新分配的缓冲区内容初始状态未定义。

  • 函数成功执行后,它们会删除当前渲染缓冲图像的所有现有数据存储,其内容变为未定义。同时,以下状态会被设置:

    • RENDERBUFFER_WIDTH 被设为 width
    • RENDERBUFFER_HEIGHT 被设为 height
    • RENDERBUFFER_INTERNAL_FORMAT 被设为 internalformat

为渲染缓冲对象分配存储空间并关闭多重采样

void glRenderbufferStorage( enum target, enum internalformat, sizei width, sizei height );
void glNamedRenderbufferStorage( uint renderbuffer, enum internalformat, sizei width, sizei height );

// 等价于
glRenderbufferStorageMultisample(target,0,internalformat,width,height);
glNamedRenderbufferStorageMultisample(renderbuffer,0,internalformat,width,height);

查询渲染缓冲对象的参数

void glGetRenderbufferParameteriv( enum target, enum pname, int *params );

void glGetNamedRenderbufferParameteriv( uint renderbuffer, enum pname, int *params );

对于GetRenderbufferParameteriv函数,其查询的目标是绑定到target上的渲染缓冲对象,这里target必须设置为RENDERBUFFER。而对于GetNamedRenderbufferParameteriv函数,renderbuffer参数直接指定了渲染缓冲对象的名字。

指定渲染缓冲对象中与pname对应的参数值将被返回到params指向的整型数组中。

  • 如果 pnameRENDERBUFFER_WIDTHRENDERBUFFER_HEIGHTRENDERBUFFER_INTERNAL_FORMATRENDERBUFFER_SAMPLES,则params将分别包含渲染缓冲对象图像的像素宽度、像素高度、内部格式或采样数。

  • 如果 pnameRENDERBUFFER_RED_SIZERENDERBUFFER_GREEN_SIZERENDERBUFFER_BLUE_SIZERENDERBUFFER_ALPHA_SIZERENDERBUFFER_DEPTH_SIZERENDERBUFFER_STENCIL_SIZE,则params将分别包含渲染缓冲对象图像红、绿、蓝、alpha、深度或模板组件的实际分辨率(即当前实际分配的分辨率,而非定义图像时指定的分辨率)。

你可能感兴趣的:(OpenGL,图形渲染)