Я создаю видеоигру в Unity.Каждый спрайт визуализируется с помощью рендерера спрайтов с материалом, который имеет CornucopiaShader.shader.У меня проблема в том, что я хочу ограничить максимальную яркость (или цвет) спрайта, чтобы он был просто нормальным изображением спрайта, независимо от того, сколько точечных источников света поражает его, интенсивности источников света, а также рассеянный свет на сцене единства.Когда интенсивность света, падающего на спрайт, ниже этого максимального уровня яркости, я хочу, чтобы он действовал как обычный освещенный спрайт и был черным, если на него не падали огни, и был наполовину освещен, если интенсивность 0,5 поражала его и т. Д.,и все между ними, как обычно. Задача 1: В итоге, если три источника света, скажем, 5, попадают в спрайт, я хочу, чтобы спрайт просто выглядел как обычная яркость 1, а не светился белым светом.
Поскольку проигрывательможет вращаться, как бумага Марио, и переключать стороны, действующий код шейдера действует таким же образом, а также в настоящее время свет, который попадает с задней стороны, также должен освещать обе стороны, как это происходит в настоящее время в шейдере. Проблема 2: Но другая проблема, с которой я столкнулся, как это видно на четырех изображениях, которые я включил, это когда я переворачиваю плеер, интенсивность меняется.
Я пытался выяснить,Эти две проблемы в течение 3 дней подряд и не могут понять это.
Изображение 1
Изображение 2
Изображение 3
Изображение 4
Shader "Custom/CornucopiaShader" {
Properties{
_MainCol("Main Tint", Color) = (1,1,1,1)
_MainTex("Main Texture", 2D) = "white" {}
_Cutoff("Alpha cutoff", Range(0,0.5)) = 0.5
}
SubShader{
Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"}
Cull Off
ZWrite Off
LOD 200
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma surface surf SimpleLambert alphatest:_Cutoff addshadow fullforwardshadows alpha:blend
#pragma target 3.0
#include "RetroAA.cginc"
sampler2D _MainTex;
float4 _MainTex_TexelSize;
fixed4 _MainCol;
half4 LightingSimpleLambert(SurfaceOutput s, half3 lightDir, half atten)
{
half4 c;
c.rgb = s.Albedo * _MainCol.rgb * (atten)* _LightColor0.rgb;
c.a = s.Alpha;
return c;
}
struct Input {
float2 uv_MainTex;
};
void surf(Input IN, inout SurfaceOutput o) {
fixed4 c = RetroAA(_MainTex, IN.uv_MainTex, _MainTex_TexelSize);
o.Albedo = lerp(c.rgb, c.rgb, c.a);
o.Alpha = c.a;
}
ENDCG
}
Fallback "Transparent/Cutout/VertexLit"
}
#include "UnityCG.cginc"
#pragma target 3.0
fixed4 RetroAA(sampler2D tex, float2 uv, float4 texelSize){
float2 texelCoord = uv*texelSize.zw;
float2 hfw = 0.5*fwidth(texelCoord);
float2 fl = floor(texelCoord - 0.5) + 0.5;
float2 uvaa = (fl + smoothstep(0.5 - hfw, 0.5 + hfw, texelCoord - fl))*texelSize.xy;
return tex2D(tex, uvaa);
}