How to use proper transparency?

I need to be able to use this code but without the Cutout part. The shader Transparent/Diffuse works fine for what I am trying to achieve but I want the tranparent/diffuse to be 2 sided like this shader. We are trying to use this shader for Hair which at the base looks really bad since it does that alpha cutoff. This shader is fine for plants but not for hair.

Also wondering if anyone has any advice or would like to share any code they have done or experienced to come out with good looking hair in Unity? Thanks.

Shader “Transparent/Cutout/Diffuse Two Sided” {
Properties {
_Color (“Main Color”, Color) = (1,1,1,1)
_MainTex (“Base (RGB) Trans (A)”, 2D) = “white” {}
_Cutoff (“Alpha cutoff”, Range(0,1)) = 0.5
}

Category {
Cull Off
Alphatest Greater [_Cutoff]
AlphaToMask True
ColorMask RGB
Fog { Color [_AddFog] }
Blend AppSrcAdd AppDstAdd

// ------------------------------------------------------------------
// ARB fragment program

SubShader {
// Ambient pass
Pass {
Name “BASE”
Tags {“LightMode” = “PixelOrNone”}
Color [_PPLAmbient]
SetTexture [_MainTex] {constantColor [_Color] Combine texture * primary DOUBLE, texture * primary}
}
// Vertex lights
Pass {
Name “BASE”
Tags {“LightMode” = “Vertex”}
Lighting On
Material {
Diffuse [_Color]
Emission [_PPLAmbient]
}
SetTexture [_MainTex] {combine texture * primary DOUBLE, texture * primary}
}
// Pixel lights
Pass {
Name “PPL”
Tags { “LightMode” = “Pixel” }

CGPROGRAM
#pragma fragment frag
#pragma vertex vert
#pragma multi_compile_builtin
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include “UnityCG.cginc”
#include “AutoLight.cginc”

struct v2f {
V2F_POS_FOG;
LIGHTING_COORDS
float2 uv;
float3 normal;
float3 lightDir;
};

uniform float4 _MainTex_ST;

v2f vert (appdata_base v)
{
v2f o;
PositionFog( v.vertex, o.pos, o.fog );
o.normal = v.normal;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.lightDir = ObjSpaceLightDir( v.vertex );
TRANSFER_VERTEX_TO_FRAGMENT(o);
return o;
}

uniform sampler2D _MainTex;
uniform float4 _Color;

float4 frag (v2f i) : COLOR
{
half4 texcol = tex2D( _MainTex, i.uv );
half4 c = DiffuseLight( i.lightDir, i.normal, texcol, LIGHT_ATTENUATION(i) );
c.a = texcol.a * _Color.a;
return c;
}
ENDCG

SetTexture [_MainTex] {combine texture}
SetTexture [_LightTexture0] {combine texture}
SetTexture [_LightTextureB0] {combine texture}
}
}

// ------------------------------------------------------------------
// Radeon 9000

SubShader {
// Ambient pass
Pass {
Name “BASE”
Tags {“LightMode” = “PixelOrNone”}
Color [_PPLAmbient]
SetTexture [_MainTex] {constantColor [_Color] Combine texture * primary DOUBLE, texture * constant}
}
// Vertex lights
Pass {
Name “BASE”
Tags {“LightMode” = “Vertex”}
Lighting On
Material {
Diffuse [_Color]
Emission [_PPLAmbient]
}
SetTexture [_MainTex] {Combine texture * primary DOUBLE, texture * primary}
}

// Pixel lights with 0 light textures
Pass {
Name “PPL”
Tags {
“LightMode” = “Pixel”
“LightTexCount” = “0”
}

CGPROGRAM
#pragma vertex vert
#include “UnityCG.cginc”

struct v2f {
V2F_POS_FOG;
float2 uv : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 lightDir : TEXCOORD2;
};

uniform float4 _MainTex_ST;

v2f vert(appdata_base v)
{
v2f o;
PositionFog( v.vertex, o.pos, o.fog );
o.normal = v.normal;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.lightDir = ObjSpaceLightDir( v.vertex );
return o;
}
ENDCG
Program “” {
SubProgram {
Local 0, [_ModelLightColor0]
Local 1, [_Color]

"!!ATIfs1.0
StartConstants;
CONSTANT c0 = program.local[0];
CONSTANT c1 = program.local[1];
EndConstants;

StartOutputPass;
SampleMap r0, t0.str; # main texture
SampleMap r1, t2.str; # normalized light dir
PassTexCoord r2, t1.str; # normal

DOT3 r5.sat, r2, r1.2x.bias; # R5 = diffuse (N.L)

MUL r0.rgb, r0, r5;
MUL r0.rgb.2x, r0, c0;
MUL r0.a, r0, c1;
EndPass;
"
}
}
SetTexture[_MainTex] {combine texture}
SetTexture[_CubeNormalize] {combine texture}
}

// Pixel lights with 1 light texture
Pass {
Name “PPL”
Tags {
“LightMode” = “Pixel”
“LightTexCount” = “1”
}

CGPROGRAM
#pragma vertex vert
#include “UnityCG.cginc”

uniform float4 _MainTex_ST;
uniform float4x4 _SpotlightProjectionMatrix0;

struct v2f {
V2F_POS_FOG;
float2 uv : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 lightDir : TEXCOORD2;
float4 LightCoord0 : TEXCOORD3;
};

v2f vert(appdata_tan v)
{
v2f o;
PositionFog( v.vertex, o.pos, o.fog );
o.normal = v.normal;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.lightDir = ObjSpaceLightDir( v.vertex );

o.LightCoord0 = mul(_SpotlightProjectionMatrix0, v.vertex);

return o;
}
ENDCG
Program “” {
SubProgram {
Local 0, [_ModelLightColor0]
Local 1, [_Color]

"!!ATIfs1.0
StartConstants;
CONSTANT c0 = program.local[0];
CONSTANT c1 = program.local[1];
EndConstants;

StartOutputPass;
SampleMap r0, t0.str; # main texture
SampleMap r1, t2.str; # normalized light dir
PassTexCoord r4, t1.str; # normal
SampleMap r2, t3.str; # a = attenuation

DOT3 r5.sat, r4, r1.2x.bias; # R5 = diffuse (N.L)

MUL r0.rgb, r0, r5;
MUL r0.rgb.2x, r0, c0;
MUL r0.rgb, r0, r2.a; # attenuate
MUL r0.a, r0, c1;
EndPass;
"
}
}
SetTexture[_MainTex] {combine texture}
SetTexture[_CubeNormalize] {combine texture}
SetTexture[_LightTexture0] {combine texture}
}

// Pixel lights with 2 light textures
Pass {
Name “PPL”
Tags {
“LightMode” = “Pixel”
“LightTexCount” = “2”
}
CGPROGRAM
#pragma vertex vert
#include “UnityCG.cginc”

uniform float4 _MainTex_ST;
uniform float4x4 _SpotlightProjectionMatrix0;
uniform float4x4 _SpotlightProjectionMatrixB0;

struct v2f {
V2F_POS_FOG;
float2 uv : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 lightDir : TEXCOORD2;
float4 LightCoord0 : TEXCOORD3;
float4 LightCoordB0 : TEXCOORD4;
};

v2f vert(appdata_tan v)
{
v2f o;
PositionFog( v.vertex, o.pos, o.fog );
o.normal = v.normal;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.lightDir = ObjSpaceLightDir( v.vertex );

o.LightCoord0 = mul(_SpotlightProjectionMatrix0, v.vertex);
o.LightCoordB0 = mul(_SpotlightProjectionMatrixB0, v.vertex);

return o;
}
ENDCG
Program “” {
SubProgram {
Local 0, [_ModelLightColor0]
Local 1, [_Color]

"!!ATIfs1.0
StartConstants;
CONSTANT c0 = program.local[0];
CONSTANT c1 = program.local[1];
EndConstants;

StartOutputPass;
SampleMap r0, t0.str; # main texture
SampleMap r1, t2.str; # normalized light dir
PassTexCoord r4, t1.str; # normal
SampleMap r2, t3.stq_dq; # a = attenuation 1
SampleMap r3, t4.stq_dq; # a = attenuation 2

DOT3 r5.sat, r4, r1.2x.bias; # R5 = diffuse (N.L)

MUL r0.rgb, r0, r5;
MUL r0.rgb.2x, r0, c0;
MUL r0.rgb, r0, r2.a; # attenuate
MUL r0.rgb, r0, r3.a;
MUL r0.a, r0, c1;
EndPass;
"
}
}
SetTexture[_MainTex] {combine texture}
SetTexture[_CubeNormalize] {combine texture}
SetTexture[_LightTexture0] {combine texture}
SetTexture[_LightTextureB0] {combine texture}
}
}

// ------------------------------------------------------------------
// Radeon 7000

Category {
Material {
Diffuse [_Color]
Emission [_PPLAmbient]
}
Lighting On
SubShader {
Pass {
Name “BASE”
Tags {“LightMode” = “PixelOrNone”}
Color [_PPLAmbient]
Lighting Off
SetTexture [_MainTex] {Combine texture * primary DOUBLE}
SetTexture [_MainTex] {Combine texture * primary DOUBLE}
SetTexture [_MainTex] {Combine texture * primary DOUBLE, primary * texture}
}
Pass {
Name “BASE”
Tags {“LightMode” = “Vertex”}
SetTexture [_MainTex] {Combine texture * primary DOUBLE, primary * texture}
}
Pass {
Name “PPL”
Tags {
“LightMode” = “Pixel”
“LightTexCount” = “2”
}
SetTexture [_LightTexture0] { combine previous * texture alpha, previous }
SetTexture [_LightTextureB0] {
combine previous * texture alpha + constant, previous
constantColor [_PPLAmbient]
}
SetTexture [_MainTex] { combine previous * texture DOUBLE, primary * texture}
}
Pass {
Name “PPL”
Tags {
“LightMode” = “Pixel”
“LightTexCount” = “1”
}
SetTexture [_LightTexture0] {
combine previous * texture alpha + constant, previous
constantColor [_PPLAmbient]
}
SetTexture [_MainTex] { combine previous * texture DOUBLE, primary * texture}
}
Pass {
Name “PPL”
Tags {
“LightMode” = “Pixel”
“LightTexCount” = “0”
}
SetTexture [_MainTex] { combine previous * texture DOUBLE, primary * texture}
}
}
}
}

Fallback “Transparent/Cutout/VertexLit”, 2

}

I encountered the same problem when we want to render hairs. Can anybody present a solution for this?

The line that does the cutout (also known as alpha testing) is the one near the beginning that starts with “AlphaTest”. Since it’s the only part that uses the Cutoff property, you can remove the “_Cutoff” line from the property block as well.

obviously it doesnt work in that way, when I removed the “cutoff” part from the block, the whole material doesnt work at all.

Care to elaborate? What have you tried, and in what way doesn’t it work?