- Home /
Linear Color Space, Same Color supplied once as Vertex Color, once as a shader property, different results
While working with the SteamVR plugin, it recommended me to change the color space to linear, which I did as I obviously wanted to do what was recommended to me....
I have a script that generates a simple plane with all vertices set to some color supplied in the inspector. On top of that, I have two shaders (Source attached at the end), one for rendering vertex colors, one for rendering a mesh in a color that is supplied through a property.
When I place two meshes in a scene, one with the vertex color shader and the other one with the other shader, they look exactly the same - as expected - BUT only as long as the color space is set to gamma. When it is put to linear, the two meshes have a completely different color... If anyone could explain to me why this is the case, I would be very thankful :) I am very sorry if this question has an obvious answer, but I'm not very good with shaders yet.
The left quad is rendered with the single color shader, the right side with the vertex color shader
Gamma Color Space:
Linear Color Space:
Here are the shaders:
Vertex Color Shader
Shader "Unlit/VertexColorTest"
{
Properties
{
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
};
struct v2f
{
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
return o;
}
float4 frag(v2f i) : SV_Target
{
return i.color;
}
ENDCG
}
}
}
Single Color Shader:
Shader "Unlit/ColorTest"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
float4 _Color;
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
float4 frag(v2f i) : SV_Target
{
return _Color;
}
ENDCG
}
}
}
Answer by michidk · Jul 27, 2017 at 03:53 PM
The vertex colors are probably in gamma space. Use your shader to convert them to linear space, first.