不同大小的着色器存储缓冲区内容“转移”到阵列缓冲区

我在计算着色器中计算的位置实例化对象。我想将包含位置的计算着色器的输出绑定到要绘制的数组缓冲区,但是我无法使其工作。我对索引算法表示歉意,对内存对齐方式感到超级偏执,放弃了所有向量。

相关代码简化:

初始化:

//x, y, z, 1 stored in succession
/*float*/positions = new float[maxPositionCount * 4];

//initialize positions_vbo
glGenBuffers(1, &position_vbo);
glBindBuffer(GL_ARRAY_BUFFER, position_vbo);
glBindBuffer(GL_ARRAY_BUFFER, 0);

//initialize positionsOUT_ssbo
glGenBuffers(1, &positionsOUT_ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, positionsOUT_ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, 4 * maxPositionCount * sizeof(float), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 8, positionsOUT_ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

//initialize positionCounter
glGenBuffers(1, &positionCount_acb);
glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, positionCount_acb);
glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), NULL, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 7, positionCount_acb);
glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);

绘制循环:

//initialize the counter
posCount = 0;
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 7, positionCount_acb);
glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint),  &posCount);

//send other data to compute shader in order to calculate positions
//dispatch and wait
//....

//retrieve the counter
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 7, positionCount_acb);
glGetBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint), &positionCount_acb);

//retrieve the positions (1)
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 8, positionsOUT_ssbo);
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, posCount * 4 * sizeof(float), positions);

//bind position_vbo  (2)
glBindBuffer(GL_ARRAY_BUFFER, position_vbo);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(float) * posCount, posCount > 0 ? &positions[0] : NULL, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribDivisor(2, 1);

//instead of (1)+(2) I would like to know if something like this is possible
//glBindBuffer(GL_ARRAY_BUFFER, positionsOUT_ssbo);
//glEnableVertexAttribArray(2);
//glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
//glVertexAttribDivisor(2, 1);

//bind vertex array and draw the object instances
glBindVertexArray(vertexArrayOfTheObjectImDrawing);
glDrawElementsInstanced(GL_TRIANGLES, objectSharedVertexCount, GL_UNSIGNED_SHORT, 0, posCount);

计算着色器:

layout(local_size_x = 8, local_size_y = 8, local_size_z = 8) in;

//just in case they are relevant somehow
//can set and get them fine but they have fixed size (maxPositionCount)
//---------v
layout(std430, binding=4) buffer A {
    int a[ ];
};
layout(std430, binding=5) buffer B {
    int b[ ];
};
layout(std430, binding=6) buffer C {
    int c1,c2,c3,c4,c5;
};
//----------^

layout(binding = 7, offset = 0) uniform atomic_uint returnedPositionsIndex;

layout(std430, binding=8) buffer pos_Out
{
    float positionsOUT[ ];
};

void main()
{
    ivec3 currentPos = gl_GlobalInvocationID.xyz;

    if (I_want_that_position_returned(currentPos))
    {
        uint i = atomicCounterIncrement(returnedPositionsIndex);
        positionsOUT[i * 4 + 0] = float(index3D.x);
        positionsOUT[i * 4 + 1] = float(index3D.y);
        positionsOUT[i * 4 + 2] = float(index3D.z);
        positionsOUT[i * 4 + 3] = 1.0;
    }
}

顶点着色器:

uniform mat4 worldViewProjection;
layout(location = 1) in vec4 vertPosition;
layout(location = 2) in vec4 position;
int main() {
     gl_Position = worldViewProjection * (vertPosition + position);
}

目前它崩溃了

glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, posCount * 4 * sizeof(float),  positions);

调用,即使它是程序上唯一未注释的行。调试错误:

Exception thrown at 0x0000000001A132A9 (atio6axx.dll) in asd.exe:
0xC0000005: Access violation writing location 0x0000000000000000.

我已经尝试通过事先调用glBufferData(... positions)来初始化数据。使用正确的计数检索原子计数器。另外,有没有一种方法可以从positionOUT_ssbo发送位置数据,而无需复制并绑定到position_vbo?

编辑:初始化时崩溃,重新声明了变量“ positions”。

EDIT2:我上面评论的行确实是一种将ssbo的内容直接“绑定”到数组缓冲区的方法。如果有更好的方法,请随时分享。

code_dredd

好吧,真令人尴尬。我在初始化阶段重新声明了类变量的位置,使之位于绘制循环中。现在工作正常。感谢您指出正确的方向!

根据您的评论,我在下面复制了我的原始评论作为回复。


我知道您有,float* positions = new float[maxPositionCount * 4];但是我从未看到何时将值实际添加到此数组中,所以据我所知,它是一个未初始化的内存块。

然后glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, posCount * 4 * sizeof(float), positions);您呼叫似乎发送此未初始化的内存块,该内存块可能被设置为零,并解释了为什么会出现此Access violation writing location 0x0000000000000000.错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL:着色器存储缓冲区映射/绑定

来自分类Dev

着色器存储缓冲区对象:字节序?

来自分类Dev

从片段着色器访问深度缓冲区

来自分类Dev

无法从Compute着色器读取深度缓冲区

来自分类Dev

金属着色器在缓冲区中插入值

来自分类Dev

我可以从Metal着色器获取缓冲区的大小吗?

来自分类Dev

有效清除着色器存储缓冲区

来自分类Dev

有效清除着色器存储缓冲区

来自分类Dev

用于着色器资源视图到深度模板缓冲区资源的哪种格式?

来自分类Dev

打印缓冲区内容

来自分类Dev

GLSL-使用部分着色器存储缓冲区作为计数器的正确性

来自分类Dev

GLSL-使用部分着色器存储缓冲区作为计数器的正确性

来自分类Dev

将结构发送到着色器存储缓冲区时,为什么会得到垃圾数据?

来自分类Dev

opengl:基于着色器的渲染到帧缓冲区,然后进行固定管线渲染

来自分类Dev

Vulkan - 读取缓冲区中浮点着色器颜色值到 uchar 值的奇怪映射

来自分类Dev

如何使用顶点缓冲区将计算着色器结果输入到不包含顶点着色器的顶点中?

来自分类Dev

获取缓冲区内容,将其存储在struct中,获取新的缓冲区内容,看是否在struct中相等

来自分类Dev

获取TMux滚动缓冲区内容

来自分类Dev

OpenGL计算着色器中的样本深度缓冲区

来自分类Dev

运行OpenGL着色器以修改现有的纹理/帧缓冲区

来自分类Dev

在两个单独的着色器程序之间共享混合和Z缓冲区?

来自分类Dev

threejs片段着色器,使用回收的帧缓冲区

来自分类Dev

OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

来自分类Dev

OSX +屏幕外渲染+ CoreGL +帧缓冲区+着色器=头痛吗?

来自分类Dev

打开gl计算着色器和帧缓冲区

来自分类Dev

如何使用动态缓冲区声明定义金属着色器?

来自分类Dev

具有来自shadertoy的多个缓冲区的端口着色器

来自分类Dev

OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

来自分类Dev

在两个单独的着色器程序之间共享混合和Z缓冲区?

Related 相关文章

  1. 1

    OpenGL:着色器存储缓冲区映射/绑定

  2. 2

    着色器存储缓冲区对象:字节序?

  3. 3

    从片段着色器访问深度缓冲区

  4. 4

    无法从Compute着色器读取深度缓冲区

  5. 5

    金属着色器在缓冲区中插入值

  6. 6

    我可以从Metal着色器获取缓冲区的大小吗?

  7. 7

    有效清除着色器存储缓冲区

  8. 8

    有效清除着色器存储缓冲区

  9. 9

    用于着色器资源视图到深度模板缓冲区资源的哪种格式?

  10. 10

    打印缓冲区内容

  11. 11

    GLSL-使用部分着色器存储缓冲区作为计数器的正确性

  12. 12

    GLSL-使用部分着色器存储缓冲区作为计数器的正确性

  13. 13

    将结构发送到着色器存储缓冲区时,为什么会得到垃圾数据?

  14. 14

    opengl:基于着色器的渲染到帧缓冲区,然后进行固定管线渲染

  15. 15

    Vulkan - 读取缓冲区中浮点着色器颜色值到 uchar 值的奇怪映射

  16. 16

    如何使用顶点缓冲区将计算着色器结果输入到不包含顶点着色器的顶点中?

  17. 17

    获取缓冲区内容,将其存储在struct中,获取新的缓冲区内容,看是否在struct中相等

  18. 18

    获取TMux滚动缓冲区内容

  19. 19

    OpenGL计算着色器中的样本深度缓冲区

  20. 20

    运行OpenGL着色器以修改现有的纹理/帧缓冲区

  21. 21

    在两个单独的着色器程序之间共享混合和Z缓冲区?

  22. 22

    threejs片段着色器,使用回收的帧缓冲区

  23. 23

    OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

  24. 24

    OSX +屏幕外渲染+ CoreGL +帧缓冲区+着色器=头痛吗?

  25. 25

    打开gl计算着色器和帧缓冲区

  26. 26

    如何使用动态缓冲区声明定义金属着色器?

  27. 27

    具有来自shadertoy的多个缓冲区的端口着色器

  28. 28

    OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

  29. 29

    在两个单独的着色器程序之间共享混合和Z缓冲区?

热门标签

归档