我正在尝试向我的SSBO发送一个glm::uvec4数组。这是可能的还是我应该用另一种方法?
我使用实例绘图,并告诉OpenGL绘制X实例(取决于glm::uvec4size,可以修改)
存储的数据:
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 */];
};发布于 2018-05-27 06:22:49
你绝对可以。直接的方法是像你已经做的那样绑定缓冲区,在渲染调用之前设置数据(如果你想修改它),然后在你的着色器上读取它。
根据您的使用情况,您还需要在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 int size;
layout(std430, binding = 0) buffer blocksData
{
uvec4 data[];
};如果使用元数据版本:
layout(std430, binding = 0) buffer blocksData
{
uint size;
uvec4 data[];
};如果选择第二个选项,则需要处理对齐问题,还需要实现一种将数据大小附加到向SSBO发送的缓冲区的请求的方法。
编辑:要禁用驱动程序警告(顺便说一下,这是NVIDIA特有的,AMD卡似乎没有抛出此错误)
在绑定缓冲区之前,在代码中添加以下行:
GLuint copy_warning = 0x20072;
glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_PERFORMANCE,
GL_DONT_CARE, 1, ©_warning, GL_FALSE);https://stackoverflow.com/questions/50516439
复制相似问题