2

2の累乗ではないblender(テクスチャを参照する1つのobjと1つのmtlファイル)によって作成された多くの(113)テクスチャイメージがあります。単一のテクスチャ(2の累乗)で単純なオブジェクトをレンダリングしようとすると、正常に動作しますが、上で説明した複雑なオブジェクトの場合、ジオメトリのみを描画します(すべてが白でテクスチャはありません)。

これは私のテクスチャの寸法によるものですか?はいの場合、実行時に多くのテクスチャ/ビットマップを2の累乗にするためのソリューションはありますか?(寸法はわかりません。)

また、が正しく使用されているかどうかも疑問ですglbindtexture(私はAndroidで作業しています)。最初に、を呼び出しますglgentextures(<number_of_objects>, textureArray)。次に、すべてのオブジェクトのループで、glbindtexture(..._2D, textureArray[i])とGLutils.texImage2D(...)を呼び出します。最後に、お絵かきの時間に、電話glbindtexture(..., textureArray[i])してからgldrawarrays

何か問題はありますか?(編集済み)私はopengl es 1.1を使用していて、opengles1.1がNPOTtextruesをサポートしていないことをどこかで読みました。

前もって感謝します。

4

2 に答える 2

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つのテクスチャのパワー以外を使用できない場合があります。このコードは、それらを^ 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

于 2012-12-06T08:06:17.347 に答える
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);
于 2012-12-06T08:08:24.447 に答える