Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Deferred Shading.

Сообщений 1 страница 15 из 15

1

Доброго времени суток 8)
В примере Deferred Shading, используется функция - getPlanePolyForZ(), Мог бы кто нибудь, обьяснить более подробно как она работает? Потому что мне надо написать такую же, только ориентированную на мой класс камеры.

0

2

Камера определяется положением и тря ортонормированными вектооами - вперед, ввех и вправо
При этом z соотвествует направлению вперед. Поэтом вся плоскость z = 1 будет азадваться как pos + viewDir.
Для получение четырех точек политгона нужно просто посмотреть как устроена в OpenGL матрица песпективного проектирования и делать шаги вверх/вниз и вправо/влево исходя из этой матрицы

0

3

Хм.. как я понял, в основе такого представления камеры, лежат кватернионы. Но в моем приложении камера организована на углах Эйлера, и описывается только: положением, вертикальным вектором и вектором направленным вперед... Как быть в таком случае?
PS. А какое назначение данной функции?

0

4

Egnech
В твоем случае все равно есть результатная матрица камеры.
viewDir  = VECTOR3( x[0][2], x[1][2], x[2][2] );

где x твоя матрица

0

5

э.. это матрица, которая получается после gluLookAt()? Или я чего-то не понял...

0

6

Никаких кватернионов тут нет
Матрица преспективного проектирвания включает в себя масштабирование, связанное с aspect и  ration fov - и их нужно учесть делая шаги по view/UpDir

0

7

Могли бы Вы более детально расказать как формируется эта матрица а то я что-то совсем запутался...
На входе у меня есть: позиция камеры, вектор направленный вверх и вектор направленный вперед. Позицианируется камера через gluLookAt()

0

8

Как я понял, сновной задачей функции - getPlanePolyForZ(), это определить вершины квада, который будет рисоваться " на весь экран", а почему нельзя просто переводить  орто2д, и рисовать квад так?

0

9

Дело в том, что эти вершины нужны - потом я в шейдере восстанавливаю исходные координаты для каждого фрагмента - а это горазхдо удобнее делать, если есть координаты, интерполирцуемые на весь квад.
Хотя можно и так, как Вы предлагаете - просто логика расчета исходных координат будет чуть иной

0

10

Могли бы Вы более детально расказать как формируется эта матрица а то я что-то совсем запутался...
На входе у меня есть: позиция камеры, вектор направленный вверх и вектор направленный вперед. Позицианируется камера через gluLookAt()

Пусть p - позиция камеры, u = вектор вверх, с - вектор вперед (центр взгляда), тогда:

Код:
vec3 U    = normalize ( u );
vec3 dirZ = normalize ( c - p );                 // нормализация обязательна!
vec3 dirX = normalize ( cross ( dirZ, U ) );     // cross - векторное произведение (на выходе - вектор перпендикулярный обоим "множителям")
vec3 dirY = normalize ( cross ( dirX, dirZ ) );

// так как используемые в огл матрицы трансформации столбец-ориентированные,
// то при заполнении такой матрицы необходимо строки менять со столбцами (транспонировать),
// если ты используешь строко-ориентированную матрицу, и оставлять как есть, - если нет:

mat4 camView = mat4 ( dirX.x, dirY.x, -dirZ.x, 0.0,  // на самом деле для огл это - столбец, а не строка (то есть ты на место строки кладешь столбец) !
                      dirX.y, dirY.y, -dirZ.y, 0.0,
                      dirX.z, dirY.z, -dirZ.z, 0.0,
                      P.x   , P.y   ,   P.z   , 1.0 );

// здесь: Р = 0 или P = LinearPart(camView) * (-p), где LinearPart - mat3 верхней левой части.
// таким образом, ты можешь использовать либо:

glMatrixMode  ( GL_MODELVIEW );
glLoadMatrixf ( camView );
glTranslatef  ( -p );

// либо (для второго случая):

glMatrixMode  ( GL_MODELVIEW );
glLoadMatrixf ( camView );

// а например в вершинном шейдере если у тебя вдруг происходит расчет матрицы вида,
// то "LinearPart(camView) * (-p)"  (то есть mat3 * vec3) гммм... затратно, лучше сделать так:

gl_Position = yourProjectionMatrix *  yourModelViewMatrix * ( gl_Vertex - vec4 ( p, 0.0 ) );

Информацию о функции gluLookAt () можешь найти здесь: http://www.opengl.org/sdk/docs/man/xhtml/gluLookAt.xml
Заметь, что здесь вектора осей не нормализуются! Видимо, считается, что это и так всем ясно :)

Отредактировано stea1th (2008-07-31 10:06:51)

0

11

Спасибо! =)

0

12

Разобрался как и что работает, но все равно квад который рисуется на весь экран не хочет позиционироваться перед камерой...

0

13

ух.. заработало, проблема была в том, что я когда строил матрицу очипятался немного 8))) Спасибо большое за помощь!
ЗЫ. Я увидел, что на сайте появилась статья про SSAO, интересно, как будет выглядеть SSAO совместно с deferred shading'om?

0

14

Добрый день. В статье про Deferred Shading для хранения значения z используется текстура rgba8, данные для которой получаются функцией packFloatToVec4i. Получается преобразование packFloatToVec4i(-z/zFar) быстрее чем происходило бы переключение в случае, если бы текстура была бы в формате ALPHA32F, INTENSITY32F или GL_DEPTH_COMPONENT32?

0

15

Я думаю, что быстрее, поскольку в этом случае никаких проберзований (раскидывание занчения по четырем компонентам) не будет.

0



создать форум