Войти
ПрограммированиеФорумГрафика

Кто силен в математике - помогите с матрицами! (8 стр)

Страницы: 14 5 6 7 8 9 Следующая »
#105
13:58, 9 мар. 2019

san
> Ты так горячишься, будьто я тебя заставляю срочно переписывать весь твой код со
> стенсилов на рендер в текстуру.
Знаешь в чем разница: вместо отрисовки плоскости с текстурой отрисовываем ту же плоскость в буфер стенсила. Вместо отрисовки в таргет текстуры отрисовываем на экран, без изменений настроек. Конец разницы.


#106
(Правка: 18:55) 18:41, 9 мар. 2019

foxes
> Знаешь в чем разница: вместо отрисовки плоскости с текстурой отрисовываем ту же плоскость в буфер стенсила. Вместо отрисовки в таргет текстуры отрисовываем на экран, без изменений настроек. Конец разницы.

Не так. В случае стенсила сцена отрисовывается с точки отраженной камеры во весь экран. Уже потом, после вертексного, геометрического и тесселяционных шейдеров происходит отсечение ненужного. В случае примененного мной рендера в текстуру (не знаю как это назвать, пусть автор алгоритма из AMD придумает название), матрица преобразуется таким образом, что рендер идет ТОЛЬКО в область закрытую зеркалом. При этом BoundingFrustum настраивается элементарно:

  BoundingFrustum frustum = { {} , {} , 1.0f, -1.0f, 1.0f, -1.0f, -topLeft.z, 1000.0f };
  XMStoreFloat3(&frustum.Origin, XMVector3Transform(Camera.Pos, ReflectionView));
  XMStoreFloat4(&frustum.Orientation, XMQuaternionMultiply(Camera.Rot, mirrorNorm));

При этом отсекается вся геометрия не попадающая во фрустум отражения. Т.е. нет вообще ничего лишнего.

#107
21:47, 9 мар. 2019

Mikle
> Я дал цитату из доков по DX9.
Это я понял. Я просто описал реальное положение дел, потому что в железе уже давно есть оптимизации по early test-ам. Они не гарантируются, но есть. А в доках по DX9 описывается общий случай, когда этих оптимизаций нет.

> или таки есть способ сдвинуть клипплейны вьюпорта? Я этот вопрос третий раз
> задаю.
Сдвинуть вьюпорт само собой способ есть. Но надо этот момент учитывать в матрице проекции. Поэтмоу проще не двигать вьюпорт, а делать сциссор. На практике у него производительность такая же, как у вьюпорта.

#108
22:30, 9 мар. 2019

Mikle
>или таки есть способ сдвинуть клипплейны вьюпорта?
A XMMatrixPerspectiveOffCenterLH это разве не оно?

#109
23:16, 9 мар. 2019

san
MatrixPerspectiveOffCenterLH - это просто функция, математика. А фрустум (выше я неправильно написал "вьюпорт") - это изначально куб, а 6 его граней - это плоскости отсечения. Как любое 3D тело, фрустум можно трансформировать матрицами, но, как ни трансформируй, четыре боковых плоскости совпадут с четырьмя сторонами вьюпорта (тут уже нет ошибки в термине). Все эти трансформации происходят в вертексном шейдере, а плоскости рассчитываются потом, причём аппаратно, по крайней мере так было во времена DX9. Не знаю, есть ли способ в это вмешаться, хотя бы в новых API.

#110
(Правка: 0:09) 0:07, 10 мар. 2019

Mikle
С удивлением осознал, что да, иногда scissor может выполняться (вроде) именно попиксельно, после растеризации. И в спеке DX он описан именно так.
Но на практике (насколько я понимаю) - он обычно выполняется до.
И не только в "новых API", но и в том же DX9.

См. https://gamedev.ru/code/forum/?id=37604 .

> Цикл был бы при рейтрейсинге.
Я о том, что чтобы реализовать scissor достаточно вместо

void rasterize(const Triangle &tri)
{
    int x0,y0,x1,y1;
    get_aabb(tri,x0,y0,x1,y1);
    x0=max(x0,0);
    y0=max(y0,0);
    x1=min(x1,framebuffer.width);
    y1=min(y1,framebuffer.height);
    for(int y=y0;y<y1;++y)
        for(int x=x0;x<x1;++x)
            if(pixel_inside_triangle(tri,x,y))
                process_pixel(x,y);
}
написать
void rasterize(const Triangle &tri)
{
    int x0,y0,x1,y1;
    get_aabb(tri,x0,y0,x1,y1);
    x0=max(x0,scissor.left);
    y0=max(y0,scissor.bottom);
    x1=min(x1,scissor.right);
    y1=min(y1,scissor.top);
    for(int y=y0;y<y1;++y)
        for(int x=x0;x<x1;++x)
            if(pixel_inside_triangle(tri,x,y))
                process_pixel(x,y);
}

#111
(Правка: 0:31) 0:21, 10 мар. 2019

san
> В случае стенсила сцена отрисовывается с точки отраженной камеры во весь экран.
Кто тебе это сказал? Также как и при рендеренге в текстуру можно настроить Frustum. И точно также при рендеренге в текстуру можно ренедрить во весь экран. Пишу об этом уже второй или третий раз.

#112
(Правка: 1:01) 0:29, 10 мар. 2019

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

Раз тут пошла такая пьянка... эээ.. дискуссия, то вот вопрос знатокам:
Я сделал два зеркала, одно отражает другое. На 2D картинке все отлично, но когда я смотрю в 3D, то видно, что в отражении на столе дальние предметы на зеркале полезли вперед. Т.е.  глаза как бы поменялись местами. Как не крутил пальцами и не воображал зеркала, так и не смог понять почему это происходит, а главное как с этим бороться. По отдельности все нормально но отражение в отражении вывернутое (не могу подобрать термин). В нормальном зеркале такое разумеется не наблюдается. Картинка прилагается:

t3 | Кто силен в математике - помогите с матрицами!

foxes
> Кто тебе это сказал? Также как и при рендеренге в текстуру можно настроить Frustum.
Можно все. Но только это убьет всю простоту стенсила. Придется вводить кучу подпорок и противовесов что бы держать эту конструкцию. Встает вопрос, а нафига? Когда то же самое получается бесплатно, просто в качестве побочного продукта.
Кстати я хотел бы посмотреть как ты настроишь фрустум стенсила на кривую трапецию в которую превращается четырехугольник в 3D сцене.

#113
1:10, 10 мар. 2019

san
> Кстати я хотел бы посмотреть как ты настроишь фрустум стенсила на кривую
> трапецию в которую превращается четырехугольник в 3D сцене.
Ты выводил тектстуру которая получается в результате рендеринга без пересчета текстурных координат? Там нет никакого кривого фруструма.

#114
(Правка: 2:12) 1:49, 10 мар. 2019

foxes
> Ты выводил тектстуру которая получается в результате рендеринга без пересчета текстурных координат? Там нет никакого кривого фруструма.
У меня нет кривого фрустума, поскольку я привожу матрицу к такому виду, что зеркало оказывается вертикально стоящим и центрированным по положению камеры.
Но когда ты рендеришь стенсил, то ты используешь только матрицу отражения и более ничего. В этом вся идея стенсила. Потому твое зеркало (а только оно должно тебя интересовать) расположено под произвольным углом. Разумеется сделать отсечение в такой обьект весьма нетривиальная задача. Обычно ничего и не делается - берется фрустум камеры повернутый на угол отражения с исходным FOV. При этом в поле зрения попадает до 90% геометрии, которая все равно не будет видна в зеркале. Налицо явный оверхед.

Посмотри на картинку - какая форма стола с точки зрения камеры? А фрустум должен быть построен от его углов, которые ты еще должен найти. И это далеко не прямоугольник.

При том рендере в текстуру, что я тут пропагандирую, рендерится только то, что будет видно в зеркале и ничего более. Причем это не требует по сути ничего - фрустум отсечения получается автоматически.  Например зеркало в раме, что на картинке, не видит стол и всю химическую посуду на нем. Там только фон, пара колонн и люстра.  Только они и будут рендериться. А зеркало на столе не видит люстру и не будет ее рендерить, хотя если бы зеркало было чуток больше стола, то люсту было бы отлично видно.

#115
4:29, 10 мар. 2019

шла 8 страница

#116
4:53, 10 мар. 2019

san
> На 2D картинке все отлично, но когда я смотрю в 3D, то видно, что в отражении
> на столе дальние предметы на зеркале полезли вперед.
Если ты про 3д, которое в окулусе - то отражение ведь должно быть разное для правого и левого глаза. У тебя так?

innuendo
> шла 8 страница
Перевожу с иннуендовского на общечеловеческий:
innuendo
Тяф.
#117
(Правка: 5:47) 5:12, 10 мар. 2019

MrShoor
Разное конечно. Рендерю два раза с позиции каждого глаза. Первое отражение получается нормальное, т.е. оно "внутри" зеркала как и должно быть. А вот со вторым, когда отражается отражение, что-то странное. Картинка нормально сориентирована, но положение глаз как-бы изменилось.

... Я кажется понял. Ведь на отражении картинка получается вверх ногами. Значит сдвиг влево стал сдвигом вправо. Хм... Теперь осталось понять как с этим бороться.

#118
(Правка: 15:53) 15:41, 10 мар. 2019

san
> И это далеко не прямоугольник.
Давай расскажи где тут далеко не прямоугольник.

mirror_0004 | Кто силен в математике - помогите с матрицами!

Нафига собственно тогда делать стенсил маску если фруструмом все отсечется.

san
> BoundingFrustum frustum = { {} , {} , 1.0f, -1.0f, 1.0f, -1.0f, -topLeft.z,
> 1000.0f };
>   XMStoreFloat3(&frustum.Origin, XMVector3Transform(Camera.Pos,
> ReflectionView));
>   XMStoreFloat4(&frustum.Orientation, XMQuaternionMultiply(Camera.Rot,
> mirrorNorm));
Эти настройки сделаны далеко не для того чтобы развернуть область рендеренга плоскости зеркала в прямую текстуру. Они предназначены для настройки передней плоскости отсечения чтобы отраженные объекты не торчали из зеркала. Тоже самое используется и при рендеренге со стенсилом.

#119
16:02, 10 мар. 2019

foxes
> Эти настройки сделаны далеко не для того чтобы развернуть область рендеренга плоскости зеркала в прямую текстуру. Они предназначены для настройки передней плоскости отсечения чтобы отраженные объекты не торчали из зеркала.
При чем тут разворот плоскости рендеринга? Я показал тебе фрустим отсечения, который получается ПОСЛЕ того, как матрица повернута должным образом. И показал только, что в этом случае он исключительно прост.

Страницы: 14 5 6 7 8 9 Следующая »
ПрограммированиеФорумГрафика