简体   繁体   English

OpenGL GLSL 统一缓冲区对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM