Как загрузить файл Multi-texture .obj в GLES в android - PullRequest
1 голос
/ 26 мая 2020

У меня есть файлы 3D obj в android. Я искал и нашел много форумов, и теперь я могу успешно загружать файлы obj + mtl. но у меня проблема с этими файлами obj и mtl, имеющими много файлов текстур. в некоторых случаях в mtl каждая грань имеет текстуру (.png). как загрузить этот тип файлов obj в GLES? можно ли загрузить мульти-текстурный объект в android opegl Gles? У меня есть библиотеки min3d, 3dmodelviewer и arjpct, но они бесполезны. пожалуйста, помогите, если возможно загрузить объект с несколькими текстурами в GLES

для multi_texture, я сделал вот так

 mTextureHandle = setTexture(obj, textureId,GLES20.GL_TEXTURE1);
        ByteArrayInputStream textureIs0 = new ByteArrayInputStream(obj.getTextureData().get(0));
        int textureId0 = GLUtil.loadTexture(textureIs0);
        mTextureHandle = setTexture(obj, textureId0, GLES20.GL_TEXTURE0);
        ByteArrayInputStream textureIs2 = new ByteArrayInputStream(obj.getTextureData().get(2));
        int textureId2 = GLUtil.loadTexture(textureIs2);
        mTextureHandle = setTexture(obj, textureId2, GLES20.GL_TEXTURE2);
        ByteArrayInputStream textureIs3 = new ByteArrayInputStream(obj.getTextureData().get(3));
        int textureId3 = GLUtil.loadTexture(textureIs3);
        mTextureHandle = setTexture(obj, textureId3, GLES20.GL_TEXTURE3);
        ByteArrayInputStream textureIs4 = new ByteArrayInputStream(obj.getTextureData().get(4));
        int textureId4 = GLUtil.loadTexture(textureIs4);
        mTextureHandle = setTexture(obj, textureId2, GLES20.GL_TEXTURE4);
        ByteArrayInputStream textureIs5 = new ByteArrayInputStream(obj.getTextureData().get(5));
        int textureId5 = GLUtil.loadTexture(textureIs5);
        mTextureHandle = setTexture(obj, textureId5, GLES20.GL_TEXTURE5);
        ByteArrayInputStream textureIs6 = new ByteArrayInputStream(obj.getTextureData().get(6));
        int textureId6 = GLUtil.loadTexture(textureIs6);
        mTextureHandle = setTexture(obj, textureId6, GLES20.GL_TEXTURE6);
        ByteArrayInputStream textureIs7 = new ByteArrayInputStream(obj.getTextureData().get(7));
        int textureId7 = GLUtil.loadTexture(textureIs7);
        mTextureHandle = setTexture(obj, textureId7, GLES20.GL_TEXTURE7);
        ByteArrayInputStream textureIs8 = new ByteArrayInputStream(obj.getTextureData().get(8));
        int textureId8 = GLUtil.loadTexture(textureIs8);
        mTextureHandle = setTexture(obj, textureId8, GLES20.GL_TEXTURE8);
        ByteArrayInputStream textureIs9 = new ByteArrayInputStream(obj.getTextureData().get(9));
        int textureId9 = GLUtil.loadTexture(textureIs9);
        mTextureHandle = setTexture(obj, textureId9, GLES20.GL_TEXTURE9);
public static int loadTexture(final InputStream is) {
        Log.v("GLUtil", "Loading texture from stream...");

        final int[] textureHandle = new int[1];

        GLES20.glGenTextures(1, textureHandle, 0);
        GLUtil.checkGlError("glGenTextures");
        if (textureHandle[0] == 0) {
            throw new RuntimeException("Error loading texture.");
        }

        Log.v("GLUtil", "Handler: " + textureHandle[0]);

        final BitmapFactory.Options options = new BitmapFactory.Options();
        // By default, Android applies pre-scaling to bitmaps depending on the resolution of your device and which
        // resource folder you placed the image in. We don’t want Android to scale our bitmap at all, so to be sure,
        // we set inScaled to false.
        options.inScaled = false;

        // Read in the resource
        final Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
        if (bitmap == null) {
            throw new RuntimeException("couldnt load bitmap");
        }

        // Bind to the texture in OpenGL
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
        GLUtil.checkGlError("glBindTexture");
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        GLUtil.checkGlError("texImage2D");
        bitmap.recycle();
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

        Log.v("GLUtil", "Loaded texture ok");
        return textureHandle[0];
    }
...