From aba2377bf8402f6ffdbf2143ee23db4a38138087 Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Wed, 31 Jan 2018 19:57:43 +0000 Subject: [PATCH] shader refactor fixes --- WickedEngine/envMapGS.hlsl | 4 +- WickedEngine/envMapHF.hlsli | 8 +- WickedEngine/envMapVS.hlsl | 4 +- WickedEngine/envMap_skyGS.hlsl | 4 +- WickedEngine/envMap_skyPS_dynamic.hlsl | 2 +- WickedEngine/envMap_skyPS_static.hlsl | 2 +- WickedEngine/envMap_skyVS.hlsl | 4 +- WickedEngine/objectHF.hlsli | 106 +++---------------------- models/Sample/scene.wimf | Bin 3001601 -> 3001481 bytes 9 files changed, 23 insertions(+), 111 deletions(-) diff --git a/WickedEngine/envMapGS.hlsl b/WickedEngine/envMapGS.hlsl index 4ba1361c1..78b911f68 100644 --- a/WickedEngine/envMapGS.hlsl +++ b/WickedEngine/envMapGS.hlsl @@ -6,12 +6,12 @@ CBUFFER(CubemapRenderCB, CBSLOT_RENDERER_CUBEMAPRENDER) } [maxvertexcount(18)] -void main(triangle VSOut input[3], inout TriangleStream CubeMapStream) +void main(triangle VSOut_EnvmapRendering input[3], inout TriangleStream CubeMapStream) { [unroll] for (int f = 0; f < 6; ++f) { - PSIn output; + PSIn_EnvmapRendering output; output.RTIndex = f; [unroll] for (uint v = 0; v < 3; v++) diff --git a/WickedEngine/envMapHF.hlsli b/WickedEngine/envMapHF.hlsli index 223b18204..ac4cf05a2 100644 --- a/WickedEngine/envMapHF.hlsli +++ b/WickedEngine/envMapHF.hlsli @@ -3,7 +3,7 @@ #include "globals.hlsli" -struct VSOut +struct VSOut_EnvmapRendering { float4 pos : SV_Position; float3 nor : NORMAL; @@ -12,7 +12,7 @@ struct VSOut float ao : AMBIENT_OCCLUSION; }; -struct PSIn +struct PSIn_EnvmapRendering { float4 pos : SV_Position; float3 pos3D : WORLDPOSITION; @@ -24,13 +24,13 @@ struct PSIn }; -struct VSOut_Sky +struct VSOut_Sky_EnvmapRendering { float4 pos : SV_POSITION; float3 nor : NORMAL; }; -struct PSIn_Sky +struct PSIn_Sky_EnvmapRendering { float4 pos : SV_POSITION; float3 nor : NORMAL; diff --git a/WickedEngine/envMapVS.hlsl b/WickedEngine/envMapVS.hlsl index aeab3b814..faab4e865 100644 --- a/WickedEngine/envMapVS.hlsl +++ b/WickedEngine/envMapVS.hlsl @@ -2,9 +2,9 @@ #include "envMapHF.hlsli" -VSOut main(Input_Object_POS_TEX input) +VSOut_EnvmapRendering main(Input_Object_POS_TEX input) { - VSOut Out = (VSOut)0; + VSOut_EnvmapRendering Out; float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); VertexSurface surface = MakeVertexSurfaceFromInput(input); diff --git a/WickedEngine/envMap_skyGS.hlsl b/WickedEngine/envMap_skyGS.hlsl index 690177e5b..7a40fabdd 100644 --- a/WickedEngine/envMap_skyGS.hlsl +++ b/WickedEngine/envMap_skyGS.hlsl @@ -6,11 +6,11 @@ CBUFFER(CubemapRenderCB, CBSLOT_RENDERER_CUBEMAPRENDER) } [maxvertexcount(18)] -void main(triangle VSOut_Sky input[3], inout TriangleStream< PSIn_Sky > CubeMapStream) +void main(triangle VSOut_Sky_EnvmapRendering input[3], inout TriangleStream< PSIn_Sky_EnvmapRendering > CubeMapStream) { for (int f = 0; f < 6; ++f) { - PSIn_Sky output; + PSIn_Sky_EnvmapRendering output; output.RTIndex = f; for (uint v = 0; v < 3; v++) { diff --git a/WickedEngine/envMap_skyPS_dynamic.hlsl b/WickedEngine/envMap_skyPS_dynamic.hlsl index 1f93a3f9a..a658cf45a 100644 --- a/WickedEngine/envMap_skyPS_dynamic.hlsl +++ b/WickedEngine/envMap_skyPS_dynamic.hlsl @@ -2,7 +2,7 @@ #include "lightingHF.hlsli" #include "skyHF.hlsli" -float4 main(PSIn_Sky input) : SV_TARGET +float4 main(PSIn_Sky_EnvmapRendering input) : SV_TARGET { float3 normal = normalize(input.nor); float4 color = float4(GetDynamicSkyColor(normal), 1); diff --git a/WickedEngine/envMap_skyPS_static.hlsl b/WickedEngine/envMap_skyPS_static.hlsl index 766ea072b..417e9833a 100644 --- a/WickedEngine/envMap_skyPS_static.hlsl +++ b/WickedEngine/envMap_skyPS_static.hlsl @@ -3,7 +3,7 @@ TEXTURECUBE(texture_sky, float4, TEXSLOT_ONDEMAND0) -float4 main(PSIn_Sky input) : SV_TARGET +float4 main(PSIn_Sky_EnvmapRendering input) : SV_TARGET { float3 normal = normalize(input.nor); return float4(DEGAMMA(texture_sky.SampleLevel(sampler_linear_clamp, normal, 0).rgb), 1); diff --git a/WickedEngine/envMap_skyVS.hlsl b/WickedEngine/envMap_skyVS.hlsl index e7f92aa2a..da973fe4d 100644 --- a/WickedEngine/envMap_skyVS.hlsl +++ b/WickedEngine/envMap_skyVS.hlsl @@ -1,9 +1,9 @@ #include "envMapHF.hlsli" #include "icosphere.hlsli" -VSOut_Sky main(uint vid : SV_VERTEXID) +VSOut_Sky_EnvmapRendering main(uint vid : SV_VERTEXID) { - VSOut_Sky Out; + VSOut_Sky_EnvmapRendering Out; Out.pos = float4(ICOSPHERE[vid].xyz,0); Out.nor = ICOSPHERE[vid].xyz; return Out; diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli index 7c547d824..39865a4d8 100644 --- a/WickedEngine/objectHF.hlsli +++ b/WickedEngine/objectHF.hlsli @@ -1,7 +1,7 @@ #ifndef _OBJECTSHADER_HF_ #define _OBJECTSHADER_HF_ -#if !(defined(TILEDFORWARD) && !defined(TRANSPARENT)) +#if defined(TILEDFORWARD) && !defined(TRANSPARENT) #define DISABLE_ALPHATEST #endif @@ -164,7 +164,7 @@ inline void ParallaxOcclusionMapping(inout float2 UV, in float3 V, in float3x3 T UV = finalTexCoords; } -inline void Refraction(in float2 ScreenCoord, in float2 normal2D, in float3 bumpColor, in Surface surface, inout float4 color) +inline void Refraction(in float2 ScreenCoord, in float2 normal2D, in float3 bumpColor, inout Surface surface, inout float4 color) { float2 size; float mipLevels; @@ -329,13 +329,16 @@ inline void TiledLighting(in float2 pixel, in Surface surface, inout float3 diff envmapAccumulation.rgb = (1 - envmapAccumulation.a) * (envmapColor.a * envmapColor.rgb) + envmapAccumulation.rgb; envmapAccumulation.a = envmapColor.a + (1 - envmapColor.a) * envmapAccumulation.a; // if the accumulation reached 1, we skip the rest of the probes: - iterator = envmapAccumulation.a < 1 ? iterator : envmapCount - 1; + iterator = envmapAccumulation.a < 1 ? iterator : envmapArrayEnd - 1; } } #endif // DISABLE_LOCALENVPMAPS // Apply global envmap where there is no local envmap information: - envmapAccumulation.rgb = lerp(EnvironmentReflection_Global(surface.P, surface.R, envMapMIP), envmapAccumulation.rgb, envmapAccumulation.a); + if (envmapAccumulation.a < 0.99f) + { + envmapAccumulation.rgb = lerp(EnvironmentReflection_Global(surface.P, surface.R, envMapMIP), envmapAccumulation.rgb, envmapAccumulation.a); + } specular += max(0, envmapAccumulation.rgb * surface.F); @@ -443,7 +446,7 @@ float4 main(PIXELINPUT input) : SV_TARGET #elif defined(TRANSPARENT) float4 main(PIXELINPUT input) : SV_TARGET #elif defined(ENVMAPRENDERING) -float4 main(PSIn input) : SV_TARGET +float4 main(PSIn_EnvmapRendering input) : SV_TARGET #elif defined(DEFERRED) GBUFFEROutputType main(PIXELINPUT input) #elif defined(FORWARD) @@ -594,7 +597,7 @@ GBUFFEROutputType_Thin main(PIXELINPUT input) #endif - // return point: + // end point: #if defined(TRANSPARENT) || defined(TEXTUREONLY) || defined(ENVMAPRENDERING) return color; #else @@ -612,95 +615,4 @@ GBUFFEROutputType_Thin main(PIXELINPUT input) -//// MACROS -////////////// -// -//#define OBJECT_PS_MAKE_SIMPLE \ -// float2 UV = input.tex * g_xMat_texMulAdd.xy + g_xMat_texMulAdd.zw; \ -// float4 color = g_xMat_baseColor * float4(input.instanceColor, 1) * xBaseColorMap.Sample(sampler_objectshader, UV); \ -// color.rgb = DEGAMMA(color.rgb); \ -// ALPHATEST(color.a); \ -// float opacity = color.a; \ -// float emissive = g_xMat_emissive; \ -// float2 pixel = input.pos.xy; -// -// -//#define OBJECT_PS_MAKE_COMMON \ -// OBJECT_PS_MAKE_SIMPLE \ -// float3 diffuse = 0; \ -// float3 specular = 0; \ -// float3 V = g_xCamera_CamPos - input.pos3D; \ -// float dist = length(V); \ -// V /= dist; \ -// Surface surface = CreateSurface(input.pos3D, normalize(input.nor), V, color, \ -// g_xMat_reflectance * xReflectanceMap.Sample(sampler_objectshader, UV).r, \ -// g_xMat_metalness * xMetalnessMap.Sample(sampler_objectshader, UV).r, \ -// g_xMat_roughness * xRoughnessMap.Sample(sampler_objectshader, UV).r, \ -// emissive, g_xMat_subsurfaceScattering); \ -// float3 bumpColor = 0; \ -// float depth = input.pos.z; \ -// float ao = 1; -// -//#define OBJECT_PS_MAKE \ -// OBJECT_PS_MAKE_COMMON \ -// float lineardepth = input.pos2D.w; \ -// float2 refUV = float2(1, -1)*input.ReflectionMapSamplingPos.xy / input.ReflectionMapSamplingPos.w * 0.5f + 0.5f;\ -// float2 ScreenCoord = float2(1, -1) * input.pos2D.xy / input.pos2D.w * 0.5f + 0.5f; \ -// float2 velocity = ((input.pos2DPrev.xy/input.pos2DPrev.w - g_xFrame_TemporalAAJitterPrev) - (input.pos2D.xy/input.pos2D.w - g_xFrame_TemporalAAJitter)) * float2(0.5f, -0.5f); -// -//#define OBJECT_PS_COMPUTETANGENTSPACE \ -// float3 T, B; \ -// float3x3 TBN = compute_tangent_frame(surface.N, surface.P, UV, T, B); -// -//#define OBJECT_PS_NORMALMAPPING \ -// NormalMapping(UV, surface.P, surface.N, TBN, bumpColor); \ -// surface.Update(); -// -//#define OBJECT_PS_PARALLAXOCCLUSIONMAPPING \ -// ParallaxOcclusionMapping(UV, surface.V, TBN); -// -//#define OBJECT_PS_SPECULARANTIALIASING \ -// SpecularAA(surface.N, surface.roughness); -// -//#define OBJECT_PS_REFRACTION \ -// Refraction(ScreenCoord, input.nor2D, bumpColor, surface, color); -// -//#define OBJECT_PS_LIGHT_FORWARD \ -// ForwardLighting(surface, diffuse, specular); -// -//#define OBJECT_PS_LIGHT_TILED \ -// TiledLighting(pixel, surface, diffuse, specular); -// -//#define OBJECT_PS_VOXELRADIANCE \ -// VoxelRadiance(surface, diffuse, specular, ao); -// -//#define OBJECT_PS_LIGHT_END \ -// color.rgb = lerp(1, GetAmbientColor() * ao + diffuse, opacity) * surface.albedo + specular; -// -//#define OBJECT_PS_DITHER \ -// clip(dither(input.pos.xy) - input.dither); -// -//#define OBJECT_PS_PLANARREFLECTIONS \ -// specular = max(specular, PlanarReflection(UV, refUV, surface)); -// -//#define OBJECT_PS_FOG \ -// color.rgb = applyFog(color.rgb, getFog(dist)); -// -//#define OBJECT_PS_OUT_GBUFFER \ -// GBUFFEROutputType Out; \ -// Out.g0 = float4(color.rgb, 1); /*FORMAT_R8G8B8A8_UNORM*/ \ -// Out.g1 = float4(encode(surface.N), velocity); /*FORMAT_R16G16B16_FLOAT*/ \ -// Out.g2 = float4(0, 0, surface.sss, surface.emissive); /*FORMAT_R8G8B8A8_UNORM*/ \ -// Out.g3 = float4(surface.roughness, surface.reflectance, surface.metalness, ao); /*FORMAT_R8G8B8A8_UNORM*/ \ -// return Out; -// -//#define OBJECT_PS_OUT_FORWARD \ -// GBUFFEROutputType_Thin Out; \ -// Out.g0 = color; /*FORMAT_R16G16B16_FLOAT*/ \ -// Out.g1 = float4(encode(surface.N), velocity); /*FORMAT_R16G16B16_FLOAT*/ \ -// return Out; -// -//#define OBJECT_PS_OUT_FORWARD_SIMPLE \ -// return color; - #endif // _OBJECTSHADER_HF_ \ No newline at end of file diff --git a/models/Sample/scene.wimf b/models/Sample/scene.wimf index 88ec763a98f9ac70c4c558558d6ff956754bb408..89aeed991aa6f97ada96d6550722fef258e13eed 100644 GIT binary patch delta 18604 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 delta 19025 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 MHfmYXHr?fa0AoLDkN^Mx