r/GraphicsProgramming • u/Appropriate_Gas_3990 • 1d ago
Ayuda con uso de MIPs (OpenGL)
Alguien puede ayudarme a determinar por qué al renderizar a un mip diferente de 0 no veo nada? El mip base funciona perfectamente. También ya confirmé que el viewport se actualiza y que el shader funciona.
Este es el código que tengo para crear el fbo y generar los mips, hay algo que me falte? Gracias de antemano :)
InitFBO::InitFBO(int w, int h, GLenum internalFormat)
{
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
for (int mip = 0; mip < 8; ++mip)
{
int mipW = std::max(1, w >> mip);
int mipH = std::max(1, h >> mip);
glTexImage2D(GL_TEXTURE_2D, mip, internalFormat, mipW, mipH, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
}
float borderColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
// FBO
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, drawBuffers);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
std::cerr << "Error";
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
1
u/cybereality 1d ago
He revisado el código brevemente. Debes asegurarte de reservar suficiente espacio para todos los niveles de mipmap. El primer bucle parece correcto, pero una forma sencilla de hacerlo es crear la textura y llamar a "glGenerateMipmap", que realiza esta tarea automáticamente.
Por otro lado, parece que solo estás realizando una llamada de dibujo al final. Por tanto, necesitarás un bucle que procese específicamente cada nivel de mipmap y dibuje utilizando los parámetros adecuados (es decir, el tamaño o el *viewport* de ese nivel). No obstante, a menos que requieras un manejo personalizado de los niveles (por ejemplo, para algoritmos como *blur* o *bloom*), suele ser más sencillo dibujar simplemente en el nivel base 0 y llamar a "glGenerateMipmap".
2
u/waramped 1d ago
The last parameter of glFramebuffer...() is the mip level you are writing to, it's just 0 here so that makes sense why you don't see anything in other mips. If you've tried other values for that, then how are you validating that it isn't working?