Browse Source
First experimental shader using lightmaps, based on URP's Unlit shader. Needed to change the project's Color Space to Gamma for the lightmapped output to look correct.
readme
First experimental shader using lightmaps, based on URP's Unlit shader. Needed to change the project's Color Space to Gamma for the lightmapped output to look correct.
readme
10 changed files with 375 additions and 9 deletions
-
2Assets/Scripts/Game/GameAssets.cs
-
8Assets/Scripts/VisualStyle.cs
-
8Assets/Shaders.meta
-
303Assets/Shaders/Lightmapped.shader
-
10Assets/Shaders/Lightmapped.shader.meta
-
28Assets/Shaders/LightmappedInput.hlsl
-
10Assets/Shaders/LightmappedInput.hlsl.meta
-
11Assets/Styles/GLQuake/Materials/GLQuake_World.mat
-
2ProjectSettings/GraphicsSettings.asset
-
2ProjectSettings/ProjectSettings.asset
@ -0,0 +1,8 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 96c36a1f940f3094689bb6a4848af311 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -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" |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 91d80b5043d41db478595fab96d6e2c2 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
preprocessorOverride: 0 |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -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 |
|||
@ -0,0 +1,10 @@ |
|||
fileFormatVersion: 2 |
|||
guid: fe2f7d54113588c42925192dff3809e9 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
preprocessorOverride: 0 |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue