diff --git a/Assets/Scripts/Game/GameAssets.cs b/Assets/Scripts/Game/GameAssets.cs index c82e983..88eb99d 100644 --- a/Assets/Scripts/Game/GameAssets.cs +++ b/Assets/Scripts/Game/GameAssets.cs @@ -66,7 +66,7 @@ public class GameAssets { if (!lightmaps.TryGetValue(lightmapNum, out var lightmap)) { - lightmap = new Texture2D(width, height, TextureFormat.RGBA32, true) { name = $"Lightmap_{lightmapNum}" }; + lightmap = new Texture2D(width, height, TextureFormat.RGBA32, false) { name = $"Lightmap_{lightmapNum}" }; lightmaps.Add(lightmapNum, lightmap); } diff --git a/Assets/Scripts/VisualStyle.cs b/Assets/Scripts/VisualStyle.cs index 95692d3..d5a46f2 100644 --- a/Assets/Scripts/VisualStyle.cs +++ b/Assets/Scripts/VisualStyle.cs @@ -97,8 +97,12 @@ public class VisualStyle : ScriptableObject material.EnableKeyword("_EMISSION"); else material.DisableKeyword("_EMISSION"); - - // TODO: lightmap texture + + if (lightmap != null) + { + material.SetTexture("_LightMap", lightmap); + // TODO enable keyword (shader is still very specific) + } } } diff --git a/Assets/Shaders.meta b/Assets/Shaders.meta new file mode 100644 index 0000000..5feb358 --- /dev/null +++ b/Assets/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96c36a1f940f3094689bb6a4848af311 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Lightmapped.shader b/Assets/Shaders/Lightmapped.shader new file mode 100644 index 0000000..eb64fd2 --- /dev/null +++ b/Assets/Shaders/Lightmapped.shader @@ -0,0 +1,303 @@ +Shader "UniQuake/Lightmapped" +{ + Properties + { + [MainTexture] _BaseMap("Texture", 2D) = "white" {} + [MainColor] _BaseColor("Color", Color) = (1, 1, 1, 1) + _Cutoff("AlphaCutout", Range(0.0, 1.0)) = 0.5 + + [NoScaleOffset] _LightMap("Lightmap", 2D) = "white" {} + + // BlendMode + [HideInInspector] _Surface("__surface", Float) = 0.0 + [HideInInspector] _Blend("__blend", Float) = 0.0 + [HideInInspector] _AlphaClip("__clip", Float) = 0.0 + [HideInInspector] _SrcBlend("Src", Float) = 1.0 + [HideInInspector] _DstBlend("Dst", Float) = 0.0 + [HideInInspector] _ZWrite("ZWrite", Float) = 1.0 + [HideInInspector] _Cull("__cull", Float) = 2.0 + + // Editmode props + [HideInInspector] _QueueOffset("Queue offset", Float) = 0.0 + + // ObsoleteProperties + [HideInInspector] _MainTex("BaseMap", 2D) = "white" {} + [HideInInspector] _Color("Base Color", Color) = (0.5, 0.5, 0.5, 1) + [HideInInspector] _SampleGI("SampleGI", float) = 0.0 // needed from bakedlit + } + SubShader + { + Tags {"RenderType" = "Opaque" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" "ShaderModel"="4.5"} + LOD 100 + + Blend [_SrcBlend][_DstBlend] + ZWrite [_ZWrite] + Cull [_Cull] + + Pass + { + Name "Lightmapped" + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma target 4.5 + + #pragma vertex vert + #pragma fragment frag + #pragma shader_feature_local_fragment _ALPHATEST_ON + #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON + + // ------------------------------------- + // Unity defined keywords + #pragma multi_compile_fog + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON + + #include "LightmappedInput.hlsl" + + struct Attributes + { + float4 positionOS : POSITION; + float2 uv : TEXCOORD0; + float2 uv2 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct Varyings + { + float2 uv : TEXCOORD0; + float2 uv2 : TEXCOORD1; + float4 vertex : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + Varyings vert(Attributes input) + { + Varyings output = (Varyings)0; + + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); + output.vertex = vertexInput.positionCS; + output.uv = TRANSFORM_TEX(input.uv, _BaseMap); + output.uv2 = TRANSFORM_TEX(input.uv2, _LightMap); + //output.fogCoord = ComputeFogFactor(vertexInput.positionCS.z); + + return output; + } + + half4 frag(Varyings input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + + half2 uv = input.uv; + half4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv); + half3 color = texColor.rgb * _BaseColor.rgb; + half alpha = texColor.a * _BaseColor.a; + AlphaDiscard(alpha, _Cutoff); + + half4 lightmapColor = SAMPLE_TEXTURE2D(_LightMap, sampler_LightMap, input.uv2); + color.rgb = color.rgb * lightmapColor.rgb * 2.0f; + //color.rgb = lightmapColor.rgb; + +#ifdef _ALPHAPREMULTIPLY_ON + color *= alpha; +#endif + + //color = MixFog(color, input.fogCoord); + + return half4(color, alpha); + } + ENDHLSL + } + Pass + { + Name "DepthOnly" + Tags{"LightMode" = "DepthOnly"} + + ZWrite On + ColorMask 0 + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma target 4.5 + + #pragma vertex DepthOnlyVertex + #pragma fragment DepthOnlyFragment + + // ------------------------------------- + // Material Keywords + #pragma shader_feature_local_fragment _ALPHATEST_ON + + //-------------------------------------- + // GPU Instancing + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON + + #include "LightmappedInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl" + ENDHLSL + } + + // This pass it not used during regular rendering, only for lightmap baking. + Pass + { + Name "Meta" + Tags{"LightMode" = "Meta"} + + Cull Off + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma target 4.5 + + #pragma vertex UniversalVertexMeta + #pragma fragment UniversalFragmentMetaUnlit + + #include "LightmappedInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitMetaPass.hlsl" + + ENDHLSL + } + } + + SubShader + { + Tags {"RenderType" = "Opaque" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" "ShaderModel"="2.0"} + LOD 100 + + Blend [_SrcBlend][_DstBlend] + ZWrite [_ZWrite] + Cull [_Cull] + + Pass + { + Name "Lightmapped" + HLSLPROGRAM + #pragma only_renderers gles gles3 glcore d3d11 + #pragma target 2.0 + + #pragma vertex vert + #pragma fragment frag + #pragma shader_feature_local_fragment _ALPHATEST_ON + #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON + + // ------------------------------------- + // Unity defined keywords + #pragma multi_compile_fog + #pragma multi_compile_instancing + + #include "LightmappedInput.hlsl" + + struct Attributes + { + float4 positionOS : POSITION; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct Varyings + { + float2 uv : TEXCOORD0; + float fogCoord : TEXCOORD1; + float4 vertex : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + Varyings vert(Attributes input) + { + Varyings output = (Varyings)0; + + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); + output.vertex = vertexInput.positionCS; + output.uv = TRANSFORM_TEX(input.uv, _BaseMap); + output.fogCoord = ComputeFogFactor(vertexInput.positionCS.z); + + return output; + } + + half4 frag(Varyings input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + + half2 uv = input.uv; + half4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv); + half3 color = texColor.rgb * _BaseColor.rgb; + half alpha = texColor.a * _BaseColor.a; + AlphaDiscard(alpha, _Cutoff); + +#ifdef _ALPHAPREMULTIPLY_ON + color *= alpha; +#endif + + color = MixFog(color, input.fogCoord); + alpha = OutputAlpha(alpha, _Surface); + + return half4(color, alpha); + } + ENDHLSL + } + Pass + { + Name "DepthOnly" + Tags{"LightMode" = "DepthOnly"} + + ZWrite On + ColorMask 0 + + HLSLPROGRAM + #pragma only_renderers gles gles3 glcore d3d11 + #pragma target 2.0 + + #pragma vertex DepthOnlyVertex + #pragma fragment DepthOnlyFragment + + // ------------------------------------- + // Material Keywords + #pragma shader_feature_local_fragment _ALPHATEST_ON + + //-------------------------------------- + // GPU Instancing + #pragma multi_compile_instancing + + #include "LightmappedInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl" + ENDHLSL + } + + // This pass it not used during regular rendering, only for lightmap baking. + Pass + { + Name "Meta" + Tags{"LightMode" = "Meta"} + + Cull Off + + HLSLPROGRAM + #pragma only_renderers gles gles3 glcore d3d11 + #pragma target 2.0 + + #pragma vertex UniversalVertexMeta + #pragma fragment UniversalFragmentMetaUnlit + + #include "LightmappedInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitMetaPass.hlsl" + + ENDHLSL + } + } + FallBack "Hidden/Universal Render Pipeline/FallbackError" + //CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.UnlitShader" +} diff --git a/Assets/Shaders/Lightmapped.shader.meta b/Assets/Shaders/Lightmapped.shader.meta new file mode 100644 index 0000000..9471dee --- /dev/null +++ b/Assets/Shaders/Lightmapped.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 91d80b5043d41db478595fab96d6e2c2 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/LightmappedInput.hlsl b/Assets/Shaders/LightmappedInput.hlsl new file mode 100644 index 0000000..b4cddf4 --- /dev/null +++ b/Assets/Shaders/LightmappedInput.hlsl @@ -0,0 +1,28 @@ +#ifndef UNIVERSAL_UNLIT_INPUT_INCLUDED +#define UNIVERSAL_UNLIT_INPUT_INCLUDED + +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl" + +TEXTURE2D(_LightMap); SAMPLER(sampler_LightMap); + +CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _LightMap_ST; + half4 _BaseColor; + half _Cutoff; + half _Surface; +CBUFFER_END + +#ifdef UNITY_DOTS_INSTANCING_ENABLED +UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata) + UNITY_DOTS_INSTANCED_PROP(float4, _BaseColor) + UNITY_DOTS_INSTANCED_PROP(float , _Cutoff) + UNITY_DOTS_INSTANCED_PROP(float , _Surface) +UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata) + +#define _BaseColor UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO(float4 , Metadata__BaseColor) +#define _Cutoff UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO(float , Metadata__Cutoff) +#define _Surface UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO(float , Metadata__Surface) +#endif + +#endif diff --git a/Assets/Shaders/LightmappedInput.hlsl.meta b/Assets/Shaders/LightmappedInput.hlsl.meta new file mode 100644 index 0000000..de4f011 --- /dev/null +++ b/Assets/Shaders/LightmappedInput.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: fe2f7d54113588c42925192dff3809e9 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Styles/GLQuake/Materials/GLQuake_World.mat b/Assets/Styles/GLQuake/Materials/GLQuake_World.mat index f8f23a8..d2ba49e 100644 --- a/Assets/Styles/GLQuake/Materials/GLQuake_World.mat +++ b/Assets/Styles/GLQuake/Materials/GLQuake_World.mat @@ -21,14 +21,13 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: GLQuake_World - m_Shader: {fileID: 4800000, guid: 8d2bb70cbf9db8d4da26e15b26e74248, type: 3} + m_Shader: {fileID: 4800000, guid: 91d80b5043d41db478595fab96d6e2c2, type: 3} m_ShaderKeywords: _EMISSION _RECEIVE_SHADOWS_OFF m_LightmapFlags: 2 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 - m_CustomRenderQueue: 2000 - stringTagMap: - RenderType: Opaque + m_CustomRenderQueue: -1 + stringTagMap: {} disabledShaderPasses: [] m_SavedProperties: serializedVersion: 3 @@ -61,6 +60,10 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _LightMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index 1663460..c5d384e 100644 --- a/ProjectSettings/GraphicsSettings.asset +++ b/ProjectSettings/GraphicsSettings.asset @@ -60,7 +60,7 @@ GraphicsSettings: m_FogKeepExp: 1 m_FogKeepExp2: 1 m_AlbedoSwatchInfos: [] - m_LightsUseLinearIntensity: 1 + m_LightsUseLinearIntensity: 0 m_LightsUseColorTemperature: 0 m_DefaultRenderingLayerMask: 1 m_LogWhenShaderIsCompiled: 0 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index e45e94b..64e25c8 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -47,7 +47,7 @@ PlayerSettings: defaultScreenWidthWeb: 960 defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 - m_ActiveColorSpace: 1 + m_ActiveColorSpace: 0 m_MTRendering: 1 mipStripping: 0 numberOfMipsStripped: 0