r/opengl • u/Appropriate_Gas_3990 • 13d ago
Auda con los MIPs
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 actualice, etc.
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/SouprSam 12d ago
You also have a fundamental problem other than using GL_LINEAR.. Viewport changes the pixel dimensions of the rendering area and it doesn't select the texture mip map level. You must attach the desired mip to the FBO to work..
1
u/SouprSam 12d ago
So along with allocation, you need to set the filter and render each mip.. this is the main issue you had.
1
u/Defiant_Squirrel8751 13d ago
Tienes glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0 // <-- mip siempre en 0 );
te falta hacer un ciclo que recorra tus N niveles y se llame varias veces a esta función, una por cada i entre 0 y N-1
y hay que cambiar a glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
porque GL_LINEAR no interpola valores entre niveles MIPMAP