I am recently trying to voxelize 3D polygon meshes with fixed function opengl.
void VoxelizeWithOpenGL(const Mesh &in, uint32_t width, uint32_t height,
uint32_t depth, uint8_t *out)
{
GLuint texture_id, fbo_id;
glGenTextures(1, &texture_id);
glEnable(GL_TEXTURE_3D);
glBindTexture(GL_TEXTURE_3D, texture_id);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, width, height, depth, 0, GL_RGB,
GL_UNSIGNED_BYTE, (void *)0);
glGenFramebuffers(1, &fbo_id);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
glFramebufferTexture3D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D, texture_id, 0, 0);
GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers( 1, drawBuffers );
GLenum status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
throw std::runtime_error("Cannot create 3D framebuffer.");
glViewport(0, 0, width, height);
const AABB &aabb = FindAABB(in);
const glm::mat4 &proj = glm::ortho(aabb.min_x, aabb.max_x, aabb.min_y, aabb.max_y,
aabb.min_z, aabb.max_z);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(glm::value_ptr(proj));
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
/*glBegin(GL_TRIANGLES);
for(const Face &c: in.faces)
{
const glm::vec3 &o=c.o.pos;
const glm::vec3 &a=c.a.pos;
const glm::vec3 &b=c.b.pos;
glVertex3fv(glm::value_ptr(o));
glVertex3fv(glm::value_ptr(a));
glVertex3fv(glm::value_ptr(b));
}
glEnd();*/
//Read from GPU to RAM
glBindTexture(GL_TEXTURE_3D, texture_id);
glGetTexImage(GL_TEXTURE_3D, 0, GL_RGB, GL_UNSIGNED_BYTE, out);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fbo_id);
glDeleteTextures(1, &texture_id);
}
I am pretty sure FindAABB and mesh loader is correct, however it keeps giving me weird result, even if I comment the drawing part.(please ignore the random cube color)