вариант glFrustrum в Opengl ES 2.0 - как исправить пустой экран? - PullRequest
0 голосов
/ 13 марта 2012

Ну, вопрос, похожий на мой предыдущий, касается варианта glOrtho
glOrtho OpenGL es 2.0, как исправить пустой экран?

Треугольник ниже идеально нарисован в ортопроекции(без проекции это сжатый треугольник вместо треугольника с тремя равными сторонами в области просмотра прямоугольника)

GLfloat triangle_vertices[] =
                 {
                -0.5, -0.25, 0.0,
                 0.5, -0.25, 0.0,
                 0.0, 0.559016994, 0.0
                 };

Код матрицы орто:

typedef float[16] matrix;

void ortho_matrix(float right, float left, float bottom, float top, float near, float far, matrix result)
  {
// First Column
    result[0] = 2.0 / (right - left);
    result[1] = 0.0;
    result[2] = 0.0;
    result[3] = 0.0;

// Second Column
    result[4] = 0.0;
    result[5] = 2.0 / (top - bottom);
    result[6] = 0.0;
    result[7] = 0.0;

// Third Column
   result[8] = 0.0;
   result[9] = 0.0;
   result[10] = -2.0 / (far - near);
   result[11] = 0.0;

// Fourth Column
    result[12] = -(right + left) / (right - left);
    result[13] = -(top + bottom) / (top - bottom);
    result[14] = -(far + near) / (far - near);
    result[15] = 1;
  }

Установка моей матрицы проекции на орто, где aspect_ratio =screen_width / screen_heigth

  ortho_matrix(-aspect_ratio, aspect_ratio, -1.0, 1.0, -1.0, 1.0, PROJECTION_MATRIX);

Задача состоит в том, чтобы изменить орто-проекцию на перспективу, поэтому я пишу функцию для этого
UPD: изменено на col-major

void frustum_matrix(float right, float left, float bottom, float top, float near, float far, matrix result)
{
        // First Column
    result[0] = 2 * near / (right - left);
    result[1] = 0.0;
    result[2] = 0.0;
    result[3] = 0.0;

    // Second Column
    result[4] = 0.0;
    result[5] = 2 * near / (top - bottom);
    result[6] = 0.0;
    result[7] = 0.0;

    // Third Column
    result[8] = (right + left) / (right - left);
    result[9] = (top + bottom) / (top - bottom);
    result[10] = -(far + near) / (far - near);
    result[11] = -1;

    // Fourth Column
    result[12] = 0.0;
    result[13] = 0.0;
    result[14] = -(2 * far * near) / (far - near);
    result[15] = 0.0;
 }

Установка моей проекции на матрицу усеченного конуса, где aspect_ratio = screen_width / screen_heigth

  frustum_matrix(-aspect_ratio, aspect_ratio, -1.0, 1.0, 0.1, 1.0, PROJECTION_MATRIX);

Хорошо, я смотрю матрицу на странице glFrustrum http://www.opengl.org/sdk/docs/man/xhtml/glFrustum.xml,, но матрица для орто-функции взята изтот же источник и работает отлично.Во всяком случае, я вижу похожую матрицу усеченного в разных местах, например https://stackoverflow.com/a/5812983/1039175 функция усеченного.

Все, что я получил, это пустой экран, окно просмотра и другие вещи, связанные с прорисовкой, установлены правильно.

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Похоже, что ваши матричные индексы транспонированы со страницы документации glFrustum.Вы транспонируете матрицу перед ее загрузкой?OpenGL обычно ссылается на векторные матрицы столбцов, поэтому, если вы копируете уравнения из glFrustum, индексы должны выглядеть следующим образом:

[0]  [4]  [ 8]  [12]
[1]  [5]  [ 9]  [13]
[2]  [6]  [10]  [14] 
[3]  [7]  [11]  [15]
2 голосов
/ 14 марта 2012

Я должен признать, что мне лень читать ваш код, но ... при условии, что ваш чистый цвет установлен на белый, возможно, вы не установили область просмотра:

Makeубедитесь, что вы называете это по крайней мере один раз перед рендерингом:

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
GLsizei width = viewport[2];
GLsizei height = viewport[3];
glViewport(0, 0, width, height);

Что касается некоторых общих советов: не пытайтесь изобретать велосипед заново, переписывая матричный код (если, возможно, не для каких-то академических целей).Если вы подумываете о переходе на c ++, стоит проверить библиотеку glm: http://glm.g -truc.net /

В ней есть замены именно тех функций матрицы, которые вы пытаетесь реализовать, а затем некоторые... Я использую его сам, и это фантастическая математическая библиотека для работы, так как она специально предназначена для opengl-es 2.0 и glsl.

...