Opengl 我怎样才能通过二级考试;无界的;数组到着色器?

Opengl 我怎样才能通过二级考试;无界的;数组到着色器?,opengl,glsl,Opengl,Glsl,我想更新着色器存储缓冲区对象 以每帧为基础。我尝试了以下方法: GLuint ssbo; GLuint n = /* ... */; std::size_t const size = /* ... */; std::vector<float> first(size), second(size); void init() { glGenBuffers(1, &ssbo); glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo

我想更新着色器存储缓冲区对象

以每帧为基础。我尝试了以下方法:

GLuint ssbo;
GLuint n = /* ... */;

std::size_t const size = /* ... */;
std::vector<float> first(size), second(size);

void init()
{
    glGenBuffers(1, &ssbo);
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLuint) + 2 * size * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
}

void display()
{
    //
    // Modify 'first' and 'second
    //
    // ...

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
    glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, size, &first[0]);
    glBufferSubData(GL_SHADER_STORAGE_BUFFER, size, data_size, &second[0]);
}
GLuint-ssbo;
GLuint n=/*…*/;
std::size_t const size=/*…*/;
std::向量第一(大小),第二(大小);
void init()
{
glGenBuffers(1和ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER,ssbo);
glBufferData(GL_着色器_存储_缓冲区、sizeof(GLuint)+2*size*sizeof(float)、nullptr、GL_动态_绘制);
}
无效显示()
{
//
//修改“first”和“second”
//
// ...
glBindBuffer(GL_SHADER_STORAGE_BUFFER,ssbo);
glBufferSubData(GL_SHADER_STORAGE_BUFFER,0,size和first[0]);
glBufferSubData(GL_着色器_存储_缓冲区、大小、数据_大小和秒[0]);
}
问题:GL\u DYNAMIC\u DRAW是正确的用法说明符吗?我真的应该使用
glBufferSubData
来更新缓冲区吗?我是否需要使用
GLfloat
而不是
float

最重要的是:这真的有效吗?我认为不会,因为OpenGL不知道
first
second
的大小。那么,如果这不起作用,我应该怎么做呢?创建两个不同的缓冲区对象

如何将两个“无界”数组传递给着色器

你没有;没有一个SSBO

SSBO中唯一可以无界的成员是最后一个。由于最后只能有一个成员,SSBO中只有一个成员可以是无界的

而且,传递长度也没有意义。您可以使用
.length()
方法询问着色器中任何数组的长度,即使对于SSBO的无界成员也是如此。唯一的区别是,对于无界缓冲区变量,长度将不是编译时常量

那么,如果这不起作用,我应该怎么做呢?创建两个不同的缓冲区对象

如果两个数组具有相同的长度,则可以将它们作为结构的无界数组传递。如果两个阵列具有不同的长度,则它们必须是不同的着色器存储块

您使用的缓冲区对象的数量无关紧要。没有规则规定不能将同一缓冲区绑定到两个不同的着色器存储块定义。如果你愿意,你甚至可以重叠它们的内容

GLuint ssbo;
GLuint n = /* ... */;

std::size_t const size = /* ... */;
std::vector<float> first(size), second(size);

void init()
{
    glGenBuffers(1, &ssbo);
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLuint) + 2 * size * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
}

void display()
{
    //
    // Modify 'first' and 'second
    //
    // ...

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
    glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, size, &first[0]);
    glBufferSubData(GL_SHADER_STORAGE_BUFFER, size, data_size, &second[0]);
}