OpenGL Унифицированные блочные привязки с разделяемыми программами - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь настроить единообразные блоки и очень запутался в glUniformBlockBinding() и glBindBufferRange() Дело в том, что я пытаюсь разделить один буфер UBO для нескольких разделяемых программ одновременно. думаю: glBindProgramPipeline() с glUniformBlockBinding(). Я использую возможности профиля OpenGL 4.5 Core.

В качестве примера приведем три этапа шейдера, одну вершину и два фрагмента для постобработки:

//Vertex shader A:
#version 450 core
layout(std140) uniform Camera {
    mat4 Projection;
    mat4 Modelview;
};
const vec2 TexCoords[] = {
    { 0.f, 0.f },
    { 1.f, 0.f },
    { 1.f, 1.f },
    { 0.f, 1.f }};
out VertexData {
    smooth vec2 TexCoord;
} vs;
void main() {
    float xw = 400.0, yh = 300.0;
    vec2 vertices[] = {
        { -xw, -yh },
        { xw, -yh },
        { xw, yh },
        { -xw, yh }};
    vec4 vpos = vec4(vertices[gl_VertexID % 4], 0.0, 1.0);
    gl_Position = Projection * Modelview * vpos;
    vs.TexCoord = TexCoords[gl_VertexID % 4];
}

// Post processing Fragment shader skeleton:
#version 450 core
in VertexData {
    smooth vec2 TexCoord;
} fs;
layout(location=0) out vec4 FragData[2];
uniform sampler2D Texture[2];
layout(std140) uniform Effect {
    int FragIndex;
    int MaxWeights;
    float Weights[64];
    vec2 BlurXY;
};
void main() {
    FragData[FragIndex] = texture(Texture[1 - FragIndex], fs.TexCoord);
}

Как мне настроить над единообразными блоками, используя только один буфер UBO?

1 Ответ

3 голосов
/ 13 апреля 2020

Вы не можете. Или, по крайней мере, не так, как вы имеете в виду.

Фактически вы можете поместить все унифицированные данные для этих трех шейдеров в один и тот же буферный объект. Вы должны убедиться, что выравнивание для начала данных каждого блока соответствует требованиям выравнивания, определенным реализацией, указанным для UBO (запрашивается через GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT), но кроме этого, все в порядке.

Однако нет способа избежать вызова glBindBufferRange между использованием каждого шейдера. Даже если вы установите индекс привязки блока для всех блоков на один и тот же индекс. Даже если вы связываете один и тот же буфер каждый раз. Причина в том, что вы должны выбрать другой диапазон из буфера, поскольку все блоки разные и хранят разные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...