- Home /
Question by
sa-developers · Feb 03, 2019 at 05:32 PM ·
shadershadersmaterialstransparencyshader programming
See backside of a transparent emissive shader?
I followed an online tutorial which helped me make a shield/forcefield like effect with a heat map. The results look very good, but unfortunately it has a drawback. I can only see the effect on the front of the sphere, the side the camera is looking at. if a projectile hits the back side (that faces away from the camera) the effect is not visible unless I rotate the camera to that side of the sphere. How can I change my shader to make the effects on the other side of my object also visable?
Here is the code:
Shader "Custom/ShieldShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_PointColor("Point Color (RGB)", Color) = (1, 0, 0, 1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_ImpactSize("Impact Size", Float) = 0.5
_GlowIntensity("Glow Intensity", Int) = 2
}
SubShader
{
//Tags { "RenderType"="Opaque" }
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows alpha:auto
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float3 worldPos;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
fixed4 _PointColor;
//######################### OWN CODE
float _ImpactSize;
int _GlowIntensity;
int _arrPointsSize;
fixed4 _arrPoints[50];
UNITY_INSTANCING_BUFFER_START(Props)
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) * _Color;
fixed emmissive = 0;
float3 objPos = mul(unity_WorldToObject, float4(IN.worldPos, 1)).xyz;
for (int i = 0; i < _arrPointsSize; i++) {
emmissive += max(0, frac(1.0 - max(0, (_arrPoints[i].w * _ImpactSize) - distance(_arrPoints[i].xyz, objPos.xyz)) / _ImpactSize) * (1 - _arrPoints[i].w));
//emmissive += (max(0, (_arrPoints[i].w * _ImpactSize) - distance(_arrPoints[i].xyz, objPos.xyz)) / _ImpactSize) * (1 - _arrPoints[i].w) * _GlowIntensity;
}
o.Albedo = c.rgb;
o.Emission = emmissive * _PointColor;
o.Metallic = 0;
o.Smoothness = 0;
//o.Alpha = c.a;
o.Alpha = 0;
}
ENDCG
}
FallBack "Standard"
}
screenshot-4.png
(191.7 kB)
Comment