使用计算着色器进行Mipmapping

时间:2016-05-31 16:02:17

标签: c++ opengl compute-shader

我的体素化场景的颜色,法线和其他数据的3D纹理,因为有些数据不能平均,我需要自己计算mip水平。 3D纹理尺寸为(128 + 64)x 128 x 128,额外的64 x 128 x 128用于mip级别。

所以当我拍摄第一个mip级别时,它是(0,0,0),大小为128 x 128 x 128,只是将体素复制到第二级,即(128,0,0)数据出现在那里,但只要我将(128,0,0)的第二级复制到(128,0,64)的第三级,数据就不会出现在第3级。

着色器代码:

#version 450 core

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

layout (location = 0) uniform unsigned int resolution;
layout (binding = 0, rgba32f) uniform image3D voxel_texture;

void main()
{
    ivec3 index = ivec3(gl_WorkGroupID);
    ivec3 spread_index = index * 2;

    vec4 voxel = imageLoad(voxel_texture, spread_index);
    imageStore(voxel_texture, index + ivec3(resolution, 0, 0), voxel);

    // This isn't working
    voxel = imageLoad(voxel_texture, spread_index + 
                      ivec3(resolution, 0, 0));
    imageStore(voxel_texture, index + ivec3(resolution, 0, 64), voxel);
}

使用

分派着色器程序
glUniform1ui(0, OCTREE_RES);

glBindImageTexture(0, voxel_textures[0], 0, GL_TRUE, 0, GL_READ_WRITE, 
                   GL_RGBA32F);

glDispatchCompute(64, 64, 64);

我不知道我是否错过了一些基本的东西,这是我的第一个计算着色器。我也试图使用记忆障碍,但它并没有改变一件事。

1 个答案:

答案 0 :(得分:2)

嗯,你不能指望你的第二个imageLoad能够像你那样在你的第一家商店里读到的纹素。

并且无法在“本地”工作组之外同步访问。

你需要:

  • 使用内核的多次调用来执行每个层
  • 要重写着色器逻辑,以便始终从“原始”区域获取。