Skip to content
Snippets Groups Projects
Commit e814a7d3 authored by Byurrrer's avatar Byurrrer
Browse files

немного осветлил итоговую картинку путем правки освещения, добавил постпроцесс...

немного осветлил итоговую картинку путем правки освещения, добавил постпроцесс эффекты ч/б, сепия, регулировка изображения, поправили ошибку при записи и чтении идентификаторов слоев, частично переименовал и прокомментировал шейдеры, добавил обнуление данных в gbuffer, поправил прошлый баг с кэширвоанием шейдеров
parent dd0c8d95
No related branches found
No related tags found
1 merge request!1Version 0.10.1
Showing
with 127 additions and 92 deletions
......@@ -50,7 +50,9 @@ static const half2 g_vTexUVcenter = half2(0.5, 0.5);
#define F0_MIN_4_DEST_AMBIENT 0.25
//! максимальнео количество слоев
#define LAYERS_COUNT_MAX 256
#define LAYERS_COUNT_MAX 255.0
static const half g_fUnit256 = 1.0/255.0;
//! слой непрозрачной геометрии
#define LAYER_OPAQUE 1
......@@ -110,6 +112,9 @@ static const half2 g_vTexUVcenter = half2(0.5, 0.5);
//##########################################################################
//! регистр данных для вершинного шейдера анимационных моделей
#define ANIM_R_DATA c16
//! дистанция на которую распространяется детализированность шейдеров mtrl_land_
#define MTRL_LAND_DIST 100.f
......
......@@ -29,9 +29,16 @@ half4 GreenTransformPos(half3 pos,half scale,half multiplier, half3 translate)
return tpos;
}
// общий альфа тест растительности
half4 GreenAlphaTest(half4 vColor)
{
clip(vColor.a - GREEN_ALPHATEST_VALUE);
vColor.a = 1.f;
return vColor;
}
// расчет затенености вершины, на основании отдаленности от центра ограничивающей сферы
half GreenComShadingBySphere(half4 vSphere, half3 vPosition)
{
return pow(length(vSphere.xyz - vPosition) / vSphere.w, 2);
}
......@@ -22,7 +22,7 @@ half4 main(VSO_PP IN):COLOR0
{
half4 vNormal = tex2D(g_sNormals,IN.vTexUV);
half fSort = vNormal.w;
half fLayer = NormalEncodeLayer(vNormal.xyz);
half fLayer = NormalDecodeLayer(vNormal.xyz);
//цвет приводим к sRGB
half4 vColor = pow(tex2D(g_sColor,IN.vTexUV), 2.2);
......
......@@ -116,7 +116,7 @@ PSO_Lbuffer main(VSO_ResPos IN)
fAbsDiffuse = fShadow;
#endif
fDiffuse = saturate(fDiffuse + 0.1);
fDiffuse = saturate(fDiffuse + 0.2);
fDiffuse = lerp(1, fDiffuse, vParam.z);
#ifdef IS_SHADOWED
......@@ -125,11 +125,11 @@ PSO_Lbuffer main(VSO_ResPos IN)
fDiffuse *= max(fOriginShadow, 0.2);
else
//иначе выбираем значения тени из диапазона, на основании силы света
fDiffuse *= max(fShadow, lerp(0.01, 0.07, g_vLightColor.w));
fDiffuse *= max(fShadow, lerp(0.01, 0.09, g_vLightColor.w));
#endif
OUT.vAmdient.xyz = g_vLightColor.xyz * g_vLightColor.xyz * g_vLightPowerDist.x * fAttenuation;
OUT.vAmdient.w = fDiffuse * fMdiffuse * vParam.w * g_vLightPowerDist.x * fAttenuation;
OUT.vAmdient.w = fDiffuse * fMdiffuse * vParam.w * g_vLightPowerDist.x * 2.0 * fAttenuation;
OUT.vSpecular = fSpecular * fAbsDiffuse * fAttenuation * g_vLightPowerDist.x;
......
......@@ -80,39 +80,34 @@ half GetTextureLod4Scene(half2 vTexUV)
//! кодирование xyz нормали в xy
half3 NormalEncode(half3 vNormal, half fLayer)
{
/*half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5));
enc = enc*0.5+0.5;
return half3(enc, 0);*/
vNormal.xy = vNormal.xy * 0.5 + 0.5;
vNormal.z = (sign(vNormal.z) * 0.5 + 0.5) * 0.5 + fLayer;
[branch]if(vNormal.z >= 0.0)
vNormal.z = 0.5 + fLayer * g_fUnit256;
else
vNormal.z = fLayer * g_fUnit256;
return vNormal;
}
//! декодирование нормали xy в xyz
half4 NormalDecode(half3 vNormal)
{
/*half4 nn = half4(enc, enc)*half4(2,2,0,0) + half4(-1,-1,1,-1);
half l = dot(nn.xyz,-nn.xyw);
nn.z = l;
nn.xy *= sqrt(l);
return nn.xyz * 2 + half3(0,0,-1);*/
half fLayer = 0;
vNormal.xy = vNormal.xy * 2.0 - 1.0;
half fValue = vNormal.z;
vNormal.z = sign(fValue * 2.0 - 1.0);
if(vNormal.z >= 0.5)
fLayer = (floor((vNormal.z - 0.5) * 255.0 + 0.5)) * g_fUnit256;
else
fLayer = floor(vNormal.z * 255.0 + 0.5) * g_fUnit256;
vNormal.xy = vNormal.xy * 2.0 - 1.0;
vNormal.z = sign(vNormal.z * 2.0 - 1.0);
vNormal.z = sqrt(1 - pow(vNormal.x, 2) - pow(vNormal.y, 2)) * vNormal.z;
half fLayer;
if(vNormal.z > 0.0)
fLayer = fValue - 0.5;
else
fLayer = fValue;
return half4(vNormal, fLayer);
}
#define NormalEncodeLayer(vNormal)(NormalDecode(vNormal).w)
#define NormalDecodeLayer(vNormal)(NormalDecode(vNormal).w)
//! преобразвоание цвета в нормаль (если конечно цвет содержит нормаль)
half3 Color2Normal(half3 vColor)
......@@ -122,22 +117,26 @@ half3 Color2Normal(half3 vColor)
//##########################################################################
//! формирование структуры G буфера
PSO_Gbuffer CreateGbuffer(half4 vColor, half3 vNormal, half4 vParam, half4 vPosition, half4 vNearFarLayers)
/*! формирование структуры G буфера
\param vColor - float4 цвет
\param vNormal - float3 нормаль
\param vParam - float4 параметры освещения (из текстуры парамтеров)
\param vWVPposition - float4 позиция пикселя (считается в вершинном шейдере как mul(vPos, g_mWVP))
\param vNearFarLayers - float4, аналог g_vNearFarLayers (https://wiki.skyxengine.com/index.php?title=Организация_шейдеров_материалов#Константы)
*/
PSO_Gbuffer CreateGbuffer(half4 vColor, half3 vNormal, half4 vParam, half4 vWVPposition, half4 vNearFarLayers)
{
PSO_Gbuffer OUT;
OUT.vColor = vColor;
vNormal = normalize(vNormal);
//OUT.vNormal.xyz = vNormal * 0.5 + 0.5;
OUT.vNormal.xyz = NormalEncode(vNormal, vNearFarLayers.w);
OUT.vNormal.w = vNearFarLayers.z;
//OUT.vNormal.z = vNearFarLayers.w;
OUT.vParam = vParam;
OUT.vDepth = ComDepthByPosVec4(vPosition,vNearFarLayers.xy);
OUT.vDepth = ComDepthByPosVec4(vWVPposition,vNearFarLayers.xy);
return OUT;
}
......
/*
mtrlgeom_mrbase.ps
mtrlgeom_mr.ps
Рендер геометрии с микрорельефом
*/
......
/*
mtrlgeom_mrbase_det1.ps
mtrlgeom_mr_det1.ps
Рендер геометрии с микрорельефом и детальной текстурой
*/
......
/*
mtrlgeom_mrbase_mr1_det1.ps
mtrlgeom_mr_mr1_det1.ps
Рендер геометрии с микрорельефом, детальной текстурой и микрорельефом для нее
*/
......
/*
mtrlgeom_reflect_cube_mrbase.vs
mtrlgeom_reflect_cube_mr.vs
Рендер геометрии с объемным (кубическим) отражением и микрорельефом
*/
......
......@@ -19,21 +19,37 @@ half3 g_vBoundMin : register(GREEN_R_BBMIN);
//##########################################################################
void main(in VSI_Green IN, out VSO_SceneCommon OUT)
VSO_SceneCommon main(in VSI_Green IN)
{
VSO_SceneCommon OUT;
// расчет поворота нормали
OUT.vNormal = GreenComRotation(normalize(IN.vNormal), IN.vInstSinCosRot);
// расчет поворота позиции
OUT.vPosition.xyz = GreenComRotation(IN.vPosition, IN.vInstSinCosRot);
// расчет коэффициента уменьшения растительности по объему
half fMultiplier = GrassComMultiplier(IN.vInstPos, g_vViewPos, g_vDistLessening);
// расчет мировой позиции
OUT.vPosition = GreenTransformPos(
GreenComRotation(IN.vPosition, IN.vInstSinCosRot),
OUT.vPosition.xyz,
IN.vInstTrans.x,
GrassComMultiplier(IN.vInstPos, g_vViewPos, g_vDistLessening),
fMultiplier,
IN.vInstPos
);
// расчет затенености вершины, на основании отдаленности от центра ограничивающей сферы
half fShading = GreenComShadingBySphere(g_vBoundSphere, IN.vPosition.xyz);
OUT.vPosition = mul(OUT.vPosition, g_mWVP);
OUT.vPos = OUT.vPosition;
OUT.vPos.w = length(g_vBoundSphere.xyz - IN.vPosition.xyz) / g_vBoundSphere.w;
OUT.vPos.w *= OUT.vPos.w;
OUT.vPos.w = fShading;
OUT.vTexUV = IN.vTexUV;
return OUT;
}
\ No newline at end of file
......@@ -13,12 +13,19 @@ half4x4 g_mWVP;
//##########################################################################
void main(in VSI_Green IN, out VSO_SceneCommon OUT)
VSO_SceneCommon main(in VSI_Green IN)
{
OUT.vNormal = (GreenComRotation(normalize(IN.vNormal),IN.vInstSinCosRot));
VSO_SceneCommon OUT;
// расчет поворота нормали
OUT.vNormal = GreenComRotation(normalize(IN.vNormal), IN.vInstSinCosRot);
// расчет поворота позиции
OUT.vPosition.xyz = GreenComRotation(IN.vPosition, IN.vInstSinCosRot);
// расчет мировой позиции
OUT.vPosition = GreenTransformPos(
GreenComRotation(IN.vPosition,IN.vInstSinCosRot),
OUT.vPosition.xyz,
IN.vInstTrans.x,
1,
IN.vInstPos
......@@ -29,4 +36,6 @@ void main(in VSI_Green IN, out VSO_SceneCommon OUT)
OUT.vPos = OUT.vPosition;
OUT.vTexUV = IN.vTexUV;
return OUT;
}
\ No newline at end of file
......@@ -16,6 +16,7 @@ half4x4 g_mW;
VSO_SceneCommon main(VSI_Animation IN)
{
// трансформация позиции и нормали вершины
VSO_SceneCommon OUT = SkinAllTransform(IN);
OUT.vPosition = mul(OUT.vPosition, g_mWVP);
......
......@@ -66,10 +66,10 @@ PSO_UnionAlpha main(VSO_PP IN):COLOR0
aNormal[2] = tex2Dlod(g_sNormal, aTexUV[2]);
aNormal[3] = tex2Dlod(g_sNormal, aTexUV[3]);
aIdLayer[0] = int(NormalEncodeLayer(aNormal[0].xyz) * LAYERS_COUNT_MAX);
aIdLayer[1] = int(NormalEncodeLayer(aNormal[1].xyz) * LAYERS_COUNT_MAX);
aIdLayer[2] = int(NormalEncodeLayer(aNormal[2].xyz) * LAYERS_COUNT_MAX);
aIdLayer[3] = int(NormalEncodeLayer(aNormal[3].xyz) * LAYERS_COUNT_MAX);
aIdLayer[0] = int(NormalDecodeLayer(aNormal[0].xyz) * LAYERS_COUNT_MAX);
aIdLayer[1] = int(NormalDecodeLayer(aNormal[1].xyz) * LAYERS_COUNT_MAX);
aIdLayer[2] = int(NormalDecodeLayer(aNormal[2].xyz) * LAYERS_COUNT_MAX);
aIdLayer[3] = int(NormalDecodeLayer(aNormal[3].xyz) * LAYERS_COUNT_MAX);
aIsTransparency[0] = aNormal[0].w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
aIsTransparency[1] = aNormal[1].w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
......
......@@ -23,9 +23,7 @@ half4 main(VSO_PP IN):COLOR0
{
half4 vColor = tex2D(g_sColor,IN.vTexUV);
vColor.r = pow((g_vParam.x * vColor.r) + g_vParam.z, 1.0/g_vParam.y);
vColor.g = pow((g_vParam.x * vColor.g) + g_vParam.z, 1.0/g_vParam.y);
vColor.b = pow((g_vParam.x * vColor.b) + g_vParam.z, 1.0/g_vParam.y);
vColor.rgb = pow((g_vParam.x * vColor.rgb) + g_vParam.z, 1.0/g_vParam.y);
return vColor;
}
\ No newline at end of file
......@@ -76,7 +76,7 @@ half4 main(VSO_ResPos IN):COLOR0
fOcclusion = lerp(1.0, fOcclusion, 0.6);
fOcclusion = pow(fOcclusion, 2);
fOcclusion = lerp(1.0, fOcclusion, saturate((fDepth * g_vNearFar.y)/PP_SSAO_DIST_EMERSION));
//fOcclusion = pow(fOcclusion, 2);
return half4(fOcclusion, fOcclusion, fOcclusion, 1);
}
}
\ No newline at end of file
......@@ -4,7 +4,7 @@ skin.h
Функции/данные трансформации анимационных моделей
*/
half4 g_BufferBoneWorld[128] : register(c16);
half4 g_BufferBoneWorld[128] : register(ANIM_R_DATA);
half3 SkinRotateVec(half4 q, half3 p)
{
......
File deleted
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment