首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将SpriteRenderer完全或部分着色并使其“颜色”值与100%不透明度的最终结果相匹配?

如何将SpriteRenderer完全或部分着色并使其“颜色”值与100%不透明度的最终结果相匹配?
EN

Game Development用户
提问于 2023-03-09 16:22:14
回答 3查看 233关注 0票数 2

我有一个看起来像这样的GameObject:

当我将GameObject的SpriteRenderer中的"color“值更改为be (255,0,0,255)时,GameObject的结果如下所示:

但我希望它看起来像这样:

我能用什么方法来完成这个任务呢?

我的目标是让它是动态的,这样它就可以从"0%红色“(原始颜色)到"100%红色”(完全红色,除了透明像素)。

例如,我希望50%的红色看起来像这样:

EN

回答 3

Game Development用户

回答已采纳

发布于 2023-03-10 13:52:31

经过多次尝试和错误,我能够实现我想要的,通过修改统一的默认“GUI/文本阴影”着色器,我下载了从这里开始下的“下载(Win)”>“内置着色器”。

我不知道着色器是如何工作的,但以下是我对在下面的着色代码中所发生的事情的粗略解释:

  1. 它将原始像素艺术存储在一个名为fixed4 sprite_texture的变量中。
  2. 它在一个名为fixed4 solid_color的变量中存储用SpriteRenderer当前颜色绘制的像素艺术的纯色副本
  3. 它使用lerp将这两个变量合并在一起,并使用SpriteRenderer当前颜色的alpha值来确定原始像素艺术应该着色多少。

一旦该着色器已应用于游戏对象的精灵渲染的材料,我可以很容易地改变游戏对象的颜色通过它的MonoBehavior代码。

使用示例(C#):

"0%红色“:

代码语言:javascript
运行
复制
this.sprite_renderer.color = new Color(1f, 0f, 0f, 0f);

"50%红色“:

代码语言:javascript
运行
复制
this.sprite_renderer.color = new Color(1f, 0f, 0f, .5f);

"100%红色“:

代码语言:javascript
运行
复制
this.sprite_renderer.color = new Color(1f, 0f, 0f, 1f);

我不确定这种方法是否有任何缺点,但据我所知,它很容易使用,支持所有颜色(包括纯白色和黑色),并支持透明背景的像素艺术,这正是我想要的。

使用示例:

完全着色代码:

代码语言:javascript
运行
复制
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
        }
    }
}
票数 2
EN

Game Development用户

发布于 2023-03-09 18:27:29

雪碧渲染器上的“颜色”参数作为色调应用,乘以原始纹理颜色。因此,它只能使每个红/绿/蓝通道中的颜色变得更深--在以前没有红色的情况下,它不能“添加红色”。

如果您不想编写自定义着色器,您也可以只制作这个精灵纹理的版本,它具有相同的不透明度(透明像素和非透明像素的相同模式),但是所有像素颜色都是白色的(255,255,255),这是标准化后的(1f, 1f, 1f)。一个与任何其他数字相乘就是另一个数字本身,这样你就可以得到你的浅色,直接作为显示的颜色输出。

如果有时需要多色版本,有时需要纯红色版本,则可以在更改色调颜色的同时,交换sprite呈现器的sprite属性。

票数 0
EN

Game Development用户

发布于 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

票数 -1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/204792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档