/* * The MIT License * * Copyright 2018-2021 whiteflare. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef INC_UNLIT_WF_COMMON_BUILTIN_RP #define INC_UNLIT_WF_COMMON_BUILTIN_RP #include "UnityCG.cginc" #include "Lighting.cginc" //////////////////////////// // Texture Definition //////////////////////////// #define DECL_MAIN_TEX2D(name) UNITY_DECLARE_TEX2D(name) #define PICK_MAIN_TEX2D(tex, uv) UNITY_SAMPLE_TEX2D(tex, uv) #define DECL_SUB_TEX2D(name) UNITY_DECLARE_TEX2D_NOSAMPLER(name) #define PICK_SUB_TEX2D(tex, name, uv) UNITY_SAMPLE_TEX2D_SAMPLER(tex, name, uv) #define DECL_MAIN_TEXCUBE(name) UNITY_DECLARE_TEXCUBE(name) #define PICK_MAIN_TEXCUBE_LOD(tex, dir, lod) UNITY_SAMPLE_TEXCUBE_LOD(tex, dir, lod) #define PICK_SUB_TEXCUBE_LOD(tex, name, dir, lod) UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(tex, name, dir, lod) #ifdef SHADER_API_D3D11 #define DECL_VERT_TEX2D(name) UNITY_DECLARE_TEX2D(name) #define PICK_VERT_TEX2D_LOD(tex, uv, lod) tex.SampleLevel(sampler##tex, uv, lod) #else #define DECL_VERT_TEX2D(name) sampler2D name #define PICK_VERT_TEX2D_LOD(tex, uv, lod) tex2Dlod(tex, float4(uv.x, uv.y, 0, lod)) #endif //////////////////////////// // Compatible //////////////////////////// #define UnityObjectToWorldPos(v) ( mul(unity_ObjectToWorld, float4(v.xyz, 1)).xyz ) #define UnityWorldToObjectPos(v) ( mul(unity_WorldToObject, float4(v.xyz, 1)).xyz ) //////////////////////////// // Lighting //////////////////////////// float3 getMainLightDirection() { return _WorldSpaceLightPos0.xyz; } float3 sampleMainLightColor() { return _LightColor0.rgb; } float3 sampleSHLightColor() { float3 col = float3(0, 0, 0); col += ShadeSH9( float4(+1, 0, 0, 1) ); col += ShadeSH9( float4(-1, 0, 0, 1) ); col += ShadeSH9( float4(0, 0, +1, 1) ); col += ShadeSH9( float4(0, 0, -1, 1) ); col /= 4; col += ShadeSH9( float4(0, +1, 0, 1) ); col += ShadeSH9( float4(0, -1, 0, 1) ); return col / 3; } float3 getPoint1LightPos() { return float3(unity_4LightPosX0.x, unity_4LightPosY0.x, unity_4LightPosZ0.x); } float3 samplePoint1LightColor(float3 ws_vertex) { float3 ws_lightPos = getPoint1LightPos(); if (ws_lightPos.x == 0 && ws_lightPos.y == 0 && ws_lightPos.z == 0) { return float3(0, 0, 0); // XYZすべて0はポイントライト未設定と判定する } float3 ls_lightPos = ws_lightPos - ws_vertex; float lengthSq = dot(ls_lightPos, ls_lightPos); float atten = 1.0 / (1.0 + lengthSq * unity_4LightAtten0.x); return unity_LightColor[0].rgb * atten; } float3 OmniDirectional_Shade4PointLights( float4 lpX, float4 lpY, float4 lpZ, float3 col0, float3 col1, float3 col2, float3 col3, float4 lightAttenSq, float3 ws_vertex) { // UnityCG.cginc にある Shade4PointLights の等方向版 if ( !any(float3(lpX.x, lpY.x, lpZ.x)) ) { col0.rgb = 0; } float4 toLightX = lpX - ws_vertex.x; float4 toLightY = lpY - ws_vertex.y; float4 toLightZ = lpZ - ws_vertex.z; float4 lengthSq = toLightX * toLightX + toLightY * toLightY + toLightZ * toLightZ; // ws_normal との内積は取らない。これによって反射光の強さではなく、頂点に当たるライトの強さが取れる。 // attenuation float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); float3 col = col0 * atten.x + col1 * atten.y + col2 * atten.z + col3 * atten.w; return col; } float3 sampleAdditionalLightColor(float3 ws_vertex) { return OmniDirectional_Shade4PointLights( unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb, unity_4LightAtten0, ws_vertex ); } float3 sampleAdditionalLightColorExclude1(float3 ws_vertex) { return OmniDirectional_Shade4PointLights( unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, float3(0, 0, 0), unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb, unity_4LightAtten0, ws_vertex ); } //////////////////////////// // Lightmap Sampler //////////////////////////// float3 pickLightmap(float2 uv_lmap) { float3 color = float3(0, 0, 0); #ifdef LIGHTMAP_ON { float2 uv = uv_lmap.xy * unity_LightmapST.xy + unity_LightmapST.zw; float4 lmap_tex = PICK_MAIN_TEX2D(unity_Lightmap, uv); float3 lmap_color = DecodeLightmap(lmap_tex); color += lmap_color; } #endif #ifdef DYNAMICLIGHTMAP_ON { float2 uv = uv_lmap.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; float4 lmap_tex = PICK_MAIN_TEX2D(unity_DynamicLightmap, uv); float3 lmap_color = DecodeRealtimeLightmap(lmap_tex); color += lmap_color; } #endif return color; } float3 pickLightmapLod(float2 uv_lmap) { float3 color = float3(0, 0, 0); #ifdef LIGHTMAP_ON { float2 uv = uv_lmap.xy * unity_LightmapST.xy + unity_LightmapST.zw; float4 lmap_tex = PICK_VERT_TEX2D_LOD(unity_Lightmap, uv, 0); float3 lmap_color = DecodeLightmap(lmap_tex); color += lmap_color; } #endif #ifdef DYNAMICLIGHTMAP_ON { float2 uv = uv_lmap.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; float4 lmap_tex = PICK_VERT_TEX2D_LOD(unity_DynamicLightmap, uv, 0); float3 lmap_color = DecodeRealtimeLightmap(lmap_tex); color += lmap_color; } #endif return color; } //////////////////////////// // ReflectionProbe Sampler //////////////////////////// float4 pickReflectionProbe(float3 ws_vertex, float3 ws_normal, float lod) { float3 ws_camera_dir = normalize(_WorldSpaceCameraPos - ws_vertex); float3 reflect_dir = reflect(-ws_camera_dir, ws_normal); float3 dir0 = BoxProjectedCubemapDirection(reflect_dir, ws_vertex, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); float3 dir1 = BoxProjectedCubemapDirection(reflect_dir, ws_vertex, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); float4 color0 = PICK_MAIN_TEXCUBE_LOD(unity_SpecCube0, dir0, lod); float4 color1 = PICK_SUB_TEXCUBE_LOD(unity_SpecCube1, unity_SpecCube0, dir1, lod); color0.rgb = DecodeHDR(color0, unity_SpecCube0_HDR); color1.rgb = DecodeHDR(color1, unity_SpecCube1_HDR); return lerp(color1, color0, unity_SpecCube0_BoxMin.w); } #endif