Shader "Custom/simple" {
Properties {
_outlineWidth ("Outline-Stärke", float) = 0.1
_refractionValue ("Refraktionswert", float) = 0.1
_diffuseMap ("diffuse map", 2D) = "white" {}
_normalMap ("normal map", 2D) = "white" {}
_environmentMap ("environment map", CUBE) = "white" {}
_vLightPositionWS ("Lichtposition", vector) = (5, 3, 1)
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
pass {
Tags { "LightMode"="Vertex" }
CGPROGRAM
#include "UnityCG.cginc"
#include "HLSLSupport.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
sampler2D _diffuseMap;
sampler2D _normalMap;
samplerCUBE _environmentMap;
float3 _vLightPositionWS;
struct VS_OUTPUT {
float4 vPositionPS : SV_POSITION;
float3 vPositionMS : TEXCOORD1;
float3 vNormalMS : TEXCOORD2;
float3 vTangentMS : TEXCOORD3;
float3 vBinormalMS : TEXCOORD4;
float2 vTexCoord : TEXCOORD0;
};
VS_OUTPUT vsMain(appdata_full vIn) {
VS_OUTPUT vOut;
vOut.vPositionPS = mul(UNITY_MATRIX_MVP, vIn.vertex);
vOut.vPositionMS = vIn.vertex;
vOut.vNormalMS = vIn.normal;
vOut.vTexCoord = vIn.texcoord.xy;
vOut.vTangentMS = vIn.tangent.xyz;
vOut.vBinormalMS = cross(vIn.normal, vIn.tangent.xyz) * vIn.tangent.w;
return vOut;
};
struct PS_OUTPUT {
float4 vColor : COLOR0;
};
PS_OUTPUT psMain(VS_OUTPUT vIn) {
vIn.vNormalMS = normalize(vIn.vNormalMS);
vIn.vTangentMS = normalize(vIn.vTangentMS);
vIn.vBinormalMS = normalize(vIn.vBinormalMS);
// calculate new normal from normal map
float3 vNormalTS = tex2D(_normalMap, vIn.vTexCoord).rgb * 2 - 1;
float3x3 mTStoMS = float3x3(vIn.vTangentMS, vIn.vBinormalMS, vIn.vNormalMS);
vIn.vNormalMS = mul(vNormalTS, mTStoMS);
float3 vCameraPosMS = mul(float4(0,0,0,1), UNITY_MATRIX_IT_MV).xyz;
float3 vEyeVecMS = normalize(vCameraPosMS - vIn.vPositionMS);
if (dot(vIn.vNormalMS, vEyeVecMS) < 0)
{
// normal faces away from camera --> fix it
float3 vCross = cross(vIn.vNormalMS, vEyeVecMS);
vIn.vNormalMS = -cross(vCross, vEyeVecMS);
}
float3 vLightVecMS = normalize(mul(unity_LightPosition[0], UNITY_MATRIX_IT_MV)).xyz;
float3 vReflectedEyeVecMS = -reflect(vEyeVecMS, vIn.vNormalMS);
//
// float4 c = max(0, dot(vLightVecMS, vIn.vNormalMS)); // lambert lighting
// c *= tex2D(_diffuseMap, vIn.vTexCoord);
// c += pow(max(0, dot(vReflectedEyeVecMS, vLightVecMS)), 20); // phong lighting
// float4 vRefractionColor = c;
//
float _refractionValue;
float3 vRefractionMS = -normalize(lerp(vEyeVecMS, vIn.vNormalMS, _refractionValue));
float3 vRefractionWS = mul(_Object2World, float4(vRefractionMS, 0)).xyz;
float4 vRefractionColor = texCUBE(_environmentMap, vRefractionWS);
float3 vReflectedEyeVecWS = mul(_Object2World, float4(vReflectedEyeVecMS, 0)).xyz;
//
//float height = 0.1;
//float2 vEnvironmentTexcoord = (height/vReflectedEyeVecWS.y) * vReflectedEyeVecWS.xz;
//
//
//float alpha = vReflectedEyeVecWS.x >= 0 ? asin(vReflectedEyeVecWS.z / length(vReflectedEyeVecWS.xz))
// : 3.14159 - asin(vReflectedEyeVecWS.z / length(vReflectedEyeVecWS.xz));
//float beta = asin(vReflectedEyeVecWS.y);
//float2 vEnvironmentTexcoord = float2(alpha / (2 * 3.14159), beta / 3.14159 + 0.5);
//
float4 vReflectionColor = texCUBE(_environmentMap, vReflectedEyeVecWS); //* float4(1, 0.8, 0.3, 0);
float fresnell
= 1/pow(dot
(vIn.
vNormalMS, vEyeVecMS
) + 1, 8);
PS_OUTPUT vOut;
vOut.vColor = lerp(vRefractionColor, vReflectionColor, fresnell);
return vOut;
};
#pragma vertex vsMain
#pragma fragment psMain
ENDCG
}
pass {
Cull Front
CGPROGRAM
#include "UnityCG.cginc"
struct VS_OUTPUT {
float4 vPositionPS : SV_POSITION;
};
float _outlineWidth;
VS_OUTPUT vsMain(appdata_full vIn) {
vIn.vertex.xyz += vIn.normal * _outlineWidth;
// vIn.vertex.xyz += vIn.normal * 0.5 * sin(_Time.y + (vIn.texcoord.x * 5 + vIn.texcoord.y * 3) * 3.14159 * 2);
VS_OUTPUT vOut;
vOut.vPositionPS = mul(UNITY_MATRIX_MVP, vIn.vertex);
return vOut;
};
struct PS_OUTPUT {
float4 vColor : COLOR0;
};
PS_OUTPUT psMain(VS_OUTPUT vIn) {
PS_OUTPUT vOut;
vOut.vColor = float4(0, 0, 0, 1);
return vOut;
};
#pragma vertex vsMain
#pragma fragment psMain
ENDCG
}
}
FallBack "Diffuse"
}