# 缓冲区块

小游戏框架提供了网格Mesh来存储渲染中几乎不变的顶点数据,但还有一些数据是可能需要每帧变化的,并且这些数据都有显著的特征:

  1. 数据量级不大
  2. 灵活性高,需要能够实时低开销更改

为了实现这些需求,小游戏框架借鉴了现代图形接口的设计,提供了缓冲区块UniformBlock

# UniformDescriptor

和顶点数据需要VertexLayout来描述结构一样,UniformBlock也需要一个描述其解构的东西,其为缓冲区块描述符UniformDescriptor

const myUD = new engine.UniformDescriptor({
  uniforms: [
    {name: 'u_color', type: engine.EUniformType.FLOAT4},
    {name: 'u_texture', type: engine.EUniformType.SAMPLER},
  ]}
);

这里我们创建了一个描述符,表示拥有这个描述符的 UniformBlock 有u_coloru_texture两个值,他们的类型分别是向量float4和纹理(纹理将会在后面的章节说到)。

# 创建和使用

有了UniformDescriptor,便可以直接创建UniformBlock:

const uniforms = new engine.UniformBlock(myUD);

但在小游戏框架中一般不会让开发者去手动这么创建它,而是配合其他资源或组件一起使用。

# Runtime中

在小游戏框架的设计中,UniformBlock被区分为三个维度:全局、物体、材质。

这个其实很好理解,对于一个物体的渲染,其需要知道一些像是灯光、雾、观测位置之类的全局信息,还需要知道自己的位置、光照贴图之类的数据,也需要知道颜色、贴图等材质信息。

内置的全局 Uniform 是不对开发者开放修改的,但开发者可以定制属于自己的全局Uniform,详见渲染系统

物体 Uniform 的定制将会在渲染器一章中讲到。

材质 Uniform 的定制将会在效果和材质中讲到。

# Shader中

在 Runtime 中设置好了材质之后,还需要在 Shader 中使用才能完成最后的绘制,并且开发者也要保证在 Runtime 和Shader中两者定义的一致性。

这部分内容详见着色器