首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SSBO中发送uvec4数组

在SSBO中发送uvec4数组
EN

Stack Overflow用户
提问于 2018-05-24 19:01:48
回答 1查看 932关注 0票数 2

我正在尝试向我的SSBO发送一个glm::uvec4数组。这是可能的还是我应该用另一种方法?

我使用实例绘图,并告诉OpenGL绘制X实例(取决于glm::uvec4size,可以修改)

存储的数据:

代码语言:javascript
复制
std::vector<glm::uvec4> m_blocksToRender;

SSBO设置:

代码语言:javascript
复制
// SSBO
glGenBuffers(1, &m_ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_blocksToRender), m_blocksToRender.data(), GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

着色器:

代码语言:javascript
复制
layout(std430, binding = 0) buffer blocksData
{
    uvec4 data[/* ??? can varry, depends on gl_InstanceID size */];
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-27 06:22:49

你绝对可以。直接的方法是像你已经做的那样绑定缓冲区,在渲染调用之前设置数据(如果你想修改它),然后在你的着色器上读取它。

根据您的使用情况,您还需要在SSBO中直接或在制服上了解arrya的大小。

因此,全面的解决办法是:

C++

代码语言:javascript
复制
//Create SSBO
glGenBuffers(1, &m_ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_blocksToRender), m_blocksToRender.data(), GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

void render()
{
  /* additional code */

  //Only needed if another buffer has been bound to the binding point 0
  glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_ssbo);
  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_ssbo);
  //Only needed if the buffer data needs to be changed
  glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_blocksToRender)

  //If you use the uniform option
  glUniform1i(glGetUniformLocation(programID, "size"), m_blocksToRender.size());
}

片段

如果您使用统一的方法:

代码语言:javascript
复制
uniform int size;
layout(std430, binding = 0) buffer blocksData
{
    uvec4 data[];
};

如果使用元数据版本:

代码语言:javascript
复制
layout(std430, binding = 0) buffer blocksData
{
    uint size;
    uvec4 data[];
};

如果选择第二个选项,则需要处理对齐问题,还需要实现一种将数据大小附加到向SSBO发送的缓冲区的请求的方法。

编辑:要禁用驱动程序警告(顺便说一下,这是NVIDIA特有的,AMD卡似乎没有抛出此错误)

在绑定缓冲区之前,在代码中添加以下行:

代码语言:javascript
复制
GLuint copy_warning = 0x20072;
glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_PERFORMANCE,
    GL_DONT_CARE, 1, &copy_warning, GL_FALSE);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50516439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档