【发布时间】:2016-05-24 12:18:05
【问题描述】:
我正在更改我的基本渲染器,使其成为批处理渲染器以提高性能。 我已经成功地更改了我的顶点数据以在一个批次中绘制我的所有网格,但是当我想要处理多种材质时出现了问题。
显然我不能使用普通的uniforms,因为我要批处理很多网格,所以我考虑使用统一缓冲区对象来存储所有材质数据。
问题是,如何更新这个缓冲区?
如果我这样设置我的 UBO:
layout(std140) uniform MATERIAL
{
vec4 Color[20];
float Specular[20];
float Roughness[20];
float Metallic[20];
float ReflectionIntensity[20];
};
我不这么认为,那么我在提交单一材料的数据时,可以使用根据材料索引计算的起始偏移量,然后像这样提交数据:
struct Material {
float color[4];
float specular;
float roughness;
float metallic;
float reflectionIntensity;
};
int bufferStride = 32; // 16 (vec4) + 4 (float) + 4 (float) + 4 (float) + 4 (float)
int offset = bufferStride * updatingMaterialIndex;
Material m;
m.color...
glBufferSubData(GL_UNIFORM_BUFFER, offset, &m, sizeof(Material));
因为我假设 OpenGL 将在内存中有 20 个vec4,然后是 80 个float。
那么我该怎么做呢?我必须单独计算每个元素的偏移量吗?
另外,我应该如何索引网格使用的材料?我应该将材质索引作为顶点属性传递吗?
【问题讨论】: