我有很多(113)纹理图像由blender(一个obj和一个mtl文件引用纹理)创建,它们不是2的力量。当我尝试渲染一个单一纹理的简单对象(2的幂)时,它的工作原理很好,但对于我上面描述的复杂对象,它只绘制几何图形(一切都是白色而没有纹理)。
这是因为我的纹理尺寸?如果是,是否有解决方案在运行时使许多纹理/位图功能为2? (我不知道尺寸。)
我也怀疑glbindtexture
是否正确使用(我在Android上工作。)
首先,我致电glgentextures(<number_of_objects>, textureArray)
。然后,在每个对象的循环中,我调用glbindtexture(..._2D, textureArray[i])
和GLutils.texImage2D(...)。最后,在抽奖时间内,我拨打glbindtexture(..., textureArray[i])
,然后拨打gldrawarrays
。
有什么问题吗? (编辑)我忘了说,我正在使用opengl es 1.1,我在某处读到opengl es 1.1不支持NPOT textrues。
提前致谢。
答案 0 :(得分:3)
运行此方法以检查OpenGL驱动程序状态错误:
public void checkGlError(String op) {
int error;
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
Log.e("ShadingZen", op + ": glError " + error);
//throw new RuntimeException(op + ": glError " + error);
}
}
根据您的测试设备,可能无法使用两种纹理的非功率。此代码向您展示如何将它们转换为^ 2尺寸(在android中):
int calculateUpperPowerOfTwo(int v)
{
v--;
v |= v >>> 1;
v |= v >>> 2;
v |= v >>> 4;
v |= v >>> 8;
v |= v >>> 16;
v++;
return v;
}
boolean isPowerOfTwo(int i){
return ( i & (i - 1)) == 0;
}
boolean loadAsTexture2D(Context context, String id, int resource_id, BitmapTexture.Parameters params){
_bmps = new Bitmap[1];
Matrix flip = new Matrix();
flip.postScale(1f, -1f);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inScaled = false;
Bitmap textureBmp = BitmapFactory.decodeResource(context.getResources(), resource_id, opts);
if(!isPowerOfTwo(textureBmp.getWidth()) || !isPowerOfTwo(textureBmp.getHeight())){
int target_width = calculateUpperPowerOfTwo(textureBmp.getWidth());
int target_height = calculateUpperPowerOfTwo(textureBmp.getHeight());
Log.i("ShadingZen", "Texture id=" + id + " has no power of two dimesions " + textureBmp.getWidth() + "x" + textureBmp.getHeight() + " adjusting to " + target_width + "x" + target_height);
Bitmap temp = Bitmap.createBitmap(textureBmp, 0, 0, textureBmp.getWidth(), textureBmp.getHeight(), flip, false);
_bmps[0] = Bitmap.createScaledBitmap(temp, target_width, target_height, false);
temp.recycle();
} else{
_bmps[0] = Bitmap.createBitmap(textureBmp, 0, 0, textureBmp.getWidth(), textureBmp.getHeight(), flip, false);
}
textureBmp.recycle();
// At this point _bmp[0] contains a ^2 bitmap
}
答案 1 :(得分:2)
当您生成纹理时,要使用2个纹理的非幂,您需要启用这些参数
glGenTextures(1, &nID);
glBindTexture(GL_TEXTURE_2D, nID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //should probably use these
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //these let you use NPOT textures
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);