2010-08-17 1 views
2

Сначала это может показаться ленивым, но я исследовал его в течение 2 дней.В OpenGL, какой самый простой способ создать перспективный вид, используя только методы OpenGL3 +?

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

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

draw(); 
swapbuffers(); 

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

ответ

3

Простейшим является единственный способ. Вычислите себя (с помощью некоторой библиотеки lib, plain math и т. Д.) Матрицу проецирования и загрузите ее в форму в шейдере вершин и выполните преобразование там.

+0

неохотой принял, так как я предполагал, более подробный ответ; но технически правильно. –

+3

@Lela Вы могли бы запросить более подробный ответ, я предоставит его позже. –

+0

Мне это не нужно срочно, но это может помочь сайту, я думаю. –

2

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

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

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

+4

Просто голова. Использование gluPerspective предполагает использование стека матриц, который устарел. Контекст вопроса состоял в том, чтобы избежать использования устаревших функций. Лучше вычислить значения матрицы вручную, а затем использовать glUniformMatrix4fv – 2010-08-18 12:11:39

+1

@Mads Elvheim: «который устарел», поэтому они устарели матричный стек, но не предоставили замену математическим функциям? Отлично. – SigTerm

+3

@SigTerm: Нет, зачем им это нужно? Это стало причиной удаления функций в первую очередь. Это несколько строк кода. OpenGL представляет собой низкоуровневую библиотеку для рендеринга. Любая нетривиальная программа, которая использует OpenGL, скорее всего, имеет свои собственные функции или классы для линейной алгебры. OpenGL никогда не собирался быть библиотекой утилиты. Он должен был быть быстрым (для графики). OpenGL 3.1 и более поздние версии исправили это. – 2010-08-18 13:15:26

4

Вот код 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);