|
26.10.2014, 19:47
|
#586
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
В аттаче скрин из игры
Теперь нужно сделать тени для поинт лайтов. я думаю сделать так: для каждой грани куба рендерим сцену с матрицей проекции с fov = 90. для выборки из кубшадоумапы используем направление от света до освещаемой точки. Все верно?
__________________
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо mr.DIMAS за это полезное сообщение:
|
|
26.10.2014, 20:32
|
#587
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: [TrueHorror] - разработка
Сообщение от mr.DIMAS
В аттаче скрин из игры
Теперь нужно сделать тени для поинт лайтов. я думаю сделать так: для каждой грани куба рендерим сцену с матрицей проекции с fov = 90. для выборки из кубшадоумапы используем направление от света до освещаемой точки. Все верно?
|
Верно , а еще можно так сгдладить
inline float rand(float3 seed, int i) { float4 seed4 = float4(seed, i); float dot_product = dot(seed4, float4(12.9898, 78.233, 45.164, 94.673)); return frac(sin(dot_product) * 43758.5453); } #define NUM_SAMP 4 #define SPREAD 0.01 float vShadowSample = texCUBE(sCubeShadow, -vLightDir + (float3(rand(vWorldPos, i), rand(vWorldPos, i + 1), rand(vWorldPos, i + 2)) * SPREAD)).r; fShadow += ((fLength-2.5) < vShadowSample) ? 1.0f : 0.0f;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.10.2014, 20:43
|
#588
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
я на днях кстати делал PCF3x3 для кубмапных шадоумап (без шума), это не лучшее что можно делать с тенями, но просто для справки. могут быть косяки на стыках фейсов кубмапы, но это сложно заметить.
http://geom.io/pc4/demoShadersPoint.html
(можно зажать RMB и летать WASDом)
http://geom.io/pc4/src/graphics/prog...unks/shadow.ps
(код WIPовый)
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
27.10.2014, 19:24
|
#589
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
немного про оптимизации. для спота можно отсекать объекты не создающие тени фрустумом построенном для спота, для поинта - по ограничивающей сфере вокруг него с радиусом освещения. все верно?
и кстати так никто и не ответил на:
Сообщение от mr.DIMAS
будет ли прирост производительности если все шейдерные константы замапить напрямую в регистры и потом устанавливать их через вызовы setvertexshaderconstant/setpixelshaderconstant? и как быть например с таким:
float4x4 worldViewProjection;
float opacity;
float brightness;
например я делаю так
float4x4 worldViewProjection : register( c0 );
float opacity : register( c5 );
float brightness : register( c6 );
но каждый регистр может содержать четыре флоата, таким образом впустую пропадают куски регистров с5,с6.
кароч расскажите че да как.
|
__________________
|
(Offline)
|
|
27.10.2014, 19:37
|
#590
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
да
и кстати так никто и не ответил на:
|
проверь, замерь, когда-то сам заморачивался с этим тоже, но особо сравнений не производил
вообще, стараюсь по возможности юзать везде флоаты4 и напихивать в компоненты всё. так, например, на геоме большинство параметров материала хранится:
uniform vec4 params; /* glossiness, reflectivity, fresnelEmission,isMetalOpacity
fresnelEmission:
fresnel = frac(fresnelEmission)*10.0;
emission = floor(fresnelEmission/100.0);
isMetalOpacity:
isMetal = isMetalOpacity>0;
opacity = abs(isMetalOpacity);
*/
|
*оправданность этих махинаций под сомнением
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.11.2014, 02:46
|
#591
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Делаю HDR. Возник вопрос по поводу источников света. Допустим фонарик светит с яркостью 1,0. А прожектор с яркостью 10,0. При рендере в хдртексу( A16B16G16R16 ) шейдером лайта, я просто домножаю цвет на яркость источника света. Дальше я делаю тон маппинг так( брал отсюда http://filmicgames.com/archives/75 ):
"sampler hdrTexture : register( s0 );\n"
"float4 main( float2 texCoord : TEXCOORD0 ) : COLOR0\n"
"{\n"
" float3 texColor = tex2D( hdrTexture, texCoord );\n"
" texColor *= 16;\n" \\ exposure
" texColor = texColor/(1+texColor);\n"
" float3 retColor = pow(texColor,1/2.2);\n"
" return float4(retColor,1);\n"
"};\n";
В итоге на выходе просто обесцвеченная засвеченная картинка. игрался с exposure толку ноль.
Кароч у меня как обычно ниче не выходит. Че как оно правильно делается?
__________________
|
(Offline)
|
|
01.11.2014, 13:07
|
#592
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
float3 retColor = pow(texColor,1/2.2)
|
это sRGB коррекция, которая там для референса.
на деле тебе надо вместо этого просто включить SRGBWRITEENABLE, будет делать то же самое, но бесплатно, и рисовать в ргба8 тонмаппенный результат с этим.
альбедо текстуры при этом надо читать с SRGBTEXTURE стейтом, иначе получится обесцвеченная херня.
|
(Offline)
|
|
01.11.2014, 13:23
|
#593
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
ниче не понял. просто ты так сумбурно объяснил, что я прям и не знаю че делать.
делаю так, при тонмапе
g_device->SetSamplerState( 0, D3DSAMP_SRGBTEXTURE, TRUE );
g_device->SetRenderState( D3DRS_SRGBWRITEENABLE, TRUE );
при рендере сцены в хдртекстуру
g_device->SetRenderState( D3DRS_SRGBWRITEENABLE, FALSE );
и я выкинул из кода шейдера float3 retColor = pow(texColor,1/2.2)
и кароч все равно засветка и обесцвечивание.
объясни поподробнее, пжлста.
__________________
|
(Offline)
|
|
01.11.2014, 13:50
|
#595
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Не знаю то ли получилось что должно, вот скрины ( на них позорные не сглаженные тени )
Без хдр
С хдр - exposure 0.4
С хдр - exposure 2.2
С хдр - exposure 6.2
и да, код тонмапа такой
"sampler hdrTexture : register( s0 );\n"
"float4 main( float2 texCoord : TEXCOORD0 ) : COLOR0{\n"
" float3 texColor = tex2D( hdrTexture, texCoord );\n"
" float exposure = 0.4f;\n"
" float3 retColor = 1 - exp( -exposure * texColor );\n"
" return float4(retColor,1);\n"
"};\n";
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.11.2014, 14:25
|
#596
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
в смысле с хдр светом, но без тонмапа?
ну судя по тому, что белое пятно света стало более вменяемым - вроде тонмап работает.
|
(Offline)
|
|
01.11.2014, 14:27
|
#597
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
ну да без тонмапа, теперь нужно вычислять среднюю яркость сцены, чтобы посчитать выдержку, как это проще сделать?
и еще можно ли скормить результат тонмапа шейдеру FXAA? не появятся ли артефакты?
__________________
|
(Offline)
|
|
01.11.2014, 14:58
|
#598
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
ну да без тонмапа, теперь нужно вычислять среднюю яркость сцены, чтобы посчитать выдержку, как это проще сделать?
|
проще - задаунсемплить картинку в 1 пиксель (тупо нарисовать весь экран в однопиксельный РТ не выйдет, надо несколько пассов с уменьшением в 2-4 раза), исходя из средней яркости крутить экспозицию.
сложнее - считать гистрограмму яркости за несколько кадров, Вэлв очень хитро это делали, считая кол-во слишком ярких/тёмных пикселей occlusion query.
http://www.valvesoftware.com/publica...urceEngine.pdf
результат тонмапа шейдеру FXAA?
|
должно быть норм
более того, обычно как раз считать любое АА лучше именно ПОСЛЕ тонмапа, иначе если ты сглаживаешь переход между цветом с яркостью 1 и яркостью 100, у тебя просто вся плавность перехода "съестся" яркостью второго, и по прежнему будет выглядеть как без АА.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.11.2014, 15:07
|
#599
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Тоесть мне нужно создать несколько текстур вплоть до 1х1. Затем в несколько проходов: заливать картинку с текущего прохода в текстуру поменьше, и т.д до 1х1? А размазывать при записи нужно при этом?
у тебя просто вся плавность перехода "съестся" яркостью второго, и по прежнему будет выглядеть как без АА.
|
да, я попробовал сначала сгладить и реально вышел шлак, поставил после и стало хорошо.
И как исходя из средней яркости крутить экспозицию? просто exposure = luminance? Или по формуле какой-то?
__________________
|
(Offline)
|
|
01.11.2014, 16:08
|
#600
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
А размазывать при записи нужно при этом?
|
просто находишь средний цвет.
берёшь снимок экрана (по идее хдрный, но может имеет смысл и после тонмапа) и рисуешь квад с ним в текстуру в 2 раза меньшего разрешения, при этом в каждый пиксель находя среднее арифметическое 2х2 блока большой картинки.
необязательно начинать даунсемплить от фуллреса - можно начать от 512х512 версии (тупо хайрес нарисовать в неё, будет алиасинг, но тут не шибко важно) и дальше 256, 128, 64, 32, 16, 8, 4, 2, 1.
Можно в шейдере читать и 4х4 блок, тогда выйдет 128, 32, 8, 2, 1 (из 2 в 1 уже снова 2х2 фильтр нужен).
И как исходя из средней яркости крутить экспозицию? просто exposure = luminance? Или по формуле какой-то?
|
по формуле какой-то. тут уже не подскажу, мало этим занимался, хватало фиксировать экспозицию руками по триггерам.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:09.
|