当前位置: 首页 > article >正文

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、深度或模板组件的实际分辨率(即当前实际分配的分辨率,而非定义图像时指定的分辨率)。


http://www.kler.cn/a/230973.html

相关文章:

  • const使用,指针常量与常量指针
  • Maven的安装以及配置(超级详细版)
  • Node.js-1
  • 力扣:78. 子集
  • (38)找出数组的最大公约数
  • 校准大麦服务器时间,实现本地时间和服务器时间同步,无缝衔接抢购
  • mac如何实现升级node版本、切换node版本
  • Vue代理模式和Nginx反向代理(Vue代理部署不生效)
  • Matlab图像处理——基于小波变换的数字图像水印嵌入和提取算法(GUI界面)
  • 代码随想录训练营第三十期|第二十九天|回溯算法part05|491.递增子序列* 46.全排列* 47.全排列 II
  • php 函数三
  • 【算法】【数据结构】算法与数据结构的关系
  • 【数据结构】二叉树的顺序结构及实现(堆)
  • PHP入门指南:进阶篇
  • 定制红酒:如何通过定制红酒提升企业形象
  • 封装图片预览组件
  • 10. Springboot集成Dubbo3(一)简单介绍
  • 学习Android的第五天
  • [C语言]C语言实战项目------单链表通讯录
  • iOS面试题