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

Стекла и зеркала без рейтресинга. (4 стр)

Страницы: 1 2 3 4
#45
20:13, 15 окт. 2020

  А что если использовать гибридную технику: где надо точно, туда стенсил, где "и так сойдет" - proposed?


#46
(Правка: 21:12) 21:04, 15 окт. 2020

Dmitry_Milk
> в отраженном зеркале могут быть видны вещи, которых не видно в реальном
Mikle
> каждом из зеркал должен видеть отражение второго зеркала, а в этом отражённом зеркале должна отражаться камера. У тебя так не получится.

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

ArtProg
> А что если использовать гибридную технику: где надо точно, туда стенсил, где "и так сойдет" - proposed?
Данный метод полностью соответствует стенсилу в части точности первичного отражения. В обоих случаях все делается математически правильно.
Но используя стенсил ты выводишь картинку непосредственно на экран, т.е. у тебя ВСЕГДА идеальное зеркало. Таким образом например нельзя получить отражение в луже воды куда падают капли дождя, отражение в неровно лежащей плитке пола и т.д. Используя текстуру это делается довольно просто.
Ну и о никаком множественном отражении в случае стенсила вообще говорить не приходится. Ни о корректном ни о фейковом.

#47
(Правка: 23:09) 23:08, 15 окт. 2020

san
> Но используя стенсил ты выводишь картинку непосредственно на экран, т.е. у тебя
> ВСЕГДА идеальное зеркало. Таким образом например нельзя получить отражение в
> луже воды куда падают капли дождя, отражение в неровно лежащей плитке пола и
> т.д.
Причем тут вообще стенсил? Стенсил тебе просто отсекает область, в которой рисовать, а в которой не рисовать. Если хочешь капли дождя или еще какие-то искажения на поверхности, то рисовать в текстуру, но так же использовать стенсил.
У меня такое ощущение, что ты просто не разобрался как оно работает со стенсилом, поэтому и пишешь такую ерунду.
Разница твоего метода с рендером через стенсил в том, что ты:

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

Всё. На этом существенная разница в подходах заканчивается. Всё, что ты делаешь со своими зеркалами (искажения, поцарапанность, полупрозрачность) - можно делать и на стенсиле. И даже множественные отражения можно делать на стенсиле. Разница лишь в способах проецирования (viewspace для стенсила и objectspace для твоего способа) и отсечения по границам объекта (у тебя отсечение идет по границам треугольников рисуемого объекта, в стенсиле по пикселям)
#48
0:27, 16 окт. 2020

MrShoor
Другими словами ты предлагаешь делать то, что Mr F описывал:
>При блюре не ловил косяк, что начинает с краев зеркала протекать окружающий фон?
>Я чего-то подумал, что в одну общую текстуру экранного размера пихаешь разные отражения разных планаров.

Не, можно конечно и штаны через голову надевать... Ну если делать это через ноги противно твоему естеству.

#49
10:43, 16 окт. 2020

san
> Но используя стенсил ты выводишь картинку непосредственно на экран, т.е. у тебя
> ВСЕГДА идеальное зеркало.
Не обязательно, если рендерер умеет в преломление, то тогда тем же самым механизмом можно "преломлять" и стенсильные отражения.

#50
12:31, 16 окт. 2020

Delfigamer
> если рендерер умеет в преломление
Это как без рендера в текстуру?

#51
(Правка: 13:02) 12:47, 16 окт. 2020

Mikle
> Это как без рендера в текстуру?
Рендер в текстуру, естественно, но текстура одна на весь экран и заполняется по стенсилам, а не отдельная для каждого зеркала со сборкой по треугольникам.
Всякие дожди в таком случае будут рендериться как преломители поверх зеркала.
Могут возникнуть проблемы с отражением луж через лужи - как частный случай проблем с порядком преломлений в деферреде - но не думаю, что они окажутся заметно хуже, чем и так фейковый перенос отражений в методе ИТТ.
Во всяком случае, ничего невозможного в этом нет, и со словами "ВСЕГДА" и "нельзя" Сан поспешил - о чём я и хотел сказать.

Ну или если у тебя изначально деферред - то можно сказать и "без рендера в текстуру", в том смысле, что ты не используешь никаких текстур помимо тех, в которые ты бы рендерил независимо от количества зеркал и их присутствия в сцене вообще.

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

#52
15:45, 16 окт. 2020

Как должен выглядеть кубик рядом с одним из двух зеркал. Камера по центру между зеркалами смотрит вдаль.
twomirrors | Стекла и зеркала без рейтресинга.

#53
1:06, 18 окт. 2020

Я уже лет 10 удивляюсь, почему никто зеркало в текстуру не рендерит. И вот наконец свершилось.

#54
(Правка: 7:28) 7:26, 18 окт. 2020

g-cont
Меня это тоже удивляло. Но скорее всего народ останавливала трудность с реализацией матрицы для такого случая. Если со стенсилом все элементарно, то с рендером в текстуру не все так просто. В текстуре получается что-то обратное проекционным искажениям. Но нам (хотя большей частью Геннадию Ригеру) удалось это проблему решить. Все свелось к десятку строк.
Вот полный код прямо из проекта:

  // ——— Матрица————

  XMMATRIX ReflectionView = XMMatrixReflect(XMPlaneFromPoints(v0, v1, v2));
  XMMATRIX matView = ReflectionView * XMMatrixLookToLH(Camera, mirrorNorm, XMVectorSubtract(v1, v0));

  XMFLOAT3 topLeft;    XMStoreFloat3(&topLeft, XMVector3TransformCoord(v2, matView));
  XMFLOAT3 bottomRight;  XMStoreFloat3(&bottomRight, XMVector3TransformCoord(v1, matView));

  if (topLeft.z >= 0)
    return;

  XMMATRIX PerspMatrix = XMMatrixPerspectiveOffCenterRH(topLeft.x, bottomRight.x, bottomRight.y, topLeft.y, -topLeft.z, 1000.0f);
  XMMATRIX FinalMatrix = matView * PerspMatrix;

  //-------Фрустум---------

  BoundingFrustum::CreateFromMatrix(frustum, XMMatrixPerspectiveFovLH(XMConvertToRadians(90.f), 1.0, -topLeft.z, 1000.f));
  XMStoreFloat3(&frustum.Origin, XMVector3Transform(Camera, ReflectionView));

  XMVECTOR q = XMQuaternionMultiply(XMQuaternionMultiply({ Eye.Rot.x, Eye.Rot.y, Eye.Rot.z, Eye.Rot.w }, mirrorNorm), m_parent->mainCam->GetRotVec());
  XMStoreFloat4(&frustum.Orientation, q);

  //----------------------------------

Где v0, v1, v2 - позиции вертексов зеркала. Остальное думаю понятно из текста.

#55
9:32, 18 окт. 2020

g-cont
> Я уже лет 10 удивляюсь, почему никто зеркало в текстуру не рендерит.

а кривое зеркало аля сфера через кубмапу ?

#56
(Правка: 11:25) 11:23, 18 окт. 2020
  // reflect view by mirror plane
  d = -2.0f * ( dot( view.origin, plane.normal ) - plane.dist );
  vec3 origin = view.forward + d * plane.normal;

  d = -2.0f * dot( view.forward, plane.normal );
  vec3 forward = normalize( view.forward + d * plane.normal );

  d = -2.0f * dot( view.right, plane.normal );
  vec3 right = normalize( view.right + d * plane.normal );

  d = -2.0f * dot( view.up, plane.normal );
  vec3 up = normalize( view.up + d * plane.normal );
view - это позиция камеры. Origin, forward, right, up - позиция камеры, отражённая от плоскости зеркала.

innuendo
> а кривое зеркало аля сфера через кубмапу ?
других способов я не знаю. Ну разве что SSLR.


А еще можно плоскость зеркала включить как клипплейн, чтобы убрать искажения, когда камера слишком близко к ней.

Страницы: 1 2 3 4
ПрограммированиеФорумГрафика