Войти
ПрограммированиеФорумОбщее

Каустика на водном дне

#0
(Правка: 18:03) 15:25, 10 фев. 2019

Простым шейдером:

+ Показать

Я получаю такую картинку:
+ Показать

Идея: в каждой точке водной поверхности, сгенерированной "фракталом шума", вычисляем координаты дна, которых достигнет луч света, прошедший через эту точку. Затем в этих координатах сохраняем количество пришедших лучей через atomicAdd. Собственно, использование последнего меня сейчас смущает. Можно ли в реалтайме получить похожий результат с более высокой производительностью?

Пользуясь случаем, один наболевший вопрос:
Есть SSBO в шейдере:

layout(std430, binding = 8) buffer bufferData
Можно ли получить значение 8 по имени bufferData (т.е. то что будет передаваться в glBindBufferBase) в коде вызвав что-то типа glGetUniformLocation?


#1
16:07, 10 фев. 2019

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

Высота волны? Я бы решал это через треугольники.

#2
17:38, 10 фев. 2019

BingoBongo
> полоски - это ошибки метода Ньютона
Ньютона тоже надо правильно применять.

Задача периодическая, поэтому для начала надо определить, в каком интервале [cht][2\pi n-3\pi/2,\qquad2\pi n+\pi/2][/cht] лежит решение. После этого стартовать Ньютона из середины этого отрезка [cht]2\pi n-\pi/2[/cht] (предварительно переведя все величины поближе к нулю для уменьшения проблем с плавающим питухом).

#3
17:47, 10 фев. 2019

BingoBongo
Очевидно, что функция монотонна, и достаточно найти её на отрезке длиной 2*pi, т. к. x(c)=x(с-2*pi)+2*pi.
x(c)
y(c) (здесь только пол-периода)
Дальше можно функцию подогнать (таблицей/полиномом) до требуемой точности.

#4
(Правка: 18:05) 17:56, 10 фев. 2019

Ситуация поменялась, тема обновлена, x+cos(x)=c больше не нужен )

#5
(Правка: 18:41) 18:39, 10 фев. 2019

BingoBongo
> Можно ли получить значение 8 по имени bufferData (т.е. то что будет
> передаваться в glBindBufferBase) в коде вызвав что-то типа
> glGetUniformLocation?
glGetUniformLocation - устарел! Скорее всего что-то типа glGetProgramResourceIndex с GL_BUFFER_VARIABLE... или GL_SHADER_STORAGE_BLOCK но это не точно... ))))

#6
18:52, 10 фев. 2019

Funtik
> glGetUniformLocation - устарел!
Походу, я тоже )

#7
(Правка: 18:54) 18:53, 10 фев. 2019

BingoBongo
Вот так можно сделать:
GLuint index = glGetProgramResourceIndex ( program, GL_SHADER_STORAGE_BLOCK, "bufferData" );
glShaderStorageBlockBinding ( program, index, 8 );

#8
19:38, 10 фев. 2019

https://github.com/yagero/glsl-demo

#9
(Правка: 7:20) 7:17, 11 фев. 2019

BingoBongo
> atomicAdd(bufIntensities[coord.x+coord.y*ufmSize.x], 1);
больно жирно так решать. я каустики считал простым скроллингом двух текстур. не видел, чтобы кто-то в реалтайме точное решение для преломления считал.

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

ПрограммированиеФорумОбщее