opengl - 计算着色器不修改 3d 纹理

标签 opengl glsl

我想将我的 3D 纹理的初始化从 CPU 移到 GPU。作为测试,我编写了一个着色器将所有体素设置为一个常数值,但纹理根本没有修改。我如何使它工作?

计算着色器:

#version 430

layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
layout(r8, location = 0) uniform image3D volume;

void main()
{
  imageStore(volume, ivec3(gl_WorkGroupID), vec4(0));
}

调用:
glEnable(GL_TEXTURE_3D);
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &volume_tid);
glBindTexture(GL_TEXTURE_3D, volume_tid);
glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, volume_dims[0], volume_dims[1], volume_dims[2], 0, GL_RED, GL_UNSIGNED_BYTE, voxels);

ShaderProgram computeVolumeShader;
computeVolumeShader.loadShader(GL_COMPUTE_SHADER, "compute_volume.glsl");
computeVolumeShader.link();
computeVolumeShader.use();
computeVolumeShader.uniform("volume", 0);
glBindImageTexture(0, volume_tid, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R8);
glDispatchCompute(volume_dims[0], volume_dims[1], volume_dims[2]);
glBindImageTexture(0, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R8);
computeVolumeShader.unUse();
glMemoryBarrier(GL_ALL_BARRIER_BITS);

注:voxels送入 glTexImage3D包含 CPU 初始化的数据。

最佳答案

啊。所以显然 3D 纹理必须绑定(bind)为分层,否则着色器无法修改 w>0 的任何 uvw 坐标。

glBindImageTexture(0, volume_tid, 0, /*layered=*/GL_TRUE, 0, GL_READ_WRITE, GL_R8);

成功了。

关于opengl - 计算着色器不修改 3d 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17015132/

相关文章:

performance - 多次渲染同一个模型

opengl - 使用 glTexImage2D 时纹理只有蓝色色调

opengl - GL_UNIFORM_BLOCK_DATA_SIZE 的 glGetActiveUniformBlockParam 背后的逻辑是什么?

c++ - 从 C++ 代码中获取已编译的 glsl 着色器统一参数的大小

opengl - 现代 OpenGL 的点 Sprite 尺寸衰减

opengl - glsl 通过几何着色器问题

opengl - 我应该在统一缓冲区或着色器存储缓冲区对象内使用 `vec3` 吗?

python - 如何将我的 Pygame 游戏 "blit"放到 OpenGL 表面上?

qt - QML/Qt3D GeometryRenderer 使用的基本示例

opengl - 着色器存储缓冲区对象速度慢 – 替代方案?