gpt4 book ai didi

opengl-es - opengl使许多纹理成为2的幂

转载 作者:行者123 更新时间:2023-12-02 22:20:47 26 4
gpt4 key购买 nike

我有许多 (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。

提前致谢。

最佳答案

运行此方法检查 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

}

查看此类以获取更多信息:https://github.com/TraxNet/ShadingZen/blob/master/library/src/main/java/org/traxnet/shadingzen/core/BitmapTexture.java

关于opengl-es - opengl使许多纹理成为2的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com