From 8c01dbfd5b178a529c2df5c9f9a34b64b9fca731 Mon Sep 17 00:00:00 2001 From: D-AIRY <admin@ds-servers.com> Date: Tue, 21 Apr 2020 23:40:30 +0300 Subject: [PATCH] Shader switches counter; Terrain shader (beta); Some improvements --- build/engine/shaders/default/terrain.ps | 131 +++++++++++++++++ .../engine/shaders/lighting/lighting_blend.ps | 6 +- build/engine/shaders/ppgensm/ppgensm_pssm.ps | 3 +- build/engine/shaders/sky/sky_box.ps | 6 +- sdks/graphix | 2 +- source/game/GameData.cpp | 2 + source/render/RenderPipeline.cpp | 135 +++++++++++++++++- 7 files changed, 276 insertions(+), 9 deletions(-) create mode 100644 build/engine/shaders/default/terrain.ps diff --git a/build/engine/shaders/default/terrain.ps b/build/engine/shaders/default/terrain.ps new file mode 100644 index 000000000..9a3f57755 --- /dev/null +++ b/build/engine/shaders/default/terrain.ps @@ -0,0 +1,131 @@ +#ifdef COMPILE_MainGBuffer +XMaterial MainGBuffer(PSI_XMaterial IN) +{ + XMaterial OUT = XMATERIAL_LOAD_DEFAULTS(); + + float2 vDetailUV = IN.vTexUV * g_xMaterialConstants.terrain_detail_scale; + float2 vBaseUV = IN.vTexUV * g_xMaterialConstants.terrain_base_scale; + float2 vMaskUV = IN.vTexUV * g_xMaterialConstants.terrain_mask_scale; + + float4 vMask = g_txMask.Sample(g_sScene, vMaskUV); + + float4 vBaseColor = g_txBase.Sample(g_sScene, vBaseUV); + + float4 vColor = g_txDetail0.Sample(g_sScene, vDetailUV) * vMask.x; + vColor += g_txDetail1.Sample(g_sScene, vDetailUV) * vMask.y; + vColor += g_txDetail2.Sample(g_sScene, vDetailUV) * vMask.z; + vColor += g_txDetail3.Sample(g_sScene, vDetailUV) * vMask.w; + + + float4 vParams = (float4)0; +#ifdef HAS_PARAMMAP_0 + vParams += g_txParameters0.Sample(g_sScene, vDetailUV) * vMask.x; +#else + vParams += float4(g_xMaterialConstants.pbr_roughness_0, g_xMaterialConstants.pbr_metallic_0, g_xMaterialConstants.pbr_thickness_0, g_xMaterialConstants.pbr_ao_0) * vMask.x; +#endif + +#ifdef HAS_PARAMMAP_1 + vParams += g_txParameters1.Sample(g_sScene, vDetailUV) * vMask.y; +#else + vParams += float4(g_xMaterialConstants.pbr_roughness_1, g_xMaterialConstants.pbr_metallic_1, g_xMaterialConstants.pbr_thickness_1, g_xMaterialConstants.pbr_ao_1) * vMask.y; +#endif + +#ifdef HAS_PARAMMAP_2 + vParams += g_txParameters2.Sample(g_sScene, vDetailUV) * vMask.z; +#else + vParams += float4(g_xMaterialConstants.pbr_roughness_2, g_xMaterialConstants.pbr_metallic_2, g_xMaterialConstants.pbr_thickness_2, g_xMaterialConstants.pbr_ao_2) * vMask.z; +#endif + +#ifdef HAS_PARAMMAP_3 + vParams += g_txParameters3.Sample(g_sScene, vDetailUV) * vMask.w; +#else + vParams += float4(g_xMaterialConstants.pbr_roughness_3, g_xMaterialConstants.pbr_metallic_3, g_xMaterialConstants.pbr_thickness_3, g_xMaterialConstants.pbr_ao_3) * vMask.w; +#endif + + + + float3 vNormal = (float3)0; +#ifdef HAS_NORMALMAP_0 + vNormal += Color2Normal(g_txNormals0.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_0 * vMask.x; +#endif + +#ifdef HAS_NORMALMAP_1 + vNormal += Color2Normal(g_txNormals1.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_1 * vMask.y; +#endif + +#ifdef HAS_NORMALMAP_2 + vNormal += Color2Normal(g_txNormals2.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_2 * vMask.z; +#endif + +#ifdef HAS_NORMALMAP_3 + vNormal += Color2Normal(g_txNormals3.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_3 * vMask.w; +#endif + + // float fMixFactor = min(1.0f, length(vMask)); + float fMixFactor = min(1.0f, vMask.x + vMask.y + vMask.z + vMask.w); + + OUT.vBaseColor = lerp(vBaseColor.xyz, vColor.xyz, fMixFactor); + +#ifdef HAS_PARAMMAP + float4 vBaseParams = g_txParameters.Sample(g_sScene, vBaseUV) * vMask.x; +#else + float4 vBaseParams = float4(g_xMaterialConstants.pbr_roughness, g_xMaterialConstants.pbr_metallic, g_xMaterialConstants.pbr_thickness, g_xMaterialConstants.pbr_ao); +#endif + + vParams = lerp(vBaseParams, vParams, fMixFactor); + + OUT.fRoughness = vParams.x; + OUT.fMetallic = vParams.y; + OUT.fThickness = vParams.z; + OUT.fAO = vParams.w; + + OUT.vNormal = MixNormalMicro(IN.vNormal, vNormal); + + OUT.f0 = 0.004; + + return(OUT); +} +#endif + +#ifdef COMPILE_MainShadow +XMaterial MainShadow(PSI_XMaterial IN) +{ + XMaterial OUT = XMATERIAL_LOAD_DEFAULTS(); + + float2 vDetailUV = IN.vTexUV * g_xMaterialConstants.terrain_detail_scale; + float2 vBaseUV = IN.vTexUV * g_xMaterialConstants.terrain_base_scale; + float2 vMaskUV = IN.vTexUV * g_xMaterialConstants.terrain_mask_scale; + + float4 vBaseColor = g_txBase.Sample(g_sScene, vBaseUV); + + // float4 vMask = g_txMask.Sample(g_sScene, vMaskUV); + + + // float4 vColor = g_txDetail0.Sample(g_sScene, vDetailUV) * vMask.x; + // vColor += g_txDetail1.Sample(g_sScene, vDetailUV) * vMask.y; + // vColor += g_txDetail2.Sample(g_sScene, vDetailUV) * vMask.z; + // vColor += g_txDetail3.Sample(g_sScene, vDetailUV) * vMask.w; + + + // OUT.vBaseColor = lerp(vBaseColor.xyz, vColor.xyz, min(1.0f, vMask.x + vMask.y + vMask.z + vMask.w)); + OUT.vBaseColor = vBaseColor; + OUT.vNormal = IN.vNormal; + + return(OUT); +} +#endif + + + + + + + + + + + + + + + diff --git a/build/engine/shaders/lighting/lighting_blend.ps b/build/engine/shaders/lighting/lighting_blend.ps index 3996df695..bf183071e 100644 --- a/build/engine/shaders/lighting/lighting_blend.ps +++ b/build/engine/shaders/lighting/lighting_blend.ps @@ -101,11 +101,13 @@ float4 main(VSO_ResPos IN):COLOR0 float4 vNormals = g_txNormals.Sample(g_sPointClamp, IN.vTexUV); float4 vParams = g_txParameters.Sample(g_sPointClamp, IN.vTexUV); + float fF0 = vNormals.w; + float4 vPosition = float4(g_vPosCam.xyz + IN.vWorldRay * fDepth, 1.0); float3 vNormalPixel = normalize(NormalDecode(vNormals.xyz).xyz); - vColor.rgb += (1.0f - vParams.x) * GetReflection(vPosition.xyz, vNormalPixel) * lerp((float)1.0f, vAlbedo, vParams.y) * vAlbedo.w * 0.1f; - // vColor.rgb += /* (1.0f - vParams.x) * /GetReflection(vPosition.xyz, vNormalPixel) * lerp((float)1.0f, vAlbedo, vParams.y) * vAlbedo.w * 0.1f; + // vColor.rgb += (1.0f - vParams.x) * GetReflection(vPosition.xyz, vNormalPixel) * lerp((float3)(0.1f * fF0), vAlbedo, vParams.y) * vAlbedo.w; + vColor.rgb += (1.0f - vParams.x) * GetReflection(vPosition.xyz, vNormalPixel) * lerp((float3)fF0, vAlbedo, vParams.y) * vAlbedo.w; float fAdaptedLum = 0.2f; diff --git a/build/engine/shaders/ppgensm/ppgensm_pssm.ps b/build/engine/shaders/ppgensm/ppgensm_pssm.ps index f6d5ad9de..02fc59417 100644 --- a/build/engine/shaders/ppgensm/ppgensm_pssm.ps +++ b/build/engine/shaders/ppgensm/ppgensm_pssm.ps @@ -115,7 +115,8 @@ float4 main(VSO_ResPos IN): COLOR0 // float constantBias = 0.000001f; float fDoubledInversedViewWidth = g_mMatrixTextureV[split][0][0]; - float constantBias = delta * 0.0007f/* * pow(2, split) */ /* * pow(1.0 / fDoubledInversedViewWidth, 1.0f + (float)split) */ / fDoubledInversedViewWidth; + // float constantBias = delta * 0.0007f/* * pow(2, split) */ /* * pow(1.0 / fDoubledInversedViewWidth, 1.0f + (float)split) */ / fDoubledInversedViewWidth; + float constantBias = delta * 0.007f/* * pow(2, split) */ /* * pow(1.0 / fDoubledInversedViewWidth, 1.0f + (float)split) */ / fDoubledInversedViewWidth; /** Compute Adaptive Epsilon **/ diff --git a/build/engine/shaders/sky/sky_box.ps b/build/engine/shaders/sky/sky_box.ps index f0d4c324d..a1450118a 100644 --- a/build/engine/shaders/sky/sky_box.ps +++ b/build/engine/shaders/sky/sky_box.ps @@ -4,9 +4,9 @@ sky_box.ps Рендер SkyBox */ -#include "../struct.h" -#include "../mtrl.h" -#include "../const.h" +#include <struct.h> +#include <mtrl.h> +#include <const.h> //########################################################################## diff --git a/sdks/graphix b/sdks/graphix index fd27b5863..f51cd7c4f 160000 --- a/sdks/graphix +++ b/sdks/graphix @@ -1 +1 @@ -Subproject commit fd27b586381e6272686558c5fc8376e93b913fef +Subproject commit f51cd7c4f4192ef34d0f567cf742d73b34a447e8 diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp index 21759e2f2..54a1292b7 100644 --- a/source/game/GameData.cpp +++ b/source/game/GameData.cpp @@ -1274,6 +1274,7 @@ void GameData::render() L"Total memory: %uMB\n" L"Used memory: %.3fMB; (T: %.3fMB; RT: %.3fMB; VB: %.3fMB, IB: %.3fMB, SC: %.3fKB)\n" L"Uploaded bytes: %u; (T: %u; VB: %u, IB: %u, SC: %u)\n" + L"Shader switches: %u\n" L"Count poly: %u\n" L"Count DIP: %u\n" , g_uFPS, @@ -1294,6 +1295,7 @@ void GameData::render() pFrameStats->uUploadedBuffersIndices, pFrameStats->uUploadedBuffersShaderConst, + pFrameStats->uShaderSwitches, pFrameStats->uPolyCount, pFrameStats->uDIPcount ); diff --git a/source/render/RenderPipeline.cpp b/source/render/RenderPipeline.cpp index 5aebe0cdd..414d05601 100644 --- a/source/render/RenderPipeline.cpp +++ b/source/render/RenderPipeline.cpp @@ -246,7 +246,7 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice): // parameter name, define_if_supplied XMATERIAL_PARAM_TEXTURE_OPT("Normal map", "txNormals", "HAS_NORMALMAP"), XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP"), - XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", 1.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", -1.0f, 1.0f, 1.0f), XMATERIAL_PARAM_GROUP_END(), // parameter name, material parameter name, define_if_set XMATERIAL_PARAM_FLAG("Use param texture", "has_parameter_texture", "HAS_PARAMMAP"), @@ -272,6 +272,137 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice): m_pMaterialSystem->registerMaterialShader("Default", pVertexFormatSceneGeneric, pPasses, pGenericProperties); } + { + XMaterialShaderSampler pSamplers[] = { + {"sDefault", GXSamplerDesc()}, + XMATERIAL_SHADER_SAMPLER_LIST_END() + }; + + XMaterialShaderPass pPasses[] = { + {m_pRenderPassGBuffer, "default/terrain.ps", "MainGBuffer", NULL, pSamplers, NULL}, + {m_pRenderPassShadow, "default/terrain.ps", "MainShadow", NULL, NULL, NULL}, + XMATERIAL_SHADER_PASS_LIST_END() + }; + + XMaterialProperty pGenericProperties[] = { + // parameter name, texture name + XMATERIAL_PARAM_TEXTURE("Base texture", "txBase"), + + XMATERIAL_PARAM_TEXTURE("Mask texture", "txMask"), + XMATERIAL_PARAM_TEXTURE("Detail texture 0", "txDetail0"), + XMATERIAL_PARAM_TEXTURE("Detail texture 1", "txDetail1"), + XMATERIAL_PARAM_TEXTURE("Detail texture 2", "txDetail2"), + XMATERIAL_PARAM_TEXTURE("Detail texture 3", "txDetail3"), + + XMATERIAL_PARAM_RANGE("Base scale", "terrain_base_scale", 0.0f, 100.0f, 2.0f), + XMATERIAL_PARAM_RANGE("Detail scale", "terrain_detail_scale", 0.0f, 100.0f, 10.0f), + XMATERIAL_PARAM_RANGE("Mask scale", "terrain_mask_scale", 0.0f, 100.0f, 1.0f), + + //XMATERIAL_PARAM_TEXTURE_OPT("Normal map", "txNormals", "HAS_NORMALMAP"), + //XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP"), + // XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", -1.0f, 1.0f, 1.0f), + //XMATERIAL_PARAM_GROUP_END(), + + // XMATERIAL_PARAM_FLAG("Use param texture", "has_parameter_texture", "HAS_PARAMMAP"), + // // group name (optional), condition (define) + // XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP"), + // XMATERIAL_PARAM_TEXTURE("Param texture", "txParameters"), + // XMATERIAL_PARAM_GROUP_END(), + // XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP"), + // name, min, max, material parameter name + XMATERIAL_PARAM_RANGE("Roughness", "pbr_roughness", 0.0f, 1.0f, 0.9f), + XMATERIAL_PARAM_RANGE("Metallic", "pbr_metallic", 0.0f, 1.0f, 0.0f), + XMATERIAL_PARAM_RANGE("Thickness", "pbr_thickness", 0.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("AO", "pbr_ao", 0.0f, 1.0f, 1.0f), + // XMATERIAL_PARAM_GROUP_END(), + + + XMATERIAL_PARAM_TEXTURE_OPT("Normal map 0", "txNormals0", "HAS_NORMALMAP_0"), + XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_0"), + XMATERIAL_PARAM_RANGE("Normalmap 0 weight", "nm_weight_0", -1.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_GROUP_END(), + + // parameter name, material parameter name, define_if_set + // XMATERIAL_PARAM_FLAG("Use param texture 0", "has_parameter_texture_0", "HAS_PARAMMAP_0"), + // // group name (optional), condition (define) + // XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_0"), + // XMATERIAL_PARAM_TEXTURE("Param texture 0", "txParameters0"), + // XMATERIAL_PARAM_GROUP_END(), + // XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_0"), + // name, min, max, material parameter name + XMATERIAL_PARAM_RANGE("Roughness 0", "pbr_roughness_0", 0.0f, 1.0f, 0.9f), + XMATERIAL_PARAM_RANGE("Metallic 0", "pbr_metallic_0", 0.0f, 1.0f, 0.0f), + XMATERIAL_PARAM_RANGE("Thickness 0", "pbr_thickness_0", 0.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("AO 0", "pbr_ao_0", 0.0f, 1.0f, 1.0f), + // XMATERIAL_PARAM_GROUP_END(), + + + XMATERIAL_PARAM_TEXTURE_OPT("Normal map 1", "txNormals1", "HAS_NORMALMAP_1"), + XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_1"), + XMATERIAL_PARAM_RANGE("Normalmap 1 weight", "nm_weight_1", -1.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_GROUP_END(), + + // parameter name, material parameter name, define_if_set + // XMATERIAL_PARAM_FLAG("Use param texture 1", "has_parameter_texture_1", "HAS_PARAMMAP_1"), + // // group name (optional), condition (define) + // XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_1"), + // XMATERIAL_PARAM_TEXTURE("Param texture 1", "txParameters1"), + // XMATERIAL_PARAM_GROUP_END(), + // XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_1"), + // name, min, max, material parameter name + XMATERIAL_PARAM_RANGE("Roughness 1", "pbr_roughness_1", 0.0f, 1.0f, 0.9f), + XMATERIAL_PARAM_RANGE("Metallic 1", "pbr_metallic_1", 0.0f, 1.0f, 0.0f), + XMATERIAL_PARAM_RANGE("Thickness 1", "pbr_thickness_1", 0.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("AO 1", "pbr_ao_1", 0.0f, 1.0f, 1.0f), + // XMATERIAL_PARAM_GROUP_END(), + + + + XMATERIAL_PARAM_TEXTURE_OPT("Normal map 2", "txNormals2", "HAS_NORMALMAP_2"), + XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_2"), + XMATERIAL_PARAM_RANGE("Normalmap 2 weight", "nm_weight_2", -1.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_GROUP_END(), + + // parameter name, material parameter name, define_if_set + // XMATERIAL_PARAM_FLAG("Use param texture 2", "has_parameter_texture_2", "HAS_PARAMMAP_2"), + // // group name (optional), condition (define) + // XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_2"), + // XMATERIAL_PARAM_TEXTURE("Param texture 2", "txParameters2"), + // XMATERIAL_PARAM_GROUP_END(), + // XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_2"), + // name, min, max, material parameter name + XMATERIAL_PARAM_RANGE("Roughness 2", "pbr_roughness_2", 0.0f, 1.0f, 0.9f), + XMATERIAL_PARAM_RANGE("Metallic 2", "pbr_metallic_2", 0.0f, 1.0f, 0.0f), + XMATERIAL_PARAM_RANGE("Thickness 2", "pbr_thickness_2", 0.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("AO 2", "pbr_ao_2", 0.0f, 1.0f, 1.0f), + // XMATERIAL_PARAM_GROUP_END(), + + + XMATERIAL_PARAM_TEXTURE_OPT("Normal map 3", "txNormals3", "HAS_NORMALMAP_3"), + XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_3"), + XMATERIAL_PARAM_RANGE("Normalmap 3 weight", "nm_weight_3", -1.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_GROUP_END(), + + // parameter name, material parameter name, define_if_set + // XMATERIAL_PARAM_FLAG("Use param texture 3", "has_parameter_texture_3", "HAS_PARAMMAP_3"), + // // group name (optional), condition (define) + // XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_3"), + // XMATERIAL_PARAM_TEXTURE("Param texture 3", "txParameters3"), + // XMATERIAL_PARAM_GROUP_END(), + // XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_3"), + // name, min, max, material parameter name + XMATERIAL_PARAM_RANGE("Roughness 3", "pbr_roughness_3", 0.0f, 1.0f, 0.9f), + XMATERIAL_PARAM_RANGE("Metallic 3", "pbr_metallic_3", 0.0f, 1.0f, 0.0f), + XMATERIAL_PARAM_RANGE("Thickness 3", "pbr_thickness_3", 0.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("AO 3", "pbr_ao_3", 0.0f, 1.0f, 1.0f), + // XMATERIAL_PARAM_GROUP_END(), + + XMATERIAL_PROPERTY_LIST_END() + }; + + m_pMaterialSystem->registerMaterialShader("Terrain", pVertexFormatSceneGeneric, pPasses, pGenericProperties); + } + { GXMacro pMacro[] = { {"WANT_WRITE_DEPTH", "1"}, @@ -309,7 +440,7 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice): // parameter name, define_if_supplied XMATERIAL_PARAM_TEXTURE_OPT("Normal map", "txNormals", "HAS_NORMALMAP"), XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP"), - XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", 1.0f, 1.0f, 1.0f), + XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", -1.0f, 1.0f, 1.0f), XMATERIAL_PARAM_GROUP_END(), // parameter name, material parameter name, define_if_set XMATERIAL_PARAM_FLAG("Refraction", "refractive", "HAS_REFRACTION"), -- GitLab