使用UV贴图的OpenGL-ES纹理加载问题

时间:2011-08-07 19:43:12

标签: java android opengl-es textures

Hy我在openGL-ES纹理方面遇到了一些问题。我在3ds max中创建了一个modell并使用了UV贴图,因为你可以看到here(第1张图片)有我的UV贴图。 没有UV贴图,我的纹理加载是“完美的”,但是使用UV贴图......(第2张图片here),请看转向架。

我从obj文件加载这个modell(转向架),我的代码或obj没有任何问题,因为它使用简单的纹理,也许我的loadtexture方法很糟糕,请检查它,或者做你有什么想法? 谢谢你的回答,我没有想法。

Loadtexture代码:

private int[] textures = new int[3];
    public void loadtexture(GL10 gl, Context mContext, String map_source) {
            try {
                InputStream is = mContext.getAssets().open(map_source);
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                is.close();
                gl.glGenTextures(3, textures, 0);

                gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                        GL10.GL_NEAREST);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                        GL10.GL_NEAREST);
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);


                gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[1]);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                        GL10.GL_LINEAR);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                        GL10.GL_LINEAR);
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

                gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[2]);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                        GL10.GL_LINEAR);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                        GL10.GL_LINEAR_MIPMAP_NEAREST);
                if (gl instanceof GL11) {
                    gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP,
                            GL11.GL_TRUE);
                    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
                } else {
                    buildMipmap(gl, bitmap);
                }
                bitmap.recycle();
            } catch (IOException e) {
                // Should never happen
            }
        }

        private void buildMipmap(GL10 gl, Bitmap bitmap) {
            //
            int level = 0;
            //
            int height = bitmap.getHeight();
            int width = bitmap.getWidth();

            //
            while (height >= 1 || width >= 1) {

                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);

                //
                if (height == 1 || width == 1) {
                    break;
                }

                // Increase the mipmap level
                level++;

                //
                height /= 2;
                width /= 2;
                Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height,
                        true);

                // Clean up
                bitmap.recycle();
                bitmap = bitmap2;
            }
        }

P.S。抱歉我的英文。

1 个答案:

答案 0 :(得分:2)

private int[] textures = new int[3];
    public void loadtexture(GL10 gl, Context mContext, String map_source) {
            try {
InputStream is = mContext.getAssets().open(map_source);
            Bitmap bitmap2 = BitmapFactory.decodeStream(is);
            is.close();
            Matrix flip = new Matrix();
            flip.postScale(1f, -1f);
            Bitmap bitmap =  Bitmap.createBitmap(bitmap2, 0, 0, bitmap2.getWidth(), bitmap2.getHeight(), flip, true);
            bitmap2.recycle();
... (same like before)

所以我把它垂直翻转,因为在opengl中加载地图有点不同。我希望我能帮助那些陷入同样问题的人。