В OpenGL, как проще всего создать перспективное представление, используя только методы OpenGL3 +? - PullRequest
2 голосов
/ 17 августа 2010

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

У меня есть приложение SDL + GLEW, которое рисует примитив.Я хотел сделать несколько видовых экранов в разных ракурсах.Я вижу четыре окна просмотра, но не могу изменить перспективы.

Предположим, у вас есть

draw();
swapbuffers();

Какой самый простой способ - в спецификации OpenGL3 + - создать окно перспективы (илив идеале несколько)?

Ответы [ 3 ]

4 голосов
/ 18 августа 2010

Вот код GLSL 1.50 для того же действия, что и для gluPerspective. Вы можете легко преобразовать его на свой язык и загрузить вместо него через glUniformMatrix4fv.

mat4 CreatePerspectiveMatrix(in float fov, in float aspect,
    in float near, in float far)
{
    mat4 m = mat4(0.0);

    float angle = (fov / 180.0f) * PI;
    float f = 1.0f / tan( angle * 0.5f );

    /* Note, matrices are accessed like 2D arrays in C.
       They are column major, i.e m[y][x] */

    m[0][0] = f / aspect;
    m[1][1] = f;
    m[2][2] = (far + near) / (near - far);
    m[2][3] = -1.0f;
    m[3][2] = (2.0f * far*near) / (near - far);

    return m;
}

Тогда вы делаете:

mat4 worldMatrix = CreateSomeWorldMatrix();
mat4 clipMatrix = CreatePerspectiveMatrix(90.0, 4.0/3.0, 1.0, 128.0);

gl_Position = worldMatrix * clipMatrix * myvertex;
some_varying1 = worldMatrix * myvertex; 
some_varying2 = worldMatrix * vec4(mynormal.xyz, 0.0);
3 голосов
/ 17 августа 2010

Самый простой это единственный способ. Вычислите себе (с некоторой библиотекой lib, простой математикой и т. Д.) Матрицу проекции и загрузите ее в форму в своем вершинном шейдере и выполните там преобразование.

2 голосов
/ 17 августа 2010

Для матрицы перспективы: gluPerspective, затем glGetFLoatv(GL_PROJECTION_MATRIX, ...), затем glUniform или glUniformMatrix4fv

Для областей просмотра: glViewport и glScissor.Или используйте объект framebuffer, выполните рендеринг в текстуру, а затем визуализируйте текстуру.

PS Если вы не хотите использовать устаревшие функции, возьмите формулу матрицы из документации gluPerspective , рассчитайте матрицу самостоятельно, а затем используйтеglUniformMatrix4fv.Или работать в профиле совместимости.

...