key0, спасибо! Яснее некуда. Именно это и хотел услышать
Есть ли какие-нибудь демки, где можно сравнить разные техники построения теней?
ialexbr
В dxsdk есть вроде разные типы сглаживания. Параметры точно покрутить можно
Есть два варианта:
1) Использовать шейдер, который считает свет только от одного источника света, и при нескольких источниках света на сцене перерисовывать сцену несколько раз с этим шейдером.
2) Использовать шейдер, который в цикле перебирает все источники на сцене и считает от них освещение, при этом сцену перерисовываешь всего один раз. При изменении количества источников на сцене шейдер перекомпилируется.
Какой вариант будет быстрее?
ialexbr
По сути вопрос forward rendering vs deferred rendering.
Это смотря сколько источников света и какова сложность сцены.
Можно ли рисовать в текстуру из которой читаешь данные? (Например, настроил FBO для записи в текстуру, потом эту же текстуру передал в шейдер, который берет данные из этой текстуры и записывает в нее же)
ialexbr
Нельзя, но можно взять две текстуры, сначала читать из первой рисовать во вторую, потом поменять местами и рисовать из второй в первую, ну и т.д.
kipar
Понятно, спасибо.
Ну и да, тоже спрошу. Хотя вопрос скорее риторический, но все-таки.
Как делать рандом в шейдерах?
В гугле нашлась только функция на основе синуса (с которой судя по stackoverflow на некоторых устройствах есть проблемы, т.к. она может ломаться в зависимости от реализации синуса для больших чисел) и webgl-noise, в котором нормального rand НЕТ, есть только шум перлина (т.е. явная переголова по вычислительной сложности, да и распределение у него отнюдь не равномерное).
А встроенный noise1\2\3 вроде бы устарел и нигде не реализован. Неужели рандом просто никому в шейдерах не нужен и всем хватает шума Перлина?
Разумеется, не нужен. Или ты хочешь текстуру, рябящую каждый кадр?
TelVolt
Зачем каждый кадр? Пусть генерит случайное число по заданному зерну (текстурной координате, например). Собственно так эта функция на основе синуса и работает
float rand(vec2 co){ return fract( sin( dot( co,vec2( 12.9898,78.233))) * 43758.5453); }
Но мне не нравится ее безальтернативность и упоминания о том что она не везде работает.
Возможно ли упаковать позицию (x, y, z) и нормаль (x, y, z) в два байта текстуры?
как нефиг делать. Потом главное быть готовым к чудесам
в подсказках было также Упаковка Linear Depth и нормалей в одну RGBA8 текстуру для LPP или DS, но по поиску я найти не могу
ialexbr
Нормаль в два байта можно. Другое дело, что ее нельзя будет использовать ни для чего, кроме диффузного освещения, любые блики и отражения будут артефачить.
Позицию теоретически тоже можно, но у тебя будет всего 64к разных позиций, то есть это - дискретный куб 40*40*40
Возможно ли в GLSL шейдере прочитать данные из VBO / памяти GPU?
Возможно ли в GLSL шейдере записать данные в VBO / в память GPU?
Тема в архиве.