Suslik
Ок я попробую. Покажу что получилось
Suslik
Я так полагаю нужно делить объемную текстуру на кластеры, и рассчитывать каждый кластер раз в кадр. Потому что вся текстура считается слишком долго
Suslik
Кажется сделал вычисление диффузы. Но странно что оно отличается, от вычисленной стандартным путем. А так же что делать со спекуляром?
IBets
> А так же что делать со спекуляром?
А спекуляр считать динамически.
Ну или тоже предрассчитывать. В статике можно все предрассчитывать.
Правда для спекуляра нужно предрассчитать уже значение для каждого направления (и для каждого уровня шероховатости).
Suslik
В первый раз я сделал расчет по кластерам в volume space. Но потом я понял, зачем нам обрабатывать все воксели, если мы можем записать результат работы path трэйсера в пространстве экрана в нашу 3D текстуру с Diffuse с альфа каналом по числу итераций. Ну и производить такое же суммирование как при суммирование кадров
Странно что изначально не додумался до этого, а стал что-то сложное мудрить.
IBets
почему появляется шум при поворачивании?
> А так же что делать со спекуляром?
на самом деле можно предрассчитывать даже спекуляр даже с преломлениями, рассеяниями, самоотражениями и самосветимостью даже с произвольной BRDF. только это сложнее. и только для статической геометрии (главное ограничение). и я не видел, чтобы кто-то это делал на ходу в реалтайме: https://sites.fas.harvard.edu/~cs278/papers/prt.pdf
но факт в том, что предрассчитанный объём считался в реалтайме в каком-то там 2000-мохнатом году. сегодня он на мобилках сможет считаться.
>почему появляется шум при поворачивании?
Вангую, что у него там - стохастическая OIT, а при остановке статическая картинка продолжает сглаживаться, усредняя по последующим кадрам.
Cheb
Потому что дельта трэкингом считается в один проход. Без полупрозрачной геометрии видно что лайтмапа посчитана
Я думаю нужно дать пользователю выбор для переключения режимов. Когда ему нужно он переключит дельта трэкинг, на обычный рэймарчинг с накапливание цвета по альфа каналу.
.
IBets
выглядит хорошо. как ты записываешь результат в лайтмапу, когда луч находится между вокселями?
Suslik
Я записываю так
//postion, color, normal get by delta tracing uint3 voxelID = uint3(round( saturate( GetNormalizedTexcoord( position, desc.BoundingBox)) * desc.VolumeDim)); float4 diffuseColor = TextureVolumeDiffuse[voxelID]; float alpha = 1.0f / ( diffuseColor.a + 1.0f); float4 sum = float4( lerp( diffuseColor.xyz, color, float3( alpha, alpha, alpha)), diffuseColor.a += 1.0f); TextureVolumeDiffuse[voxelID] = sum; TextureColorUAV[id.xy] = float4( sum.xyz, 1.0); TexturePositionUAV[id.xy] = float4( position, 1.0); TextureNormalUAV[id.xy] = float4( normal, 1.0f);
Из-за того что одна выборка видна дескретизация. Я пока не решал эту проблему
IBets
я правильно понимаю, что ты вообще линейную инерполяцию убрал и используешь nearest? если бы я такую штуку реализовывал, я бы попробовал посчитать веса для 8 пикселей трилинейной фильтрации (те же самые веса, которые используются при обычном чтении из текстуры с линейной интерполяцией) и распределить посчитанный вклад освещения по этим 8 пикселям именно с этими весами. всегда было интересно, прокатит такое или нет.
Suslik
Да пока так, я позже добавлю. Я сейчас просто сосредоточен на трассировки по Octree для ускорения. Хотя возможно есть что интереснее для этого?
Suslik
Вот что получается при использовании в лоб трилинейной фильтрации.
Вот код писал, не подсматривал чужой, возможно у меня баг
Я думаю попробовать отбрасывать пиксели с минимальной светимостью при интерполяции и замещать их пикселем полученным с помощью round(texcoord)
IBets
> Вот код писал, не подсматривал чужой, возможно у меня баг
Бага вроде нет, но я не понял, почему бы не использовать семплеры? Это же всяко быстрее было бы, чем 8 лоадов из текстуры.
MrShoor
RWTexture ресурс не поддерживает сэмплеры
Тема в архиве.