[英]OpenGL GLSL uniform buffer objects
I have a UBO, this is the code in the fragment shader.我有一个 UBO,这是片段着色器中的代码。
layout (std140,binding = 5) uniform uAmbientLights
{
vec4 position[10];
vec4 color[10];
vec4 intensity[10];
vec4 radius[3];
};
my C++ code is like this.我的 C++ 代码是这样的。 What my code does is create a buffer, vector containers that can hold up to 10 light data.
我的代码所做的是创建一个缓冲区、向量容器,最多可以容纳 10 个光数据。 I will set the position x/y, color & intensity x/y/z and a radius value.
我将设置 position x/y、颜色和强度 x/y/z 以及半径值。 I used vec4 as I read that I needed to do padding.
当我读到我需要做填充时,我使用了 vec4。
glCreateBuffers(1, &UBO);
std::vector<float> pos(40);
std::vector<float> clr(40);
std::vector<float> intensity(40);
std::vector<float> radius(12);
glNamedBufferData(UBO, sizeof(float) * (pos.size() + clr.size() + intensity.size() + radius.size()), NULL, GL_DYNAMIC_DRAW);
size_t posCount{}, clrCount{}, intensityCount{}, radiusCount{}, numOfAmbientLights{};
for (eID curr : engine.GetSystem<sIdentifierSystem>().FindTaggedEntities(engine, "AMBIENTLIGHT"))
{
Transform& LTR = engine.GetComponent<Transform>(curr);
Lighting& LL = engine.GetComponent<Lighting>(curr);
pos[posCount++] = LTR.GetPosition().x;
pos[posCount] = LTR.GetPosition().y;
clr[clrCount++] = LL.getColor().x;
clr[clrCount++] = LL.getColor().y;
clr[clrCount] = LL.getColor().z;
intensity[intensityCount++] = LL.getIntensity().x;
intensity[intensityCount++] = LL.getIntensity().y;
intensity[intensityCount] = LL.getIntensity().z;
radius[radiusCount] = LL.getRadius();
posCount += 3;
clrCount += 2;
intensityCount += 2;
++radiusCount;
++numOfAmbientLights;
}
glNamedBufferSubData(UBO, 0, sizeof(float) * pos.size(), &pos);
glNamedBufferSubData(UBO, sizeof(float) * pos.size(), sizeof(float) * clr.size(), &clr);
glNamedBufferSubData(UBO, sizeof(float) * pos.size() + sizeof(float) * clr.size(), sizeof(float) * intensity.size(), &intensity);
glNamedBufferSubData(UBO, sizeof(float) * pos.size() + sizeof(float) * clr.size() + sizeof(float) * intensity.size(), sizeof(float) * radius.size(), &radius);
glBindBufferBase(GL_UNIFORM_BUFFER, 5, UBO);
My values do not pass into the shader at all.我的值根本没有传递到着色器中。 Before using arrays for several lights, my code was working when it only contained 1 light data.
在将 arrays 用于多个灯光之前,我的代码在它只包含 1 个灯光数据时工作。
What am I doing wrong?我究竟做错了什么? I avoided vec3s & float, storing all my values with vec4 with value 0 to pad.
我避免使用 vec3s 和浮点数,将我所有的值存储在 vec4 中,值为 0 进行填充。 I've checked that my vector container values are correct in-order.
我检查了我的矢量容器值是否按顺序正确。
My GL_MAX_UNIFORM_BLOCK_SIZE gives me 65k bytes whereas I only take (40+40+40+12)*4 = 528 bytes我的 GL_MAX_UNIFORM_BLOCK_SIZE 给了我 65k 字节,而我只占用 (40+40+40+12)*4 = 528 字节
My bad.. when updating the buffer, the 4 lines should instead be我的坏..更新缓冲区时,应该改为 4 行
glNamedBufferSubData(UBO, 0, sizeof(float) * pos.size(), pos.data());
glNamedBufferSubData(UBO, sizeof(float) * pos.size(), sizeof(float) * clr.size(), clr.data());
glNamedBufferSubData(UBO, sizeof(float) * pos.size() + sizeof(float) * clr.size(), sizeof(float) * intensity.size(), intensity.data());
glNamedBufferSubData(UBO, sizeof(float) * pos.size() + sizeof(float) * clr.size() + sizeof(float) * intensity.size(), sizeof(float) * radius.size(), radius.data());
I was passing the address to the vector instead of directly passing the vector data我将地址传递给向量,而不是直接传递向量数据
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.