forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   [TrueHorror] - разработка (http://forum.boolean.name/showthread.php?t=17293)

mr.DIMAS 26.10.2014 19:47

Ответ: [TrueHorror] - разработка
 
Вложений: 1
В аттаче скрин из игры

Теперь нужно сделать тени для поинт лайтов. я думаю сделать так: для каждой грани куба рендерим сцену с матрицей проекции с fov = 90. для выборки из кубшадоумапы используем направление от света до освещаемой точки. Все верно?

tirarex 26.10.2014 20:32

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 288594)
В аттаче скрин из игры

Теперь нужно сделать тени для поинт лайтов. я думаю сделать так: для каждой грани куба рендерим сцену с матрицей проекции с fov = 90. для выборки из кубшадоумапы используем направление от света до освещаемой точки. Все верно?


Верно , а еще можно так сгдладить


PHP код:

inline float rand(float3 seedint i
{
    
float4 seed4 float4(seedi);
    
float dot_product dot(seed4float4(12.989878.23345.16494.673));
    return 
frac(sin(dot_product) * 43758.5453);
}

#define NUM_SAMP 4
#define SPREAD 0.01

        
float vShadowSample texCUBE(sCubeShadow, -vLightDir + (float3(rand(vWorldPosi), rand(vWorldPos1), rand(vWorldPos2)) * SPREAD)).r;
        
fShadow += ((fLength-2.5) < vShadowSample) ? 1.0f 0.0f




Mr_F_ 26.10.2014 20:43

Ответ: [TrueHorror] - разработка
 
я на днях кстати делал PCF3x3 для кубмапных шадоумап (без шума), это не лучшее что можно делать с тенями, но просто для справки. могут быть косяки на стыках фейсов кубмапы, но это сложно заметить.
http://geom.io/pc4/demoShadersPoint.html
(можно зажать RMB и летать WASDом)
http://geom.io/pc4/src/graphics/prog...unks/shadow.ps
(код WIPовый)

mr.DIMAS 27.10.2014 19:24

Ответ: [TrueHorror] - разработка
 
немного про оптимизации. для спота можно отсекать объекты не создающие тени фрустумом построенном для спота, для поинта - по ограничивающей сфере вокруг него с радиусом освещения. все верно?

и кстати так никто и не ответил на:

Цитата:

Сообщение от mr.DIMAS (Сообщение 288415)
будет ли прирост производительности если все шейдерные константы замапить напрямую в регистры и потом устанавливать их через вызовы setvertexshaderconstant/setpixelshaderconstant? и как быть например с таким:

Код:

float4x4 worldViewProjection;
float opacity;
float brightness;

например я делаю так

Код:

float4x4 worldViewProjection : register( c0 );
float opacity : register( c5 );
float brightness : register( c6 );

но каждый регистр может содержать четыре флоата, таким образом впустую пропадают куски регистров с5,с6.

кароч расскажите че да как.


Mr_F_ 27.10.2014 19:37

Ответ: [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);
*/
*оправданность этих махинаций под сомнением

mr.DIMAS 01.11.2014 02:46

Ответ: [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 толку ноль.

Кароч у меня как обычно ниче не выходит. Че как оно правильно делается?

Mr_F_ 01.11.2014 13:07

Ответ: [TrueHorror] - разработка
 
Цитата:

float3 retColor = pow(texColor,1/2.2)
это sRGB коррекция, которая там для референса.
на деле тебе надо вместо этого просто включить SRGBWRITEENABLE, будет делать то же самое, но бесплатно, и рисовать в ргба8 тонмаппенный результат с этим.
альбедо текстуры при этом надо читать с SRGBTEXTURE стейтом, иначе получится обесцвеченная херня.

mr.DIMAS 01.11.2014 13:23

Ответ: [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)
и кароч все равно засветка и обесцвечивание.

объясни поподробнее, пжлста.

Mr_F_ 01.11.2014 13:35

Ответ: [TrueHorror] - разработка
 
Цитата:

g_device->SetSamplerState( 0, D3DSAMP_SRGBTEXTURE, TRUE );
это надо делать диффузным текстурам короче, ещё до освещения их.

Цитата:

g_device->SetRenderState( D3DRS_SRGBWRITEENABLE, FALSE );
это можно делать только в ргба8 текстуру, хдр текстуры не умеют юзать этот стейт. в дх10+ стейт и вовсе убрали и сделали для понятности форматы текстур с приставкой _SRGB в названии.
результат тонмапа ты же уже в лдр текстуру рисуешь? там и ставь стейт тогда.

про гамму в очередной раз запосчу
http://http.developer.nvidia.com/GPU...ems3_ch24.html
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://www.aversis.be/tutorials/vray...orkflow_01.htm
http://filmicgames.com/archives/299

---
пофиксил первую цитату

mr.DIMAS 01.11.2014 13:50

Ответ: [TrueHorror] - разработка
 
Вложений: 4
Не знаю то ли получилось что должно, вот скрины ( на них позорные не сглаженные тени :-D )

Без хдр

С хдр - 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";


Mr_F_ 01.11.2014 14:25

Ответ: [TrueHorror] - разработка
 
Цитата:

Без хдр
в смысле с хдр светом, но без тонмапа?
ну судя по тому, что белое пятно света стало более вменяемым - вроде тонмап работает.

mr.DIMAS 01.11.2014 14:27

Ответ: [TrueHorror] - разработка
 
ну да без тонмапа, теперь нужно вычислять среднюю яркость сцены, чтобы посчитать выдержку, как это проще сделать?

и еще можно ли скормить результат тонмапа шейдеру FXAA? не появятся ли артефакты?

Mr_F_ 01.11.2014 14:58

Ответ: [TrueHorror] - разработка
 
Цитата:

ну да без тонмапа, теперь нужно вычислять среднюю яркость сцены, чтобы посчитать выдержку, как это проще сделать?
проще - задаунсемплить картинку в 1 пиксель (тупо нарисовать весь экран в однопиксельный РТ не выйдет, надо несколько пассов с уменьшением в 2-4 раза), исходя из средней яркости крутить экспозицию.
сложнее - считать гистрограмму яркости за несколько кадров, Вэлв очень хитро это делали, считая кол-во слишком ярких/тёмных пикселей occlusion query.
http://www.valvesoftware.com/publica...urceEngine.pdf

Цитата:

результат тонмапа шейдеру FXAA?
должно быть норм
более того, обычно как раз считать любое АА лучше именно ПОСЛЕ тонмапа, иначе если ты сглаживаешь переход между цветом с яркостью 1 и яркостью 100, у тебя просто вся плавность перехода "съестся" яркостью второго, и по прежнему будет выглядеть как без АА.

mr.DIMAS 01.11.2014 15:07

Ответ: [TrueHorror] - разработка
 
Тоесть мне нужно создать несколько текстур вплоть до 1х1. Затем в несколько проходов: заливать картинку с текущего прохода в текстуру поменьше, и т.д до 1х1? А размазывать при записи нужно при этом?

Цитата:

у тебя просто вся плавность перехода "съестся" яркостью второго, и по прежнему будет выглядеть как без АА.
да, я попробовал сначала сгладить и реально вышел шлак, поставил после и стало хорошо.

И как исходя из средней яркости крутить экспозицию? просто exposure = luminance? Или по формуле какой-то?

Mr_F_ 01.11.2014 16:08

Ответ: [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? Или по формуле какой-то?
по формуле какой-то. тут уже не подскажу, мало этим занимался, хватало фиксировать экспозицию руками по триггерам.


Часовой пояс GMT +4, время: 23:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot