# 缓冲区块
小游戏框架提供了网格Mesh
来存储渲染中几乎不变的顶点数据,但还有一些数据是可能需要每帧变化的,并且这些数据都有显著的特征:
- 数据量级不大
- 灵活性高,需要能够实时低开销更改
为了实现这些需求,小游戏框架借鉴了现代图形接口的设计,提供了缓冲区块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_color
和u_texture
两个值,他们的类型分别是向量float4
和纹理(纹理将会在后面的章节说到)。
# 创建和使用
有了UniformDescriptor,便可以直接创建UniformBlock:
const uniforms = new engine.UniformBlock(myUD);
但在小游戏框架中一般不会让开发者去手动这么创建它,而是配合其他资源或组件一起使用。
# Runtime中
在小游戏框架的设计中,UniformBlock被区分为三个维度:全局、物体、材质。
这个其实很好理解,对于一个物体的渲染,其需要知道一些像是灯光、雾、观测位置之类的全局信息,还需要知道自己的位置、光照贴图之类的数据,也需要知道颜色、贴图等材质信息。
内置的全局Uniform是不对开发者开放修改的,但开发者可以定制属于自己的全局Uniform,详见渲染系统。
物体Uniform的定制将会在渲染器一章中讲到。
材质Uniform的定制将会在效果和材质中讲到。
# Shader中
在Runtime中设置好了材质之后,还需要在Shader中使用才能完成最后的绘制,并且开发者也要保证在Runtime和Shader中两者定义的一致性。
这部分内容详见着色器。