Shaders

Версия Minecraft
1.7.10
API
Forge
Всем привет.
Собственно хотелось бы сделать постпроцессинг и в целом как либо улучшить рендеры.
Но есть проблема с которой я пока что не разобрался.
Допустим рендер идет в 2d, тогда
useShader();
render();
releaseShader();
будет обрабатывать только то, что идет в render и в целом я не смогу сделать например glow.
Как можно проходить по каждому пикселю на экране, применяя шейдер?
Как загрузить этот "экран" до моего рендера в sampler2D?
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Майн рисует рендер мира во фреймбуффер.
Класс Minecraft:
1635871906590.png
Здесь происходит отрисовка кадра.
Открываем данный метод и видим бинд текстуры кадра:
1635871977238.png
Дальше уже хукайся туда и применяй шейдер, должно получиться что-то такое:
Java:
useShader();
this.framebufferMc.framebufferRender(this.displayWidth, this.displayHeight);
stopShader();
 
Спасибо, это действительно работает как нужно.
Но я до сих пор не до конца понимаю :
допустим мне нужно отрендерить моба и вокруг него рисовать ауру.(видел в роблоксе, когда человек заходит на сервер)
Если применять шейдер при рендере моба, то я смогу взаимодействовать только с его текстурой.
Я читал, что можно создавать свой фреймбуффер, в нем рисовать моба и потом под шейдером переносить это в основной фреймбуффер, взаимодействуя с 2 семплерами(image, imageBack)(скорее всего не так сформулировал, либо вообще не понял сути той темы)
Как поступать в таком случае?
 
нет, я все же до сих пор не понимаю как это реализовывать...
все делал в 2d, хочу блюрить определенный rect в худе для теста.
вообщем перед рендером фреймбаффера делаю setup под 2d.
1) если брать за основу рендер ректа с текстурой(обвернуть его шейдером, потом загрузить через activetexture + bindtexture framebuffertexture) то сам sampler2D imageBack(основной фреймбаффер) будет как то странно скалиться(оно и понятно, рендер ректа меньше всего экрана)
2) если брать за основу весь рендер фреймбаффера и выносить в отдельный activetexture рендер ректа(тоже самое, но теперь проходится по каждому пикселю экрана) то весь экран окрасится в текстуру и теперь семплер ректа на весь экран.

я понимаю что делаю уже полный бред, но просто не могу найти инфы в инете.
 
разобрался.
Фикс = загрузка текстуры из фреймбаффера в семплер + fragcoord.xy / resolution для получения текущего color для imageBack.
но все таки не совсем то.не хочу засорять форум тредами, пусть если кто то с этим столкнется(контекст 2d шейдер для худа с использованием imageBack) знает все ответы на данные вопросы(лично я в майне таких "решений" не нашел)
собственно, может быть кто знает, как "пройтись по всему монитору" в шейдере при этом не рисуя лишний раз framebuffer в framebuffer(как бы это странно не звучало)?
просто я не до конца понимаю как это работает.
 
2,505
81
397
собственно, может быть кто знает, как "пройтись по всему монитору" в шейдере при этом не рисуя лишний раз framebuffer в framebuffer(как бы это странно не звучало)?
Имеешь ввиду, чтобы не приходилось рендерить эффект во временный фреймбуфер?
Кажется, никак. Вернее, можно рендерить в себя (т.е. когда в шейдере пишешь в текстуру, из которой читаешь). Но возможны артефакты.

А чтобы на каждый эффект не создавать фбо, можно создать только два и ping-pong'ать их по очереди.
 
а можно ли выделить больший размер для "скана" шейдера?
ну то есть применил шейдер, что либо отрисовал(например текст) а потом сверху накинул глоу.
проблема в том ,что шейдер будет применятся только к местам где происходит рендер.
есть мега костыль с рисованием пустого квадрата размером с экран, но я думаю что это не совсем верный вариант
 
2,505
81
397
а можно ли выделить больший размер для "скана" шейдера?
Не понял.

ну то есть применил шейдер, что либо отрисовал(например текст) а потом сверху накинул глоу.
В целом, да. Но только, если у тебя уже готова текстура с глоу.
А сам глоу это многопроходный эффект. Нужно иметь чистую текстуру, на которой отрисовано только то, что нужно заглоуить. Сделать несколько копий с даунскейлом (0.5, 0.25, и т.д), заблюрить их и затем аккумулировать. Тут на форуме когда-то кидали ссылку на гайд.

есть мега костыль с рисованием пустого квадрата размером с экран, но я думаю что это не совсем верный вариант
Ну вообще, это не костыль. Постпроцессинг именно так и делается. Иногда делают всякие оптимизации. Например, помечают стенсилом участки, которые нужно обрабатывать.
 
На счет первого.
Шейдер же проходится только по "пикселям" которые отрисовываются.
Можно ли как то сделать что б проходилось по 0, 0 : displayWidth, displayHeight?
Пытался viewport(мало ли соаботает), но, к сожалению, не сработало.
остался только варик рисовать безцветный rect по экрану, но я считаю это каким то костылем.
есть какие нибудь решения для этого?
 
Сверху