簡體   English   中英

多個GLSL統一緩沖區

[英]Multiple GLSL uniform buffers

我在使用多個統一緩沖區時遇到問題。

這是我的GLSL代碼:

layout(std140) uniform MaterialInfo {
    vec3 Ka;
    vec3 Ks;    
    vec3 Kd;
};


layout(std140) uniform LightInfo {
    vec3 La;
    vec3 Ls;
    vec3 Ld;
};

這就是我創建和填充緩沖區的方式:

    blockIndex = glGetUniformBlockIndex(program, "MaterialInfo");
    if (blockIndex == -1) {
        fprintf(stderr, "Could not bind uniform block\n");
    }
    glGenBuffers(1, &materialUbo);
    glBindBuffer(GL_UNIFORM_BUFFER, materialUbo);
    glBufferData(GL_UNIFORM_BUFFER, sizeof(MaterialBlock), &mesh->material, GL_DYNAMIC_DRAW);
    glBindBufferBase(GL_UNIFORM_BUFFER, blockIndex, materialUbo);


    blockIndex = glGetUniformBlockIndex(program, "LightInfo");
    if (blockIndex == -1) {
        fprintf(stderr, "Could not bind uniform block\n");
    }
    glGenBuffers(1, &lightUbo);
    glBindBuffer(GL_UNIFORM_BUFFER, lightUbo);
    glBufferData(GL_UNIFORM_BUFFER, sizeof(LightBlock), &light->lightBlock, GL_DYNAMIC_DRAW);
    glBindBufferBase(GL_UNIFORM_BUFFER, blockIndex, lightUbo);

當結構定義如下:

struct LightBlock { 
    glm::vec4 La;
    glm::vec4 Ld;
    glm::vec4 Ls;
};

struct MaterialBlock {
    glm::vec4 Ka;
    glm::vec4 Ks;
    glm::vec4 Kd;
};

如果我只使用一個統一緩沖區,這段代碼工作正常。 這就是MaterialInfo。 如果我為lightInfo包含第二個緩沖區,那么當我在渲染后到達glDrawElements()時會出現崩潰。

使用像這樣的多個統一緩沖區有問題嗎? 我能把它變成1個UBO嗎?

glGetUniformBlockIndex不起作用。 它檢索標識該特定統一塊的數字。 不是傳遞給glBindBufferRange/Base的統一緩沖區綁定索引。

UBO綁定很像紋理綁定。 您告訴程序要查看哪個插槽。使用紋理,您可以獲得紋理的統一位置,然后將該均勻值設置為紋理單位索引。 使用UBO,您可以獲得塊的塊索引,將該塊索引的綁定值設置為它將看起來的統一緩沖區綁定點。

所以你應該從glGetUniformBlockIndex獲取索引並使用glUniformBlockBinding為它分配一個緩沖區綁定點。 然后將緩沖區綁定到分配給統一塊的綁定點。

只是為了擴展Nicol的答案。 大多數樣本都會混淆分配和使用,並且他們對使用槽進行硬編碼,因此只支持一個緩沖區,這真的令人困惑,只是自己輸了一天。

設置着色器初始化:

    m_ubo_transform_block_index = glGetUniformBlockIndex(m_gl_program_object, "transform_uniforms");
    if (m_ubo_transform_block_index != -1)
    {
        glUniformBlockBinding(m_gl_program_object, m_ubo_transform_block_index, UBO_TRANSFORM_INDEX);
    }

UBO_TRANSFORM_INDEX就像一個紋理單元一樣。

在抽獎時使用:

        if(m_ubo_transform_block_index != -1)
        {
            glBindBufferBase(GL_UNIFORM_BUFFER, UBO_TRANSFORM_INDEX, uniform_buffer->m_uniform_transform_buffer_object);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM