////////////////////////////////////////////////////// // MK Toon Meta Program // // // // Created by Michael Kremmel // // www.michaelkremmel.de // // Copyright © 2021 All rights reserved. // ////////////////////////////////////////////////////// #ifndef MK_TOON_META #define MK_TOON_META #if defined(MK_URP) #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" #elif defined(MK_LWRP) #include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/MetaInput.hlsl" #else #include "UnityMetaPass.cginc" #endif #include "../Core.hlsl" #include "Common.hlsl" #include "Data.hlsl" #include "../Surface.hlsl" ///////////////////////////////////////////////////////////////////////////////////////////// // VERTEX SHADER ///////////////////////////////////////////////////////////////////////////////////////////// VertexOutputMeta MetaVert(VertexInputMeta vertexInput) { VertexOutputMeta vertexOutput; INITIALIZE_STRUCT(VertexOutputMeta, vertexOutput); //vertexposition vertexOutput.svPositionClip = ComputeMetaPosition(vertexInput.vertex, vertexInput.staticLightmapUV.xy, vertexInput.dynamicLightmapUV.xy, unity_LightmapST, unity_DynamicLightmapST); //texcoords #if defined(MK_TCM) || defined(MK_TCD) vertexOutput.uv = 0; #endif #if defined(MK_TCM) vertexOutput.uv.xy = vertexInput.texcoord0.xy * _AlbedoMap_ST.xy + _AlbedoMap_ST.zw; #endif #if defined(MK_TCD) vertexOutput.uv.zw = vertexOutput.uv.xy = vertexInput.texcoord0.xy * _DetailMap_ST.xy + _DetailMap_ST.zw; #endif #if defined(MK_VERTCLR) || defined(MK_POLYBRUSH) vertexOutput.color = vertexInput.color; #endif #ifdef EDITOR_VISUALIZATION vertexOutput.vizUV = 0; vertexOutput.lightCoords = 0; if (unity_VisualizationMode == EDITORVIZ_TEXTURE) vertexOutput.vizUV = UnityMetaVizUV(unity_EditorViz_UVIndex, vertexInput.texcoord0.xy, vertexInput.staticLightmapUV.xy, vertexInput.dynamicLightmapUV.xy, unity_EditorViz_Texture_ST); else if (unity_VisualizationMode == EDITORVIZ_SHOWLIGHTMASK) { vertexOutput.vizUV = vertexInput.staticLightmapUV.xy * unity_LightmapST.xy + unity_LightmapST.zw; vertexOutput.lightCoords = mul(unity_EditorViz_WorldToLight, mul(unity_ObjectToWorld, float4(vertexInput.vertex.xyz, 1))); } #endif #if defined(MK_PARALLAX) vertexOutput.viewTangent = ComputeViewTangent(ComputeViewObject(vertexInput.vertex.xyz), vertexInput.normal, vertexInput.tangent, cross(vertexInput.normal, vertexInput.tangent.xyz) * vertexInput.tangent.w * unity_WorldTransformParams.w); #endif return vertexOutput; } ///////////////////////////////////////////////////////////////////////////////////////////// // FRAGMENT SHADER ///////////////////////////////////////////////////////////////////////////////////////////// half4 MetaFrag (VertexOutputMeta vertexOutput) : SV_Target { MKMetaData mkMetaData; INITIALIZE_STRUCT(MKMetaData, mkMetaData); MKSurfaceData surfaceData = ComputeSurfaceData ( PASS_POSITION_WORLD_ARG(0) PASS_FOG_FACTOR_WORLD_ARG(0) PASS_BASE_UV_ARG(float4(vertexOutput.uv.xy, 0, 0)) PASS_LIGHTMAP_UV_ARG(0) PASS_VERTEX_COLOR_ARG(vertexOutput.color) PASS_NORMAL_WORLD_ARG(1) PASS_VERTEX_LIGHTING_ARG(0) PASS_TANGENT_WORLD_ARG(1) PASS_VIEW_TANGENT_ARG(vertexOutput.viewTangent) PASS_BITANGENT_WORLD_ARG(1) PASS_POSITION_CLIP_ARG(0) PASS_NULL_CLIP_ARG(0) PASS_FLIPBOOK_UV_ARG(0) ); Surface surface = InitSurface(surfaceData, PASS_TEXTURE_2D(_AlbedoMap, SAMPLER_REPEAT_MAIN), _AlbedoColor); #ifdef MK_LIT MKPBSData mkPBSData; mkPBSData = ComputePBSData(surface, surfaceData); #ifdef EDITOR_VISUALIZATION mkMetaData.albedo = mkPBSData.diffuseRadiance; mkMetaData.vizUV = vertexOutput.vizUV; mkMetaData.lightCoords = vertexOutput.lightCoords; #else mkMetaData.albedo = mkPBSData.diffuseRadiance + mkPBSData.specularRadiance * mkPBSData.roughness * 0.5; #endif mkMetaData.specular = mkPBSData.specularRadiance; #else #ifdef EDITOR_VISUALIZATION mkMetaData.albedo = surface.albedo; mkMetaData.vizUV = vertexOutput.vizUV; mkMetaData.lightCoords = vertexOutput.lightCoords; #else mkMetaData.albedo = surface.albedo; #endif mkMetaData.specular = 0; #endif #ifdef MK_EMISSION #if defined(MK_EMISSION_MAP) mkMetaData.emission = _EmissionColor * SampleTex2D(PASS_TEXTURE_2D(_EmissionMap, SAMPLER_REPEAT_MAIN), vertexOutput.uv).rgb; #else mkMetaData.emission = _EmissionColor; #endif #else mkMetaData.emission = 0; #endif return ComputeMetaOutput(mkMetaData); } #endif