previous:
[工作记录] Android OpenGL ES 2.0: square texture not supported on some device
recently I found that it is the mipmap of a non-square texture that cause the black texture problem:
http://*.com/questions/5052762/using-mipmaps-results-in-garbage-textures
the texture resource data(on disk) already have mipmap chains generated,
but some textures don't have full mipmap chain down to 1x1. i.e. some only have 4/3 levels by configuration.
i.e. some scalable UI texture only have top 4 or 3 levels on purpose.
and also, we stop update mipmap on nx1 or 1xn at runtime.
this is okay on most graphics devices(PC DX9/XBOX/PS3 etc.)
but the major problem is that OpenGL ES 2.0 standard lacks of definition of behavior on non-square texture mipmaps(implemention defined behavior). so the GPU/drivers are free to do what they want,
for this case, they just consider a texture "in-complete" if it does not have full mipmap chain(down to 1x1). So to the shader, it is just like an empty sampler bound to no textures. that's the reason of black textures.
Based on test results, this problem never happens on GLES3.0 API/devices, but happens on some GLES2.0 devices, and some devices with GLES3.0 capable hardware with 2.0 system runtime API.