I have an OpenGL mipmap texture that is complete. By that, I mean all mipmap levels have been properly loaded with glCompressedTexImage2DARB. Now, I can set the texture to use only the mipmap level starting at level 1 with this function:
This is working fine with my geforce 8800. However, with my Radeon HD 4670 I get a black polygon instead of a polygon textured with mipmap level 1. I have been looking for why my radeon behave this way. I wonder if someone has seen a similar problem and maybe knows about a solution.
In my case I am not using automatic mipmap generation. I set every mipmap manually one after the other. If i decide not to fill up mipmap 0 and fill up all the other mips, then setting GL_TEXTURE_BASE_LEVEL to 1 works. I can see mipmap 1 on my polygon. This proves that mipmap 1 is well loaded in the texture. I can check all the other mipmap the same way.
I have to add that I am not using trilinear filtering and my texture sampling mode is set to GL_NEAREST.
I still don’t understand why then It does not work when all mipmaps have been loaded and I use GL_TEXTURE_BASE_LEVEL to offset the first mip level.
This is maybe a driver bug. For example, on intel graphic card, when loading mipmap level manually I have to do it for all levels even if I know that the last ones won’t be used. Otherwise I got a white uniform color whereas it works fine on nvidia hardware. I know that my example is not a good practice, this was just to illustrate
If this is a driver bug it is really unfortunate! I have everything working on nvidia and I wasn’t expecting mip-mapping to be a problem on radeon… I will keep investigating to see if there is a workaround.
Thanks
Jay
I have some new findings. I made a simple program to move a textured front facing quad along the z axis so I can see the transition in mipmap level has they occur (Min filter set to LINEAR_MIPMAP_LINEAR).
My texture is a 256x256 DXT1, and all the levels are filled up with data. In addition, I made sure to put distinctive colors in the levels so I can really the mips. I am using glCompressedTexImage2DARB and the texture data comes from a pixel buffer object (glBufferData…).
With my Radeon 4670, I noticed that the first level of the texture is loaded and appears fine. But I get black in all the other levels. I can see the fist mip blend into black as my quad moves away.
It was when I decided to load the textures mip levels without using the PBO that I started getting something. All the mip levels loaded fine and I could see them transition on my quad as I move it.
Going to my original post, now changing the value for GL_TEXTURE_BASE_LEVEL works fine on my Radeon.
So it seems my problem was with the pixel buffer object. The first mip level loads fine but all the other don’t. However, I know that it works fine on my geforce.
I wonder if there is something special about loading textures through pbo on radeon…
Not using PBOs, but was able to reproduce the bug.
Setting TEXTURE_BASE_LEVEL without also setting TEXTURE_MAX_LEVEL seems to result in sampling from the last level, regardless of default implementation values. And sampling from certain narrow ranges of levels, say [L, L + 1], can result in a crash. However if sampling is confined to exactly 1 level (BASE==MAX) things appear to be in working order.
This with all levels of a 1024x1024 2D DXT1 texture specified with glCompressedTexImage2D.