gpt4 book ai didi

c++ - 在 SSBO 中发送 uvec4 数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:49 26 4
gpt4 key购买 nike

我正在尝试将一组 glm::uvec4 发送到我的 SSBO。有可能还是我应该使用其他方法?

我正在使用实例化绘图并告诉 OpenGL 绘制 X 个实例(取决于可以变化的 glm::uvec4 大小)

存储的数据:

std::vector<glm::uvec4> m_blocksToRender;

SSBO 设置:

// 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);

着色器:

layout(std430, binding = 0) buffer blocksData
{
uvec4 data[/* ??? can varry, depends on gl_InstanceID size */];
};

最佳答案

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

根据您的用途,您还需要直接在 SSBO 中或在制服上存储 arrya 的尺寸。

所以完整的解决方案是:

C++

//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());
}

片段

如果使用uniform方法:

uniform int size;
layout(std430, binding = 0) buffer blocksData
{
uvec4 data[];
};

如果您使用元数据版本:

layout(std430, binding = 0) buffer blocksData
{
uint size;
uvec4 data[];
};

如果您选择第二个选项,您需要小心对齐问题,并且您还需要实现一种方法,将数据大小附加到发送到 SSBO 的缓冲区的开头。

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

在绑定(bind)缓冲区之前在代码的某处添加以下行:

GLuint copy_warning = 0x20072;
glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_PERFORMANCE,
GL_DONT_CARE, 1, &copy_warning, GL_FALSE);

关于c++ - 在 SSBO 中发送 uvec4 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com