Вычислить шейдер, не модифицируя 3d текстуру
Я хочу перенести инициализацию моей 3D-текстуры с процессора на графический процессор. В качестве теста я написал шейдер, чтобы установить для всех вокселей постоянное значение, но текстура вообще не изменяется. Как мне заставить это работать?
Вычислить шейдер:
#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
содержит инициализированные данные процессора.
1 ответ
Решение
Тьфу. Таким образом, очевидно, что 3D-текстура должна быть связана как слоистая, иначе шейдер не сможет изменить любую координату uvw с w>0.
glBindImageTexture(0, volume_tid, 0, /*layered=*/GL_TRUE, 0, GL_READ_WRITE, GL_R8);
делает трюк.