由于我更改了传入着色器的缓冲区的结构大小,因此计算着色器存在一个怪异的问题。

struct Particle
{
    vec3 position;
    vec2 uv;
    vec3 accumulated_normal;
    int id;
    int flattened_id;
    int movable;
    // can the particle move or not ? used to pin parts of the cloth
    float mass;
    // the mass of the particle (is always 1 in this example)
    vec3 old_pos;
    // the position of the particle in the previous time step, used as part of the verlet numerical integration scheme
    vec3 acceleration;
    // a vector representing the current acceleration of the particle
};

这样定义。 我在尝试使用扁平化的id时遇到问题,因此我想将id的内容写回到传入的缓冲区中。着色器看起来像这样。

layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in;

void main()
{
    unsigned int flattened_id = gl_LocalInvocationIndex;

    particleBuffer.particles[0].id = 16;
    particleBuffer.particles[1].id = 17;
    particleBuffer.particles[2].id = 18;
    particleBuffer.particles[3].id = 19;
    //particleBuffer.particles[4].id = 20;
}

所以直到这一点都没问题,但是当我取消注释最后一行,即particleBuffer.particles [4]时,网格从屏幕上消失了。 我之前已经设法从该网格更改了位置数据,但这似乎很奇怪。 我验证了我确实传入了缓冲区的16个元素,因此也不应该超出范围(例如,cloth1.particles.size()= 16)。 有任何想法吗 ?? 整个代码在这里。.https ://github.com/ssarangi/OpenGL_Cloth/tree/master/cloth_4_3_compute

glUseProgram(computeShader);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, cloth1.vertex_vbo_storage);
glBufferData(GL_SHADER_STORAGE_BUFFER, cloth1.particles.size() * sizeof(Particle), &(cloth1.particles[0]), GL_DYNAMIC_COPY);

glDispatchCompute(1, 1, 1);

{
    GLenum err = gl3wGetError();
}

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, cloth1.vertex_vbo_storage);
Particle * ptr = reinterpret_cast<Particle *>(glMapBufferRange(GL_ARRAY_BUFFER, 0, cloth1.particles.size() * sizeof(Particle), GL_MAP_READ_BIT));

memcpy(&cloth1.particles[0], ptr, cloth1.particles.size()*sizeof(Particle));
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);

***********************编辑有Andon的评论*********************** *******这是C ++方面的新布局。

struct Particle
{
    vec4 position;
    vec2 uv;
    vec4 accumulated_normal;
    vec4 old_pos; // the position of the particle in the previous time step, used as part of the verlet numerical integration scheme
    vec4 acceleration; // a vector representing the current acceleration of the particle
    int id;
    int flattened_id;
    int movable; // can the particle move or not ? used to pin parts of the cloth
    float mass; // the mass of the particle (is always 1 in this example)

GLSL侧面定义。 我不确定的是,是否需要在glsl结构中包含填充元素。 它仍然不会更新ID。

struct Particle
{
    vec4 position;
    vec2 uv;
    vec4 accumulated_normal;
    vec4 old_pos; // the position of the particle in the previous time step, used as part of the verlet numerical integration scheme
    vec4 acceleration; // a vector representing the current acceleration of the particle
    int id;
    int flattened_id;
    int movable; // can the particle move or not ? used to pin parts of the cloth
    float mass; // the mass of the particle (is always 1 in this example)
};

  ask by ssarangi translate from so

本文未有回复,本站智能推荐:

1回复

OpenGL计算着色器扩展

我在创建计算着色器时遇到问题。 当我尝试使用glCreateShader() func创建着色器时,我的程序似乎不知道GLenum type GL_COMPUTE_SHADER 。 我的显卡有点低端,但是当我检查GL_ARB_compute_shader扩展名时,它就存在了,所以我猜
1回复

如何使用glShaderStorageBinding绑定着色器缓冲区块?

使用OpenGL 4.3,我想知道如何使用glShaderStorageBinding绑定着色器缓冲区块。 '绑定'限定符工作正常,但我不想使用它们。 我写了以下代码: 计算着色器: 期望结果为1,但在Obuffer中将值返回为0。
1回复

计算着色器共享内存包含工件

我一直在尝试编写一般的计算着色器高斯模糊实现。 它基本上可以工作,但它包含的工件即使在场景静止时也会改变每一帧。 我花了几个小时试图调试这个。 我已经走了尽可能确保不超出界限,展开所有循环,用常量替换制服,但工件仍然存在。 我已经在3个不同的机器/ GPU(2个nvidia,1个
1回复

在计算着色器中与体素世界的粒子碰撞

我已将粒子系统添加到正在开发的体素游戏中。 此刻,所有物理过程都在CPU上完成,而且相当慢(我的CPU挣扎着2000个粒子)。 对于每个粒子,我确定理论上可以碰撞的体素的范围(基于粒子的位置和速度以及经过的时间),然后检查与该范围内所有体素的碰撞,并使用最近的碰撞。 为了提高性能,
1回复

从计算着色器取回数据

我对opengl相当陌生,发现自己处于需要从计算着色器获取数据的情况,但是由于我错过了一些关键知识,因此无法正常工作。 所以我来到这里,以便您可以给我一些提示。 说我有一个像这样的计算着色器: 现在,我想在应用程序中使用trBuffer的数据。 有人告诉我要制作一个着色器存储缓
1回复

使用足够大的SSBO时,对着色器程序的操作会冻结GL上下文

我正在计算着色器中进行并行约简。 我递归计算片段的边界框(从场景渲染产生的G缓冲区开始),然后是边界框的边界框,依此类推,直到最终得到单个边界框。 最初,我使用深度纹理和一个vec2最小和最大深度的vec2进行此操作,然后将层次结构存储在SSBO中,如下所示: // Each tile
1回复

从OpenGL计算着色器写入深度缓冲区

通常,在现代桌面OpenGL硬件上,什么是从计算着色器填充深度缓冲区,然后使用该深度缓冲区进行带有三角形等图形管道渲染的最佳方法? 我特别想知道有关HiZ的问题。 我也想知道在图形渲染之前或之后对深度缓冲区进行计算着色器修改是否更好? 如果在图形渲染之后运行计算着色器,则我认为深度
1回复

平铺渲染计算着色器光的剔除和着色

我正在尝试在OpenGL / GLSL中实现延迟平铺渲染,但我坚持进行光剔除。 我的GPU较旧(AMD Radeon 6490m),由于奇怪的原因,当在共享变量上调用原子操作进行原子操作时,计算着色器会无限循环地运行,因此我无法使用计算着色器来计算最小和最大深度。 无论如何,这不是很费时
1回复

计算着色器未写入缓冲区

我正在寻找使用QOpenGLFunctions_4_3_Core OpenGL函数从Qt调用计算着色器的帮助。 具体来说,我对glDispatchCompute(1024, 1, 1);调用glDispatchCompute(1024, 1, 1); 似乎对绑定到它的缓冲区没有任何影响。
1回复

计算着色器不会写入缓冲区

我正在尝试使用计算着色器写入缓冲区。 设置缓冲区: 计算着色器: 调度和阅读: 但是输出为0而不是1。