只从着色器存储块中获取垃圾?
Only get garbage from Shader Storage Block?
我已经将 shader storage buffer
绑定到 shader storage block
,就像这样
GLuint index = glGetProgramResourceIndex(myprogram, GL_SHADER_STORAGE_BLOCK, name);
glShaderStorageBlockBinding(myprogram, index, mybindingpoint);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, mybuffer)
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, mybindingpoint, mybuffer, 0, 48);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, 48, &mydata);
mydata
指向包含 4 个 glm::vec3
对象的 std::vector
。
因为我将 48 bytes
绑定为缓冲范围,我希望 lights[]
保持 48/(4*3) = 4 vec3s
。
layout(std430) buffer light {
vec3 lights[];
};
我的 std::vector
中索引 1
处的元素包含数据 x=1.0, y=1.0, z=1.0
。
但是通过
查看输出
gl_FragColor = vec4(lights[1], 1.0);
我看到 黄色 (x=1.0, y=1.0, z=0.0
) 个像素。这不是我加载到缓冲区中的内容。
有人能告诉我我做错了什么吗?
编辑
我只是将着色器存储块更改为
layout(std430) buffer light {
float lights[];
};
并输出
gl_FragColor = vec4(lights[3],lights[4],lights[5],1.0);
并且有效(白色像素)。
如果有人能解释一下,那就太好了。
这是因为人们不接受这个简单的建议:。
vec3
的基对齐是 16 字节。 总是。因此,当它被数组化时,数组步幅(从一个元素到下一个元素的字节数)总是16。完全一样一个vec4
.
是的,std430
布局与 std140
不同。但这并没有什么不同。具体来说,它只是防止数组元素的基对齐和步长(以及结构的基对齐)向上舍入到 vec4
的对齐。但是由于 vec3
的基本对齐方式 总是 等于 vec4
的基本对齐方式,因此它不会改变它们。它只影响标量和 vec2
的。
我已经将 shader storage buffer
绑定到 shader storage block
,就像这样
GLuint index = glGetProgramResourceIndex(myprogram, GL_SHADER_STORAGE_BLOCK, name);
glShaderStorageBlockBinding(myprogram, index, mybindingpoint);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, mybuffer)
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, mybindingpoint, mybuffer, 0, 48);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, 48, &mydata);
mydata
指向包含 4 个 glm::vec3
对象的 std::vector
。
因为我将 48 bytes
绑定为缓冲范围,我希望 lights[]
保持 48/(4*3) = 4 vec3s
。
layout(std430) buffer light {
vec3 lights[];
};
我的 std::vector
中索引 1
处的元素包含数据 x=1.0, y=1.0, z=1.0
。
但是通过
查看输出gl_FragColor = vec4(lights[1], 1.0);
我看到 黄色 (x=1.0, y=1.0, z=0.0
) 个像素。这不是我加载到缓冲区中的内容。
有人能告诉我我做错了什么吗?
编辑
我只是将着色器存储块更改为
layout(std430) buffer light {
float lights[];
};
并输出
gl_FragColor = vec4(lights[3],lights[4],lights[5],1.0);
并且有效(白色像素)。
如果有人能解释一下,那就太好了。
这是因为人们不接受这个简单的建议:
vec3
的基对齐是 16 字节。 总是。因此,当它被数组化时,数组步幅(从一个元素到下一个元素的字节数)总是16。完全一样一个vec4
.
是的,std430
布局与 std140
不同。但这并没有什么不同。具体来说,它只是防止数组元素的基对齐和步长(以及结构的基对齐)向上舍入到 vec4
的对齐。但是由于 vec3
的基本对齐方式 总是 等于 vec4
的基本对齐方式,因此它不会改变它们。它只影响标量和 vec2
的。