- Home /
Adding Occlusion and Specular Map to Shader?
Hey, I modified one a Parallax shader from the forum which already included the Occlusion effect, but when I tried adding the specular map I stumbled into a problem: when I add the shader, it shows a purple material. Anybody know what I did wrong?
Here is the code for the shader:
hader "Parallax Specular Occlusion" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
_Shininess ("Shininess", Range (0.01, 1)) = 0.078125
_Parallax ("Height", Range (0.005, 0.08)) = 0.02
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_SpecMap ("Specular map", 2D) = "black" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
_ParallaxMap ("Heightmap (A)", 2D) = "black" {}
_Occlusion ("Occlusion Map", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 400
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _SpecularMap;
sampler2D _ParallaxMap;
sampler2D _Occlusion;
fixed4 _Color;
half _Shininess;
float _Parallax;
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float2 uv_SpecMap;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o) {
half h = tex2D (_ParallaxMap, IN.uv_BumpMap).w;
float2 offset = ParallaxOffset (h, _Parallax, IN.viewDir);
IN.uv_MainTex += offset;
IN.uv_BumpMap += offset;
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
fixed4 Occ = tex2D(_Occlusion, IN.uv_MainTex);
fixed4 specTex = tex2D(_SpecMap, IN.uv_SpecMap);
o.Albedo = tex.rgb * _Color.rgb * Occ.rgb;
o.Gloss = specTex.r;
o.Alpha = tex.a * _Color.a;
o.Specular = _Shininess * specTex.g;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}
FallBack "Specular"
}
The Parallax Specular Occlusion isn't a Unity shader. Someone posted it on a forum somewhere.
It already incorporates Spec shading but I think it's derived from the Diffuse in this case.
$$anonymous$$aybe start here?
Oh yeah right, this is what I used. I forgot, I got the occlusion from this guy and tried to add specularity as well. Wait I'll change that in the question.
Check the spec in this one
Shader "Bumped Anisotropic Specular" {
Properties {
_Color ("$$anonymous$$ain Color", Color) = (1,1,1,1)
_$$anonymous$$ainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {}
_SpecularTex ("Specular (R) Gloss (G) Anisotropic $$anonymous$$ask (B)", 2D) = "gray" {}
_Bump$$anonymous$$ap ("Normal (Normal)", 2D) = "bump" {}
_AnisoTex ("Anisotropic Direction (RGB)", 2D) = "bump" {}
_AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2
_Cutoff ("Alpha Cut-Off Threshold", Range(0,1)) = 0.5
}
SubShader{
Tags { "RenderType" = "Opaque" }
CGPROGRA$$anonymous$$
struct SurfaceOutputAniso {
fixed3 Albedo;
fixed3 Normal;
fixed4 AnisoDir;
fixed3 Emission;
half Specular;
fixed Gloss;
fixed Alpha;
};
float _AnisoOffset, _Cutoff;
inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten)
{
fixed3 h = normalize(normalize(lightDir) + normalize(viewDir));
float NdotL = saturate(dot(s.Normal, lightDir));
fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h);
float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180)));
float spec = saturate(dot(s.Normal, h));
spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular);
fixed4 c;
c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2);
c.a = 1;
clip(s.Alpha - _Cutoff);
return c;
}
#pragma surface surf Aniso
#pragma target 3.0
struct Input
{
float2 uv_$$anonymous$$ainTex;
float2 uv_AnisoTex;
};
sampler2D _$$anonymous$$ainTex, _SpecularTex, _Bump$$anonymous$$ap, _AnisoTex;
void surf (Input IN, inout SurfaceOutputAniso o)
{
fixed4 albedo = tex2D(_$$anonymous$$ainTex, IN.uv_$$anonymous$$ainTex);
o.Albedo = albedo.rgb;
o.Alpha = albedo.a;
o.Normal = UnpackNormal(tex2D(_Bump$$anonymous$$ap, IN.uv_$$anonymous$$ainTex));
fixed3 spec = tex2D(_SpecularTex, IN.uv_$$anonymous$$ainTex).rgb;
o.Specular = spec.r;
o.Gloss = spec.g;
o.AnisoDir = fixed4(tex2D(_AnisoTex, IN.uv_AnisoTex).rgb, spec.b);
}
ENDCG
}
FallBack "Transparent/Cutout/VertexLit"
}
Cool, i'll see to that, still curious if someone could fix my code though. Is Vertex Specular Lighting better then what I used? I simply got my code for specular map from here:
// surface shader with errors was here
Pass { }
/*// error compiling initial surface function 'surf':
#include "HLSLSupport.cginc"
#include "UnityShaderVariables.cginc"
#include "Lighting.cginc"
#include "UnityCG.cginc"
#include "Lighting.cginc"
#define INTERNAL_DATA
#define WorldReflectionVector(data,normal) data.worldRefl
#define WorldNormalVector(data,normal) normal
#line 1
#line 34
Some of the errors the shader compiler found. Anyone know what this means?
Answer by Borzi · Oct 24, 2013 at 05:28 AM
Problem is fixed here, it was quite easy and I'm not sure if it actually is working properly, at least it does not show pink cube:
Your answer
Follow this Question
Related Questions
Shader Problem 1 Answer
Shaders and ambient occlusion 1 Answer
Cartoon specular, regular diffuse, fresnel reflective? 1 Answer
Spec only Shader, Again. 1 Answer
Fake specular shader for a sphere? 1 Answer