Я пытаюсь настроить единообразные блоки и очень запутался в 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?