Guestbook

  • Author
  • Message
Offline
User avatar
*sensei*
Posts: 267
Joined: 12 Oct 2012, 19:14

Re: Guestbook | Гостевая

Добрый день, Борис!

Возник такой вопрос по HLSL, ну и соответственно ENB))

В чем различие между этим:

Code: Select all

technique PostProcess
{
	pass P0
	{
		VertexShader = compile vs_3_0 VS_PostProcess();
		PixelShader = compile ps_3_0 PS_ProcessPass(FIRST_PASS);
	}
}
technique PostProcess2
{
	pass P0
	{
		VertexShader = compile vs_3_0 VS_PostProcess();
		PixelShader = compile ps_3_0 PS_ProcessPass(SECOND_PASS);
	}
}

и чем-то похожим, но сделанным через 2 пасса в одной технике

Code: Select all


technique PostProcess
{
	pass P0
	{
		VertexShader = compile vs_3_0 VS_PostProcess();
		PixelShader = compile ps_3_0 PS_ProcessPass(FIRST_PASS);
	}

	pass P1
	{
		VertexShader = compile vs_3_0 VS_PostProcess();
		PixelShader = compile ps_3_0 PS_ProcessPass(SECOND_PASS);
	}
}

само собой в контексте постпроцесса - например: enbeffect.fx, effect.txt...

если для достижения схожего с первым результатом нужны какие-то доп параметры пассов, намекни пожалуйста :) (ну там какие-нить alfablend = true и т.п.)

конечная цель - получить мульти-пасс enbeffect.fx для 0.163 версии мода GTA IV
_________________
Image

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17559
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Guestbook | Гостевая

На effect.txt с поддержкой мультипасса второй вариант просто будет перезаписывать результат PS_ProcessPass(FIRST_PASS), в то время как первый вариант заменит render taget и текстуру местами и будет работать правильно. На enbeffect.fx не работает первый вариант, потому что не мультипассовый, а второй вариант опять же перезаписывает результат. Перезаписывает означает, что записывается в одну и ту же render target, но с разными или одинаковыми шейдерами, бывает удобно для сложного эффекта с альфа блендингом для аккумуляции значений или для оптимизации, когда шейдер слишком сложный с ветвлениями и его можно быстро отмаскировать в самом начале через clip(value) и вычислить сложный код во втором проходе.
конечная цель - получить мульти-пасс enbeffect.fx для 0.163 версии мода GTA IV
Это невозможно сделать так же, как и у effect.txt, только если править код мода.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
User avatar
*sensei*
Posts: 267
Joined: 12 Oct 2012, 19:14

Re: Guestbook | Гостевая

возможно, ты уже отвечал на этот вопрос, но тем не менее он для меня актуален.
на данном этапе я закончил с базовой сборкой enbeffect.fx и настройкой тайма с INI для GTAIV, и соответственно руки дошли до enbbloom.fx

Code: Select all


//zero pass HQ, input texture is fullscreen
//SamplerBloom1 - fullscreen texture

....

//first and second passes draw to every texture
//twice, after computations of these two passes,
//result is set as input to next cycle

....

//first pass
//SamplerBloom1 is result of prepass or second pass from cycle

.....

//second pass
//SamplerBloom1 is result of first pass

.....

//last pass, mix several bloom textures
//SamplerBloom5 is the result of prepass
если я правильно понимаю последовательность и конечное расположение результатов каждого пасса, то происходит следующее:

1. prepass генерирует основной блум по полноразмерному изображению, записывая свой результат в samplerbloom5 и samplerbloom1

2. samplerbloom1 попадает в PS_BloomTexture1, результат пишется опять в samplerbloom1(?) и в samplerbloom3 (?)

3. samplerbloom1 переходит в PS_BloomTexture2, и результаты попадают уже в samplerbloom2(?) и samplerbloom4 (?)

4. повторение пунктов 2 и 3, но без записи копий в samplerbloom3 / 4

5. все эти текстуры направляются в PS_BloomPostPass где их можно все смешать и еще как-то поиздеваться над ними

вопрос - на каком этапе лучше вводить эффект lens flares - препасс, цикл из 2 и 3 шагов или уже после смешивания?

PS. просто иного объяснения наличия 5 текстур в постпассе я не смог выдумать, при том, что 5ый это результат препасса
_________________
Image

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17559
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Guestbook | Гостевая

Уже не помню какая текстура как называется, они разные в разных версиях, но суть такова, что prepass из полноэкранного изображения создает 512*512 текстуру, притом дважды вызывается на одной и той же с чередованием, чтоб посильнее устранить артефакты алиазинга. Далее полученный результат идет на BloomTexture1 (и в PostPass в самом конце тоже как одна текстура). BloomTexture1 и BloomTexture2 чередуются друг за другом, создавая текстуры более и более заблуренные, но BloomTexture1 рисует во временную текстуру, которая не видна, а эта временная уже на входе BloomTexture2 используется и происходит запись в текстуру уже посылаемую позже в PostPass.
Любые линзовые эффекты типа бликов на самом деле не в блуме должны быть, потому что их потом не отделить от него, но если экономить и сделать в блуме, но все зависит что именно за эффект нужно получить, размытое излишне изображение блика как lenz flare это значит использовать на поздних стадиях блура (там переменная одна является номером пасса, BloomParameters.w кажется, не помню), но всегда ж есть возможность вообще порезать текстуру например пополам в препассе и половину пустить на блум, половину на линзовые эффекты повышенной сложности. Конечно все крайне путанно, но много чего можно сделать через костыли.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
User avatar
*sensei*
Posts: 267
Joined: 12 Oct 2012, 19:14

Re: Guestbook | Гостевая

ENBSeries wrote:Любые линзовые эффекты типа бликов на самом деле не в блуме должны быть
ну с базовой теорией я немного ознакомился :D однако для реализации более-менее сложных бликов через enbeffect.fx пришлось бы немного жертвовать производительностью (хотя по сравнению с остальными эффектами это можно наверное списать на погрешность :lol: ), да и сам эффект выходил достаточно сложным и муторным (хотя линзы можно вообще оставить на effect.txt, но там пришлось бы опять делать downsample.... + необходимо использовать палитру для модуляции некоторых аббераций и дисперсии)

в общем ответ я, кажется понял, - рискну разделить текстуру блума пополам, для записи линз в другую половину - посмотрим, что выйдет из этого (это же оператор clip, насколько я помню?)
_________________
Image

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17559
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Guestbook | Гостевая

Не обязательно клипом, можно вертексный шейдер другой назначить с измененным квадом, еще быстрее будет.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
User avatar
*sensei*
Posts: 267
Joined: 12 Oct 2012, 19:14

Re: Guestbook | Гостевая

ну ты же понимаешь, что после этих слов я попрошу разъяснений ))

вот обычный вершинный шейдер из enbbloom.fx:

Code: Select all

VS_OUTPUT_POST VS_Bloom(VS_INPUT_POST IN)
{
	VS_OUTPUT_POST OUT;

	OUT.vpos=float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0);

	OUT.txcoord0.xy=IN.txcoord0.xy+TempParameters.xy;//1.0/(bloomtexsize*2.0)

	return OUT;
}
да бы сместить его "на половину" потребуется изменить:

Code: Select all

...

	OUT.txcoord0.xy=float2(0.5, 1.0) * (IN.txcoord0.xy+TempParameters.xy);//1.0/(bloomtexsize*2.0)

и для линз создаем отдельный шейдер... он может обращаться к тому же quad'у, что и оригинальный?
например так:

Code: Select all

VS_OUTPUT_POST VS_Lens(VS_INPUT_POST IN)
{
	VS_OUTPUT_POST OUT;

	OUT.vpos=float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0);

	OUT.txcoord0.xy=float2(0.5, 0) + float(0.5, 1) * (IN.txcoord0.xy+TempParameters.xy);//1.0/(bloomtexsize*2.0)

	return OUT;
}
если я все правильно понял, то имея такие вертексы, можно будет добавить 2ой пасс в последнюю технику Post_Pass, раздельно рисуя на каждой половине текстуры блума
_________________
Image

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17559
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Guestbook | Гостевая

Ага, типа того.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
User avatar
*sensei*
Posts: 267
Joined: 12 Oct 2012, 19:14

Re: Guestbook | Гостевая

BorisV wrote:Ага, типа того.
а вот и нет!! :D

самым тру вариантов оказалось сделать 3 вертекса - сток, половину для блума и половину для линз, правда половина получалась не через OUT.txcoord, а сдвигом самого квада:

Code: Select all

VS_OUTPUT_POST VS_Bloom(VS_INPUT_POST IN)
{
	VS_OUTPUT_POST OUT;

	OUT.vpos=float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0);

	OUT.txcoord0.xy=IN.txcoord0.xy+TempParameters.xy;//1.0/(bloomtexsize*2.0)
	return OUT;
}
VS_OUTPUT_POST VS_BloomHalf(VS_INPUT_POST IN)
{
	VS_OUTPUT_POST OUT;

	OUT.vpos=float4((0.5 * IN.pos.x)-0.5,IN.pos.y,IN.pos.z,1.0);

	//OUT.txcoord0.xy=IN.txcoord0.xy+TempParameters.xy;//1.0/(bloomtexsize*2.0)
	OUT.txcoord0.xy= IN.txcoord0.xy+TempParameters.xy;
	return OUT;
}

VS_OUTPUT_POST VS_Lens(VS_INPUT_POST IN)
{
   VS_OUTPUT_POST OUT;

   OUT.vpos=float4(0.5 + (0.5 * IN.pos.x),IN.pos.y,IN.pos.z,1.0);

   OUT.txcoord0.xy= IN.txcoord0.xy+TempParameters.xy;//1.0/(bloomtexsize*2.0)

   return OUT;
}

понимаю, что тебе это мало интересно, но думаю стоит отписать :mrgreen:

ктсати, мне все равно нужен твой совет) блум очень сильно сблюрен - нужен какой-то способ выделять из него только самые яркие области
_________________
Image

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17559
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Guestbook | Гостевая

Блум на то и блум, чтоб быть заблуренным, если только яркие области, то нет определения, что такое яркие и зачем они нужны. Арифметика блендинга блума автоматически дает больше интенсивности более ярким областям. Если нужно позарез непонятно зачем, наверно что-то вроде:
float gray=dot(bloom.xyz, 0.333);
gray=pow(gray, ESensitivity);
gray=1.0/(gray+1.0);
bloom.xyz=lerp(bloom.xyz, 0.0, gray);
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7
Post Reply