Вопрос о работе видового экрана и параллельной проекции - PullRequest
1 голос
/ 17 сентября 2011

Я создал треугольник (в Android), и ниже приведена спецификация размера вершин, размера области просмотра и размера параллельной проекции.

vertices.put(new float[] {  0.0f, 0.0f,
                            319.0f, 0.0f,
                    160.0f, 479.0f }); 

gl10.glViewport(0, 0, 160, 480);
gl10.glOrthof(0, 160, 0, 480, 1, -1);

Фактическое разрешение экрана составляет 320 * 480,см .:

  • glsurfaceview.getWidth () = 320
  • glsurfaceview.getHeight () = 480

Ниже приведен снимок полученного мной результатав эмуляторе ACTUAL RESULT

Что я не понимаю, так это то, что я установил область просмотра только на половину экрана, и я ожидал увидеть только половину треугольника (поверьте, все, что превышает область области просмотрадолжны быть обрезаны).Ниже приводится картина, которую я ожидал,

Expected result

Я просто не мог понять причину такого поведения.Может ли кто-нибудь помочь мне в этом.

Ниже приведен фактический код, над которым я работаю,

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    rand = new Random(); //Random number generator

    glsurfaceview = new GLSurfaceView(this);

    glsurfaceview.setRenderer(this);

    setContentView(glsurfaceview);
}



@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {
    Log.v("#MYAPP", "MyCanonActivity : Inside onSurfaceCreated");

    byteBuffer = ByteBuffer.allocateDirect(3 * 2 * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    vertices = byteBuffer.asFloatBuffer();
    vertices.put(new float[] {  0.0f, 0.0f,
                                319.0f, 0.0f,
                                160.0f, 479.0f });  

    vertices.flip();  


}

@Override
public void onDrawFrame(GL10 gl10) {

    gl10.glViewport(0, 0, 160, 480);
    gl10.glClearColor(0,0,0,1);
    gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);

    gl10.glMatrixMode(GL10.GL_PROJECTION);
    gl10.glLoadIdentity();
    gl10.glOrthof(0, 160, 0, 480, 1, -1);
    gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl10.glVertexPointer( 2, GL10.GL_FLOAT, 0, vertices);
    gl10.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}

 @Override
public void onSurfaceChanged(GL10 gl10, int width, int height) {
    Log.v("#MYAPP", "MyCanonActivity : Inside onSurfaceChanged");
}


@Override 
public void onResume() {
    super.onResume();
    glsurfaceview.onResume(); //Start rendering thread also
    Log.v("#MYAPP", "MyCanonActivity : onResume");


}

@Override
public void onPause() {
    super.onPause();
    glsurfaceview.onPause(); 
    Log.v("#MYAPP", "MyCanonActivity : onPause");
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

На самом деле ваши предположения верны, и ваша картинка должна действительно выглядеть как вторая, учитывая ваш фрагмент кода. Возможно, вы не очистили кадровый буфер (который все еще имеет полный размер) после рисования полноразмерного треугольника, поэтому ваш рендеринг фактически содержит весь треугольник из предыдущего прохода и половину, отрисованную поверх него.

И, между прочим, я надеюсь, что вы выполнили вызов glOrtho для правильного стека матриц (проекция) и не испортили стеки матриц, хотя это может дать совершенно другие результаты.

0 голосов
/ 18 сентября 2011

Хотя я не могу найти определение «области просмотра» в терминах компьютерной графики, я могу предложить это объяснение.

Область просмотра действительно ограничивает область просмотра.Вообразите, если хотите, вы находитесь внутри лодки, глядя из одного из ее иллюминаторов.Ваш взгляд на то, что находится за пределами лодки, ограничен размером отверстия порта, или, другими словами, ваш взгляд на гораздо больший внешний мир «обрезается» отверстием порта.Порт представления с точки зрения компьютерной графики работает так же, за исключением того, что область просмотра является гибкой, то есть вы можете легко ее изменить.

Таким образом, вырезание, которое вы описали выше, как и следовало ожидать, не заставляет треугольник рисоваться так, чтобы он помещался в окне просмотра.Если вы ДЕЙСТВИТЕЛЬНО хотели, чтобы треугольник был полностью прорисован внутри области просмотра, то вы должны преобразовать координаты вершин в область просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...