c++ - 使用计算着色器进行纹理贴图

标签 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) 处的第三层,数据就不会出现在第三层。

着色器代码:

#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);

我不知道我是否错过了一些基本的东西,这是我的第一个计算着色器。我也尝试过使用内存屏障,但它并没有改变任何事情。

最佳答案

好吧,你不能指望你的第二个 imageLoad 像那样读取你刚刚在第一个商店中写入的纹素。

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

你需要:

  • 使用多次调用内核来完成每一层
  • 重写您的着色器逻辑,以便您始终从“原始”区域获取数据。

关于c++ - 使用计算着色器进行纹理贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550551/

相关文章:

c++ - 就内存使用而言,模板 + 仿函数/lambdas 不是最理想的吗?

c++ - 如何将c++项目导入QT creator

opengl - 在 GLFW3 中请求特定的 OpenGL 上下文版本

c++ - 如何在 OpenGL 中绘制圆弧

c++ - opengl - 只显示一个纹理

directx - DirectX 计算着色器支持共享内存中的 2D 数组吗?

c++ - 针对设计生成 C++ 代码的任何工具

opengl - OpenGL 计算着色器中的一个大 SSBO 或多个小 SSBO

opengl - 计算着色器在调用(线程)和工作组上的最佳数据划分

C++,需要有关用 strcat 创建的指针的帮助!