Adreno OpenGL ES 3.1 介绍(5)

4.2.2多样本纹理–演示

在这里插入图片描述该演示展示了一个旋转的线框立方体,该立方体首先被渲染为多样本纹理,然后被渗入后台缓冲区。 创建了许多不同的多样本纹理,每个纹理每个纹理像素拥有不同数量的样本。 用户可以在这些纹理之间切换,以查看视觉质量方面的差异。

与前面的示例一样,此演示中使用的着色器很简单:

  • 顶点着色器将模型-视图-投影矩阵作为输入,并使用它来计算输入顶点位置的裁剪空间坐标
  • 片段着色器将唯一的输出变量设置为完全不透明的红色

由于此演示使用的是真实网格,因此许多代码专用于顶点缓冲区对象设置过程。 但是,它仅关注与多样本纹理相关的方面:

  • 如何设置多样本纹理?
  • 如何将几何渲染为多样本纹理?
  • 如何将多样本纹理数据复制到后台缓冲区?
4.2.2.1设置多样本纹理

该演示与上一个演示采用相同的方法进行资源初始化。 在负责渲染单个帧的函数中生成并分配了多样本纹理。 仅在首次调用该函数时才会发生这种情况。

以下代码块负责设置纹理:

for (n_texture = 0;
n_multisample_textures
{
n_texture <
++n_texture)
uint32_t n_texture_samples =
n_max_color_texture_samples *
n_texture
/
(n_multisample_textures - 1);
if (n_texture_samples == 0)
{
/*
Requesting zero samples is not permitted */
n_texture_samples = 1;
}
_textures[n_texture].n_samples = n_texture_samples;
glGenTextures(1,
&_textures[n_texture].texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,
_textures[n_texture].texture);
glTexStorage2DMultisample(
GL_TEXTURE_2D_MULTISAMPLE,
n_texture_samples,
GL_RGBA8,
rendertarget_width,
rendertarget_height,
GL_FALSE); /*
fixedsamplelocations */
}

该演示使用了多个多样本纹理,每个纹理包含不同数量的样本。 使用的多样本纹理总数由n_multisample_textures定义。

对于每个多样本纹理,首先要计算出它将使用的样本数量n_texture_samples。 这样做的方式是,第一个多样本纹理将使用单个样本,而最后一个将使用实现允许的最大数量(GL_MAX_COLOR_TEXTURE_SAMPLES),并且在两者之间有合理的规则进行。

然后使用以下步骤设置每个多样本纹理:

  1. 使用glGenTextures生成一个新的纹理对象ID
  2. 使用glBindTexture将此ID绑定到GL_TEXTURE_2D_MULTISAMPLE纹理目标
  3. 使用glTexStorage2DMultisample为多样本纹理分配存储
4.2.2.2使用多样本纹理作为渲染目标

该演示将线框立方体渲染为多样本纹理,作为在初始化时创建的帧缓冲区对象的颜色附件。 使用前面介绍的多样本纹理池,每五秒钟切换一次渲染到的多样本纹理。

使用API函数glFramebufferTexture2D附加新的多样本纹理,如下所示:

glFramebufferTexture2D(
GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D_MULTISAMPLE,
_textures[n_texture_to_use].texture,
0); /* level */

由于多样本纹理不支持Mipmap,因此请始终使用基本级别的Mipmap。

4.2.2.3将多样本纹理数据传输到后台缓冲区

要将多样本纹理的内容传输到默认帧缓冲区的后缓冲区,请执行帧缓冲区blit操作。此操作在OpenGL ES 3.0中引入,并从读取的帧缓冲区的附件快速复制到相应的 并条机缓冲器的附件。 这些副本绕过片段流水线,除了它们仍然需要通过像素所有权测试,剪刀测试和sRGB转换进行处理。

blits允许的事情之一是将多样本附件(例如渲染缓冲区或多样本纹理)的内容展平为单样本表示形式。 该演示利用此功能将线框多维数据集的多样本表示形式合并为单样本版本,直接交付给后台缓冲区。 以下代码段执行了此任务:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER,
0);
glBlitFramebuffer(0, /* srcX0 */
0, /* srcY0 */
rendertarget_width,
rendertarget_height,
0, /* dstX0 */
0, /*
dstY0 */
rendertarget_width,
rendertarget_height,
GL_COLOR_BUFFER_BIT,
GL_NEAREST); /* filter */

注意:
如果想知道将纹理四边形直接渲染到后缓冲区是否更简单,请在片段着色器中对多采样纹理进行采样,然后将采样值存储在输出变量中。 问题在于,OpenGL ES着色器语言中只有一个纹理采样功能允许对多样本纹理进行采样,并且该功能一次只能从一个样本中采样,该采样是由该函数的输入参数之一指定的。 当然,着色器可以一个接一个地采样所有可用采样,然后计算加权平均值。 但是,这将比演示中使用的blit操作要慢得多。

提示:
glBlitFramebuffer也可以用于执行拉伸blit。 有关更多详细信息,请参见位于OpenGL ES 3.1参考页的函数,网址为http://www.khronos.org/opengles/sdk/docs/man3/html/glBlitFramebuffer.xhtml

此时,线框立方体的单采样表示已将其放入后台缓冲区。 剩下要做的就是交换后缓冲区和前缓冲区,然后多维数据集将变为可见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值