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

Screen space ambient occlusion с учетом нормалей и расчет одного отражения света. (комментарии) (4 стр)

Страницы: 1 2 3 4 5 Следующая »
#45
15:20, 28 янв. 2015

Каких других техник?


#46
15:35, 28 янв. 2015

The Andreyp
> 2015 году - SSAO на фоне других техник
SSAO есть SSAO, а всякие HBAO, HDAO - это один из способов реализации SSAO, назвали по другому для удобства просто.

#47
16:24, 28 янв. 2015

Sergio
если реалтайм как ссао - то
cone tracing , Light Propagation

#48
14:09, 10 фев. 2015

forhaxed
> Сколько не читал пайперы - так ничего и не понял :(
Да, разбираться в чужом коде\пейпере то еще занятие. Но с другой стороны, это же интересно, следить за мыслью другого человека, вместе с ним пройти путь по реализации той или иной техники, взглянуть на  задачу его глазами. Порой много интересного и полезного для себя можно почерпнуть, занимаясь этим на первый взгляд тяжелым делом. Но оно того стоит. Я сам чайник еще в этих 3д графиках)). Образование художника, но природное любопытство да и род деятельности подвигло меня на изучение компьютерной графики. Свой ssao пилил долго и мучительно и не с первого раза он получился приемлемого качества, но в процессе творчества я выработал для себя несколько простых правил. Они не новы, многие их знают, я просто напомню их самому себе и заодно поделюсь ими с теми, кто еще не дошел до них сам. Они очень помогают мне не только  в программировании но и в других областях жизнедеятельности(правила достаточно общие) и перед началом восхождения на очередную непокоренную вершину стараюсь держать их в голове.
1. Важно вначале вникнуть в основную концепцию, метод, с помощью которого добиваемся нужного результата. Проще говоря - что делать то нужно. Очень помогает на данном этапе рисование схемок.
2. Параллельное изучение теоретической части и практическая реализация техники. Сколько схемок не рисуй, или пайперов и чужих шейдеров не читай, но пока ты сам не напишешь рабочий код программы, считай - ты ничего не понял окончательно на 100 процентов.
3. Разбиение большой задачи на промежуточные шаги. Так проще и быстрее отследить место ошибки если она\они будут допущены.
4. Часто в самом начале изучения вопроса от сильного желания побыстрее все сделать самому мы забываем про народную мудрость  - "семь раз отмерь, один-отрежь", "без труда не выловишь и рыбку из пруда", и наконец "держи ноги в тепле, а голову - в холоде". Как говорят американцы - будь спокоен. Большое желание освоить незнакомую технику может как помочь, так и навредить, поскольку слишком сильное эмоциональное перевозбуждение мешает мыслить логично и конструктивно, а значит плодотворно.
5. Неизвестно как много времени уйдет на реализацию метода. В любом случае, никто не мешает отложить на время один вопрос, чтобы отдохнуть от него, чтобы в голове все упорядочилось, и заняться другими вопросами. Кто знает - возможно занимаясь другой техникой, мы вдруг осознаем те детали, незнание которых не позволяло нам решить возникшую проблему.
Тебе данная то статья помогла разобраться в вопросе, или так и не понял. Если честно, то я сам пока в метод от Sergio не слишком вникал. Это связано с тем, что с этим вопросом я более или менее разобрался. Хотя кое-что из этой статьи я для себя отметил и использовал в своей реализации.

#49
17:29, 10 фев. 2015
+ Показать
#50
17:32, 10 фев. 2015

Zar
> Если честно, то я сам пока в метод от Sergio не слишком вникал.
Так тут метода никакого и нет по сути. Тут самая простая имплементация.

TheGrayWolf
+1 :)

#51
18:18, 10 фев. 2015

А есть аналогичные реализации, где в viewspace считают?

#52
19:00, 10 фев. 2015

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

#53
20:14, 10 фев. 2015

Che@ter
> Советую сделать multiresolution ssao - там можно без размытия с лучшим
> качеством и/или скоростью.

Я так понимаю, при таком подходе для пикселей, лежащих на глубине с небольшой разницей, берутся меньшие по разрешению мип копии G-буффера, а для пикселей лежащих на границах большого перепада глубины - оригинальные или хальф сайз текстуры, верно?

#54
20:16, 10 фев. 2015

TheGrayWolf
> Хрена ты мыслитель ваще крсвчк.
=3 Да бывает находит иногда.

#55
20:44, 10 фев. 2015

Sergio
> Так тут метода никакого и нет по сути. Тут самая простая имплементация.
Это верно, вот как раз посидел сегодня, почитал повнимательнее и подразобрался. Основное отличие твоей имплиментации от виданных мною раньше в том, что ты не используешь отдельного массива для определения вектора при расчете семплов от исходного пиксела , а юзаешь всё ту же текстуру шума.  Это прикольно - я оценил. В других вариациях, которые мне попадались, чтобы найти новую позицию образца от нормали шумовой текстуры отражали случайный вектор, хранящийся в массиве (в том же Crysis например), либо собирали матрицу вращения исходя из нормали в текущем пикселе и вектора из шумовой текстуры. Но вот по поводу сравнения глубины семпла и прочитанной глубины из текстуры  - тут возникают сомнения по поводу эффективности данного способа. Сейчас объясню почему. Дело в том, что при использовании такой проверки мы конечно избавляемся от нежелательного затенения тех участков поверхности, которые не должны быть затенены. Но для красивого мягкого результата  требуется большое количество выборок на пиксель(64 и выше), так как большое количество выборок просто не пройдут теста и не дадут никакого вклада в затенение. Куда логичнее использовать метод, описанный вот здесь http://steps3d.narod.ru/tutorials/ssao-tutorial.html. Конкретнее - у нас есть позиция пикселя, для которого рассчитываем затенение и позиция проекции семпла. Вычитаем из одной позиции другую, получаем вектор от пикселя к образцу. Далее считаем скалярное произведения этого нормализованного вектора(предварительно сохранив его длину для проверки расстояния)и нормали центрального пикселя и помножаем вклад в затенение на полученный коэффициент.

float3 samplePosMap=tex2D(Texture4,sampleUV); 
      //вычтем из позиции обрабатываемого пикселя
      //позицию из текстуры
      float3 ToCenter=samplePosMap.xyz-Pos.xyz;
      //чтобы избежать эффекта хало
      //измерим расстояние между пикселом
      //и окклюдером
      float d=length(ToCenter);
      //нормализуем вектор
      ToCenter/=d;
      //рассчитаем скалярное произведение нормали в точке
      //и полученного вектора и умножим на полученное значение
      //вклад затенения
      //это позволит избавится от затенения тех точек которые
      //не нависают над обрабатываемой точкой
      float normAtten=clamp(dot(Normal,ToCenter),0,1);
      
          //если расстояние меньше максимального значения вклада в затенение
          //то считаем затенение
          if(d<maxOcclusionDist)
          {
              //чем дальше окклюдер тем меньше затенение
              ao+=(1-(d/maxOcclusionDist))*normAtten*OcclusionScale;
          }
   }
   ao/=NUM_SAMPLES;
  
   return 1-ao;
#56
20:53, 10 фев. 2015

Demiurg-HG
> Executor
> > Это совершенно разные вещи.
> Нет, как раз они очень близки.
Согласен с демиургом. Что тут трассировка глубины, что там.

#57
21:17, 10 фев. 2015

Sergio
Модернизируй метод до многопроходного.
Например 4 прохода по 8 выборок.  8^4 ->4096 условно выборок на точку.

Просто при расчете освещенности от выборки учитываешь ее освещение от предыдущего прохода.
При учете самой точки учитываешь освещенность от выборок и освещенность самой от предыдущего прохода.

Выборки должны распределены быть нормально как по отдельности на проход так и все вмести.

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

Потом добавил микро сдвиг камеры по треугольнику, получил еще и сглаживание.

#58
7:38, 8 мар. 2015

Сделал "interleaved rendering" по вот этой доке:
https://developer.nvidia.com/sites/default/files/akamai/BAVOIL_Pa… cientPost.pdf

Получилось вот так (без размытия) - 64 семплов на пиксель, 124 кадра в секунду на NVidia 750M
Изображение

#59
8:15, 8 мар. 2015

Sergio
> 124 кадра в секунду на NVidia 750M

Указать % ускорения требуется по сравнению c non interleaved

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.