c++ - 具有可分离程序的 OpenGL 统一 block 绑定(bind)

标签 c++ opengl graphics

我正在尝试设置统一 block 并且对 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 缓冲区设置上述统一 block ?

最佳答案

你不能。或者至少,不是按照你的意思。

实际上,您可以将这三个着色器的所有统一数据放在同一个缓冲区对象中。您必须确保 the alignment for the start of each block's data matches the implementation-defined alignment requirements specified for UBOs (通过 GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 查询),但除此之外,你很好。

但是,没有办法避免调用 glBindBufferRange在每个着色器的使用之间。即使您将所有 block 的 block 绑定(bind)索引设置为相同的索引。即使您每次都绑定(bind)相同的缓冲区。原因是您必须从缓冲区中选择不同的范围,因为 block 都是不同的并且存储不同的数据。

关于c++ - 具有可分离程序的 OpenGL 统一 block 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61181566/

相关文章:

java - 使用纹理对象使用 JOGL 进行基本纹理绘制

c++ - 制作一个 Mat 类型对象的数组。输出窗口显示相同的帧

algorithm - 如何检查多边形是否凸?

c++ - 远景——可能有一个带有访问非静态成员的 lambda 的静态类成员吗?

c++ - OpenGL 立方体贴图 : Writing to mipmap

opengl - 如何使用鼠标改变OpenGL相机

python - 我如何找到我的 Python 井字游戏的赢家?

c++ - HDF5挂载文件(带H5Fmount)

java - C++ getline() 比 Java 的 readLine() 慢

c++ - 如何调用paillier库的函数