- Home /
Need to change color of a texture
Hello
Is it possible that I can change the color of a part of a texture with this (https://imgur.com/a/v79JxqK) texture? I want the black to be the stuff that get's changed from the original (https://imgur.com/a/v79JxqK scroll down a bit) texture. So I can only color the body part of the vehicle instead of using diffuse which colors the whole car.
If it's unclear, please tell me and I will explain it more.
Do you want to change the texture upfront in Photoshop or the texture in memory or handle it within a shader? It seems you want to use/create a shader that handles this? If so, which Unity version and Renderpipeline do you want to use?
Answer by SkandYxyz · Jan 08, 2021 at 06:57 PM
It can be done with shader coding. When you use build-in standard shaders you can write your own shaders. in this case you can simple write a surface shader like this and apply the albedo and mask texture:
Shader "Custom/MaskShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_MaskTex("Maks (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
sampler2D _MaskTex;
struct Input
{
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D(_MainTex, IN.uv_MainTex)*(1-tex2D(_MaskTex, IN.uv_MainTex)) + tex2D (_MainTex, IN.uv_MainTex) * tex2D(_MaskTex, IN.uv_MainTex)*_Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Here are some learningresources:
Unity manual about writing surface shaders Unitys overview of writing surface and vertex/fragment shaders
If you are using different renderpipelines like URP or HDRP there is a free visual shader programming tool from Unity called ShaderGraph.
Unity Shader Graph introduction
A good tool in current build-in renderpipeline for people with less knowledge on shader programming to understand and learn shaderprogramming might be a visual shader programming tool like Amplify Shader Editor.
Will try this asap, if it works I will mark it as answer
EDIT: This is fantastic!! It works!
Answer by Tomatotom1234 · Jan 07, 2021 at 05:17 PM
are you talking about changing the color in unity or in some art program?
You can apply the texture onto a sprite renderer and change the color of the sprite renderer, which would render the whole sprite in a new color. However, the image you showed, where parts of the texture are black but some parts are green, cannot be done just in Unity. (Correct me if I'm wrong, anyone). You might want to have two textures, made using another program, import them, and swap them when you want to modify the color of either texture. @Jesse2431