I'm trying to bind a 3D texture to an image unit in OpenGL. Current shader code:
#version 450 core
out vec4 OutBuffer;
in GS_OUT {
vec3 Position;
vec4 ScreenPosition;
vec3 Normal;
vec2 TexCoords;
} fs_in;
uniform uvec3 uVoxelSpan;
layout(rgba16f) coherent uniform image3D uVoxelMap;
void main() {
imageStore(uVoxelMap, ivec3(floor(fs_in.ScreenPosition.xyz)), vec4(1.0f));
ivec3 sz = imageSize(uVoxelMap); // This ends up being ivec3(0, 0, 0)
OutBuffer = vec4(vec3(sz.xyz), 1.0f);
}
Currently, this shader is being used to debug this problem.
// Earlier in the program
unsigned int voxel_tex = 0;
glGenTextures(1, &voxel_tex);
glBindTexture(GL_TEXTURE_3D, voxel_tex);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16F, 128, 128, 128, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA16F, 128, 128, 128, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexImage3D(GL_TEXTURE_3D, 2, GL_RGBA16F, 128, 128, 128, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexImage3D(GL_TEXTURE_3D, 3, GL_RGBA16F, 64, 64, 64, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexImage3D(GL_TEXTURE_3D, 4, GL_RGBA16F, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_3D, previous_texture);
// Somewhere in the render loop
{
static glm::vec3 clear_vec = glm::vec3(0.0f);
glUseProgram(voxel_shader);
glClearTexImage(voxel_tex, 0, GL_BGR, GL_FLOAT, &clear_vec);
glm::vec3 sz; // This ends up being the correct value
glBindTexture(GL_TEXTURE_3D, voxel_tex);
glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &sz.x);
glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_HEIGHT, &sz.y);
glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_DEPTH, &sz.z);
glBindTexture(GL_TEXTURE_3D, previous_texture);
glBindImageTexture(2, voxel_tex, 0, GL_TRUE, NULL, GL_READ_WRITE, GL_RGBA16F);
glUniform1i(voxelmap_location, 2);
// ... Render meshes ...
glUseProgram(previous_program);
}
This C++ code is a snippet of everything related to the use of the 3D texture.
Am I doing something wrong? glGetError() never returns an error, but imageSize(uVoxelMap)
returns ivec3(0, 0, 0)
, meaning something went wrong.