我有一个看起来像这样的GameObject:
当我将GameObject的SpriteRenderer中的"color“值更改为be (255,0,0,255)时,GameObject的结果如下所示:
但我希望它看起来像这样:
我能用什么方法来完成这个任务呢?
我的目标是让它是动态的,这样它就可以从"0%红色“(原始颜色)到"100%红色”(完全红色,除了透明像素)。
例如,我希望50%的红色看起来像这样:
发布于 2023-03-10 13:52:31
经过多次尝试和错误,我能够实现我想要的,通过修改统一的默认“GUI/文本阴影”着色器,我下载了从这里开始下的“下载(Win)”>“内置着色器”。
我不知道着色器是如何工作的,但以下是我对在下面的着色代码中所发生的事情的粗略解释:
fixed4 sprite_texture
的变量中。fixed4 solid_color
的变量中存储用SpriteRenderer当前颜色绘制的像素艺术的纯色副本lerp
将这两个变量合并在一起,并使用SpriteRenderer当前颜色的alpha值来确定原始像素艺术应该着色多少。一旦该着色器已应用于游戏对象的精灵渲染的材料,我可以很容易地改变游戏对象的颜色通过它的MonoBehavior代码。
"0%红色“:
this.sprite_renderer.color = new Color(1f, 0f, 0f, 0f);
"50%红色“:
this.sprite_renderer.color = new Color(1f, 0f, 0f, .5f);
"100%红色“:
this.sprite_renderer.color = new Color(1f, 0f, 0f, 1f);
我不确定这种方法是否有任何缺点,但据我所知,它很容易使用,支持所有颜色(包括纯白色和黑色),并支持透明背景的像素艺术,这正是我想要的。
Shader "DynamicColorShader"
{
Properties
{
_MainTex ("Font Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
}
Lighting Off Cull Off ZTest Always ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ UNITY_SINGLE_PASS_STEREO STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform fixed4 _Color;
v2f vert (appdata_t v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.color = v.color;
o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
fixed4 frag (v2f IN) : SV_Target
{
fixed4 sprite_texture = tex2D (_MainTex, IN.texcoord);
fixed4 solid_color = IN.color;
solid_color.a *= tex2D(_MainTex, IN.texcoord).a;
fixed4 final = lerp(sprite_texture, solid_color, solid_color.a);
return final;
}
ENDCG
}
}
}
发布于 2023-03-09 18:27:29
雪碧渲染器上的“颜色”参数作为色调应用,乘以原始纹理颜色。因此,它只能使每个红/绿/蓝通道中的颜色变得更深--在以前没有红色的情况下,它不能“添加红色”。
如果您不想编写自定义着色器,您也可以只制作这个精灵纹理的版本,它具有相同的不透明度(透明像素和非透明像素的相同模式),但是所有像素颜色都是白色的(255,255,255),这是标准化后的(1f, 1f, 1f)
。一个与任何其他数字相乘就是另一个数字本身,这样你就可以得到你的浅色,直接作为显示的颜色输出。
如果有时需要多色版本,有时需要纯红色版本,则可以在更改色调颜色的同时,交换sprite呈现器的sprite属性。
发布于 2023-03-09 16:33:06
您不想更改SpriteRenderer的color
,但是要更改它的着色器(在SpriteRenderer.material.shader
中找到它),这样它就可以将任何底层的图像颜色减少到一个预定义的颜色。
您可以检查这个:https://answers.unity.com/questions/1546026/shader-to-set-sprite-to-solid-color.html
这个:https://answers.unity.com/questions/582145/is-there-a-way-to-set-a-sprites-color-solid-white.html
https://gamedev.stackexchange.com/questions/204792
复制相似问题