Я пишу свое первое 2D-приложение для Android с использованием OpenGL.Я пишу это на своем Desire, поэтому мои экранные координаты должны быть от 0,0 до 799 479 в альбомном режиме.Я пытаюсь заставить OpenGL использовать этот диапазон в мировых координатах.
Приложение, такое как оно, до сих пор работает нормально, но мне пришлось настроить цифры, чтобы на экране появилось что-то, и я разочарован неспособностью понять взаимосвязь междуматрица проекции и рендеринг текстур в этом отношении.
Установка матрицы проекции:
gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
float size = .01f * (float) Math.tan(Math.toRadians(45.0) / 2);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-size, size, -size / ratio, size / ratio, 0.01f, 100.0f);
// GLU.gluOrtho2D(gl, 0,width, 0, height);
Я хочу понять, 0,01f и 100,0f здесь.Что я использую для описания 2D-мира 0,0 -> 799 479 с нулевым значением az?
Кроме того, я не уверен, что «лучше» - используя glFrustumF или GLU.gluOrtho2D. Последний имеетболее простые параметры - только размеры области просмотра - но я не получил ничего с этим.(Некоторые сайты имеют высоту и 0, но это не имеет значения.) Но разве это не должно быть естественным выбором для 2D-использования OpenGL?Нужно ли что-то указывать в OpenGL: «Я делаю это в 2D - пожалуйста, игнорируйте третье измерение везде, в интересах скорости»?
Рисование моих текстур:
Я рисую вещи, используя 2 текстурированных треугольника.Соответствующие части моего init (дайте мне знать, если мне нужно отредактировать свой вопрос с более подробной информацией):
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatex(nXpos, nYpos, nZoomin);
gl.glRotatef(nRotZ, 0, 0, 1);
gl.glScalef((float)nScaleup,(float)nScaleup, 0.0f);
...
...
gl.glVertexPointer(2, GL10.GL_FIXED, 0, mVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
mVertexBuffer is an IntBuffer and contains:
int vertices[] =
{
-1, -1,
1, -1,
-1, 1,
1, 1
};
Я не собираюсь, в конечном счете, переходить в nZoomin - ясделал это так, потому что именно так я нашел «магические числа», необходимые для того, чтобы что-то увидеть!В настоящее время мне нужно использовать -1000 там, с меньшими числами, получая меньшие изображенияПравильно ли я думаю, что должен быть какой-то способ иметь нулевое значение для nZoomin, когда матрица проекции установлена правильно?
Мои текстуры в настоящее время имеют размер 128x128 (но могут иметь разные размеры, хотя, возможно, всегда квадратные).У меня нет возможности узнать, когда они отображаются в реальном размере в настоящее время.Я хотел бы иметь возможность передать значение, скажем, 128 для nScaleup, чтобы оно отображалось в реальном размере.Это связано с матрицей проекции или у меня есть две отдельные проблемы?