Как правильно загрузить и нарисовать текстуру в OpenGLES с Mono для Android - PullRequest
1 голос
/ 15 марта 2012

Недавно я портировал свой собственный движок 2D-рендеринга на Android, используя Mono для Android Все прошло хорошо, за исключением того, что я вообще не могу нарисовать текстуру, все текстуры выглядят пустыми.

Итак, я запустил новый чистый проект, чтобы протестировать его, и написал его в соответствии с примером кода для Java, но я обнаружил, что не могу нарисовать текстуру. Вот код, который я использовал для тестирования:

class GLView1 : AndroidGameView
{
    public GLView1(Context context)
        : base(context)
    {
        this.GLContextVersion = OpenTK.Graphics.GLContextVersion.Gles1_1;
    }

    // This gets called when the drawing surface is ready
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // Run the render loop
        Run();
    }

    bool initialized = false;
    int[] textureID = new int[1];
    // This gets called on each frame render
    protected override void OnRenderFrame(FrameEventArgs e)
    {
        base.OnRenderFrame(e);
        if (!initialized)
        {
            initialized = true;
            GL.Enable(All.Texture2D);
            GL.GenTextures(1, textureID);
            GL.ShadeModel(All.Smooth);
            GL.BindTexture(All.Texture2D, textureID[0]);

            Bitmap bitmap = BitmapFactory.DecodeResource(Resources, Resource.Drawable.Icon);
            Android.Opengl.GLUtils.TexImage2D(Android.Opengl.GLES10.GlTexture2d, 0, Android.Opengl.GLES10.GlRgba, bitmap, 0);
            bitmap.Recycle();

            GL.TexParameter(All.Texture2D, All.TextureMinFilter, (int)All.Nearest);
            GL.TexParameter(All.Texture2D, All.TextureMagFilter, (int)All.Linear);
        }
        GL.ClearColor(0.5f, 0.5f, 0.5f, 1.0f);
        GL.Clear((uint)All.ColorBufferBit);

        GL.BindTexture(All.Texture2D, textureID[0]);

        GL.EnableClientState(All.VertexArray);
        GL.EnableClientState(All.TextureCoordArray);
        GL.FrontFace(All.Cw);

        GL.VertexPointer(2, All.Float, 0, square_vertices);
        GL.TexCoordPointer(2, All.Float, 0, uv);

        GL.DrawArrays(All.TriangleStrip, 0, 4);

        SwapBuffers();
    }

    float[] uv ={
                    0,1,
                    0,0,
                    1,1,
                    1,0,
               };

    float[] square_vertices = {
        -0.5f, -0.5f,
        0.5f, -0.5f,
        -0.5f, 0.5f, 
        0.5f, 0.5f,
    };

    byte[] square_colors = {
        255, 255,   0, 255,
        0,   255, 255, 255,
        0,     0,    0,  0,
        255,   0,  255, 255,
    };
}

То, что я увидел на своем устройстве Android, это просто большой белый квадрат.

PS: я снова протестировал его с эмулятором Android, и кажется, что этот код работает в эмуляторе Android, но на моем реальном устройстве он все еще показывает большой белый квадрат.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 09 октября 2012

Это может быть проблема с BitmapFactory.decodeResource ().У меня возникла та же проблема, но когда я использую openRawResource (), чтобы открыть ресурс в виде потока, а затем использую BitmapFactory.decodeStream (), чтобы загрузить растровое изображение, тогда внезапно появляются текстуры.

Просмотр далее BitmapFactory.decodeResource (), кажется, масштабируется в зависимости от плотности пикселей целевого устройства.Посмотрите это: http://blog.poweredbytoast.com/loading-opengl-textures-in-android

Это приведет к тому, что все ваши аккуратные текстуры размера 2 будут смешного размера, которые аппаратное ускорение не распознает (эмулятор не заботится о неэнергетическихиз-2 размеров).Итак, используйте код по ссылке выше, скопированный здесь для вашего удобства:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inScaled = false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...