Никогда не становился полным 480*800 при использовании 2D ортогональной проекции в opengl-es

Я делаю немного эксперимента с OpenGL ES на Nexus One. Получил проблему о полноэкранном разрешении. Кажется, что я никогда не могу получать реальное полное разрешение Nexus One, который является 480*800. Я использую ортогональную проекцию и просто хочу потянуть простой треугольник с матрицей представления модели идентификационных данных:

@Override
 public void sizeChanged(GL10 gl, int width, int height) {
      /*
       * Set our projection matrix. This doesn't have to be done
       * each time we draw, but usually a new projection needs to
       * be set when the viewport is resized.
       */         
      gl.glViewport( 0, 0, width, height);

      gl.glMatrixMode(GL10.GL_PROJECTION);
      gl.glLoadIdentity();          
      GLU.gluOrtho2D(gl, 0, width, 0, height);                         
 } 

Координаты для треугольника:

float[] coords = {
            // X, Y, Z
            0.0f, 0.0f, 0,
            200.0f, 200.0f, 0,
            100.0f, 0.0f, 0,
    }; 

И я получаю результат ниже:

сопроводительный текст http://www.anddev.org/files/device_184.png

Этот результат - то же на эмуляторе (480*800 res) и Nexus 1. Очевидно, я не получил полное разрешение (потому что главная вершина треугольника уже близко к правому краю, если ширина реальна 480, это должно быть слева от полуширины). Другая странность - то, что в sizeChanged (я использую GLSurfaceView, это - переопределенный метод в рендерере, требуемом GLSurfaceView), я всегда получаю ширину = 480 и высота = 800, неважно, начинаю ли я приложение в полноэкранном режиме. Я ожидал, что со строкой заголовка приложения и строкой состояния, размер, переданный sizeChanged, должен быть меньшим правом? Я имею в виду, не является ли размер, переданный этому методу, реальным размером, я добираюсь, затем как я могу установить корректную область просмотра?

Я также сделал быструю реализацию с помощью ИЗБЫТКА в Windows с той же установкой и тяну тот же самый треугольник. Я получаю результат ниже, который является ожидаемым результатом. Кто-либо может помочь мне выяснить, как получить этот тот же результат по телефону?

сопроводительный текст http://www.anddev.org/files/glut_on_win_137.png

Я уже поместил


тег в AndroidManifest.xml. В частности, я нашел, что это походит только android:anyDensity = "верный" |” ложные” вопросы, поскольку это действительно изменяет представленный результат. Другие не изменяют результат вообще. Также мой проект находится на SDK 1.6, который рекомендуется для разработки приложений, которые поддерживают больший телефонный экран.

Исходный вопрос также задают здесь: http://www.anddev.org/viewtopic.php?p=34832#34832

5
задан Echo Lu 3 February 2010 в 21:37
поделиться

4 ответа

Я знаю, что был поток OpenGL, покрывающий разницы между 16., 2. 0 и т.д. с деталями из этих dev-игр и т.д. Вам придется искать в Google на главной странице google, т.к. список dev-поиска Google отстой

Я бы также проверил баг db, т.к. все, кто находит OpenGl баг-тедны, чтобы поместить work aorudns в сообщения об ошибках, включая меня

Другие места, чтобы проверить баг db проекта alien3d на googlecode его 3d android игрового движка, может быть, они столкнулись с ним?

.
0
ответ дан 14 December 2019 в 13:35
поделиться

Одно дело проверить, что атрибут android:minSdkVersion элемента use-sdk в вашем манифесте равен 4 или больше. Наличие атрибута android:targetSdkVersion на этом элементе с 4 или более будет также работать.

Ваш вопрос говорит о том, что ваш проект - это Android 1.6, который имеет API уровень 4. Впрочем, возможно, чтобы целью сборки был Android 1.6, но при этом в элементе use-sdk были указаны более старые уровни API. Это часто происходит, когда кто-то начинает с проекта Android 1.5 и меняет цель сборки. Eclipse не обновляет манифест при изменении цели сборки.

1
ответ дан 14 December 2019 в 13:35
поделиться

Спасибо за все ваши ответы, они мне очень помогли . Мне было очень неловко рассказывать вам настоящую причину этой проблемы, которую я решил только что. Класс треугольника, который я скопировал из одного из образцов, фактически масштабируется по координатам, которые вы определяете в массиве позиций, в два раза! Я просто изменил координаты в массиве и не заметил, когда они загружаются в буфер вершин, они масштабируются!

Я виноват ... Но давайте просто будем осторожны с чем-то скопированным, поскольку вы уверены, что он делает что-то так, как вы ожидали, но это не так, это класс треугольника, код которого я скопировал из http: / /code.google.com/p/apps-for-android/source/browse/trunk/Samples/OpenGLES/Triangle/src/com/google/android/opengles/triangle/TriangleRenderer.java и обратите внимание, что на строка номер 215, позиции масштабируются на 2! Действительно зло как образец…

Кроме того, при использовании GLSurfaceView используйте android.opengl.GLSurfaceView вместо GLSurfaceView.java в папке с образцом sdk_root \ platform \ android-1.1 \ samples \ ApiDemos \ src \ com \ example \ android \ apis \ graphics. Поскольку последняя является ранней версией и имеет несколько странное поведение.

4
ответ дан 14 December 2019 в 13:35
поделиться

При работе с SDK версии 3 ваше приложение будет работать в «режиме совместимости»

Оно будет использовать стандартный 320x480 | Разрешение 480x320

Вот как я получаю некоторую информацию об отображении:

// we get some display information 
    display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    scrPixelFormat = display.getPixelFormat();
    scrWidth = display.getWidth(); 
    scrHeight = display.getHeight();
    scrRefreshRate = display.getRefreshRate();

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

{{1 }}
1
ответ дан 14 December 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: