结构数组到计算着色器
Array of structures into Compute Shader
在 OpenGL 中编写一个简单的计算着色器以了解其工作原理,我无法获得想要的结果。
我想向我的计算着色器传递一个结构 colourStruct 数组来为输出纹理着色。
我希望在我的计算着色器中 "wantedColor" = 0 时有一个红色图像,在 "wantedColor" = 1 时有一个绿色图像,2 为蓝色图像。
但实际上当 "wantedColor" = 1 或 2 或 3 时我只有红色,而当 "wantedColor" > 2...
时我只有黑色
如果有人有想法,或者我没有理解计算着色器输入的想法。
感谢您的帮助,这是我的代码中有趣的部分。
我的计算着色器:
#version 430 compatibility
layout(std430, binding=4) buffer Couleureuh
{
vec3 Coul[3]; // array of structures
};
layout(local_size_x = 1, local_size_y = 1) in;
layout(rgba32f, binding = 0) uniform image2D img_output;
void main() {
// base pixel colour for image
vec4 pixel = vec4(0.0, 0.0, 0.0, 1.0);
// get index in global work group i.e x,y, position
ivec2 pixel_coords = ivec2(gl_GlobalInvocationID.xy);
ivec2 dims = imageSize (img_output);
int colorWanted = 0;
pixel = vec4(Coul[colorWanted], 1.0);
// output to a secific pixel in the image
imageStore (img_output, pixel_coords, pixel);
}
计算着色器和 SSBO 初始化:
GLuint structBuffer;
glGenBuffers(1, &structBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, structBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(colorStruct), NULL, GL_STATIC_DRAW);
GLint bufMask = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; // invalidate makes a ig difference when re-writting
colorStruct *coul;
coul = (colorStruct *) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, 3*sizeof(colorStruct), bufMask);
coul[0].r = 1.0f;
coul[0].g = 0.0f;
coul[0].b = 0.0f;
coul[1].r = 0.0f;
coul[1].g = 1.0f;
coul[1].b = 0.0f;
coul[2].r = 0.0f;
coul[2].g = 0.0f;
coul[2].b = 1.0f;
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, structBuffer);
m_out_texture.bindImage();
// Launch compute shader
m_shader.use();
glDispatchCompute(m_tex_w, m_tex_h, 1);
// Prevent samplign before all writes to image are done
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
vec3
总是 16 字节对齐。因此,当它们在数组中时,它们的行为类似于 vec4
s。即使使用 std430
布局。
。您应该使用 float
的数组(单独访问您想要的 3 个成员)或 vec4
的数组(带有未使用的元素)。
在 OpenGL 中编写一个简单的计算着色器以了解其工作原理,我无法获得想要的结果。
我想向我的计算着色器传递一个结构 colourStruct 数组来为输出纹理着色。
我希望在我的计算着色器中 "wantedColor" = 0 时有一个红色图像,在 "wantedColor" = 1 时有一个绿色图像,2 为蓝色图像。
但实际上当 "wantedColor" = 1 或 2 或 3 时我只有红色,而当 "wantedColor" > 2...
时我只有黑色如果有人有想法,或者我没有理解计算着色器输入的想法。
感谢您的帮助,这是我的代码中有趣的部分。
我的计算着色器:
#version 430 compatibility
layout(std430, binding=4) buffer Couleureuh
{
vec3 Coul[3]; // array of structures
};
layout(local_size_x = 1, local_size_y = 1) in;
layout(rgba32f, binding = 0) uniform image2D img_output;
void main() {
// base pixel colour for image
vec4 pixel = vec4(0.0, 0.0, 0.0, 1.0);
// get index in global work group i.e x,y, position
ivec2 pixel_coords = ivec2(gl_GlobalInvocationID.xy);
ivec2 dims = imageSize (img_output);
int colorWanted = 0;
pixel = vec4(Coul[colorWanted], 1.0);
// output to a secific pixel in the image
imageStore (img_output, pixel_coords, pixel);
}
计算着色器和 SSBO 初始化:
GLuint structBuffer;
glGenBuffers(1, &structBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, structBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(colorStruct), NULL, GL_STATIC_DRAW);
GLint bufMask = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; // invalidate makes a ig difference when re-writting
colorStruct *coul;
coul = (colorStruct *) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, 3*sizeof(colorStruct), bufMask);
coul[0].r = 1.0f;
coul[0].g = 0.0f;
coul[0].b = 0.0f;
coul[1].r = 0.0f;
coul[1].g = 1.0f;
coul[1].b = 0.0f;
coul[2].r = 0.0f;
coul[2].g = 0.0f;
coul[2].b = 1.0f;
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, structBuffer);
m_out_texture.bindImage();
// Launch compute shader
m_shader.use();
glDispatchCompute(m_tex_w, m_tex_h, 1);
// Prevent samplign before all writes to image are done
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
vec3
总是 16 字节对齐。因此,当它们在数组中时,它们的行为类似于 vec4
s。即使使用 std430
布局。
float
的数组(单独访问您想要的 3 个成员)或 vec4
的数组(带有未使用的元素)。