Кадры кажутся не в порядке на Android с OpenGL-ES, JNI и C ++ - PullRequest
0 голосов
/ 01 марта 2012

Я создал приложение для Android, в котором я рендерил все с OpenGL-ES 2.0 и C ++ поверх JNI, и все это отлично работает, за исключением одной вещи.Кажется, что рендер-буферы как-то вышли из строя, и изображение выглядит, словно в тени.Что-то вроде размытия в движении, и я не знаю, что вызвало это.

Я создаю Activity только с GLSurfaceView, у которого есть класс Renderer, в котором используются вызовы рендеринга для рисования.Что может быть причиной такого странного поведения?

Java-код (за исключением некоторых не относящихся к делу вещей), который создает все вещи, выглядит следующим образом:

public class Main extends Activity  
{   static  MainLoop    mloop   = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {   super.onCreate(savedInstanceState);
        mloop = new MainLoop()
        setContentView(mloop);
    }
    .
    .
    .
}

Java-код, который визуализируется, выглядит следующим образом (сноваминус некоторые несущественные вещи):

public class MainLoop extends GLSurfaceView
{   .
    .
    public MainLoop()
    {   super(parent);
        setEGLContextClientVersion(2);
        setEGLConfigChooser(8, 8, 8, 8, 0, 0)
        //
        this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
        //
        setRenderer(new Renderer());        
    }
    .
    .

    private static class Renderer implements GLSurfaceView.Renderer 
    {   public void onDrawFrame(GL10 gl)
        {   JNIRender();
        }
        public void onSurfaceChanged(GL10 gl, int width, int height)
        {   JNIChanged();   
        }
        public void onSurfaceCreated(GL10 gl, EGLConfig config)
        {   JNICreate();
        }
    }
}

Весь рендеринг выполняется с помощью вызова JNIRender в C ++ и выглядит нормально, за исключением вещи, вышедшей из строя, где все выглядит так, как будто она отстает от тени.Есть ли что-то, что я должен принять во внимание или что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Просто дикое предположение, но вы очищаете буферы, прежде чем что-то рисовать?

В вашем коде c ++ используйте это перед тем, как что-либо рисовать:

glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BIT);
0 голосов
/ 08 марта 2012

Я проверил и обнаружил, что у меня есть команда swapbuffer в моем коде c ++, что плохо при использовании в java, потому что буфер все равно отображается автоматически, и это путает вещи.

Я заключил команду swapbuffer в ifdef, который никогда не используется при компиляции с gcc.

...