Reflection HLSL
https://en.wikibooks.org/wiki/Cg_Programming/Unity/Reflecting_Surfaces
resnel equation
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/fresnel"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_FresnelColor("Fresnel Color", Color) = (1,1,1,1)
_FresnelBias("Fresnel Bias", Float) = 0
_FresnelScale("Fresnel Scale", Float) = 1
_FresnelPower("Fresnel Power", Float) = 1
_ReflectionCubemap("Reflection (HDR)",CUBE)=""{}
}
SubShader
{
Tags
{
"Queue" = "Geometry"
"IgnorePorjector" = "True"
"RenderType" = "Opaque"
}
Cull Back
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc"
struct appdata_t
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
half3 normal : NORMAL;
};
struct v2f
{
float4 pos : POSITION;
half2 uv : TEXCOORD0;
float fresnel : TEXCOORD1;
float3 worldPos : TEXCOORD2;
float3 normalDir : TEXCOORD3;
};
sampler2D _MainTex;
float4 _MainTex_ST; //MainTex zw
samplerCUBE _ReflectionCubemap;
half4 _ReflectionCubemap_HDR;
fixed4 _Color;
fixed4 _FresnelColor;
fixed _FresnelBias;
fixed _FresnelScale;
fixed _FresnelPower;
float3 customObjSpaceViewDir(float4 v)
{
float3 objSpaceCameraPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1)).xyz; //local camera position
return objSpaceCameraPos - v.xyz; // from camera to v.pos direction
}
//UNITY_MATRIX_MVP = GL.GetGPUProjectionMatrix(Camera.main.projectionMatrix, false) * Camera.main.worldToCameraMatrix * debugObject.renderer.localToWorldMatrix;
//UNITY_MATRIX_MVP = UNITY_MATRIX_P * _WorldSpaceCameraPos * unity_ObjectToWorld;
//float4 customUNITY_MATRIX_MVP()
//{
// return mul(mul(UNITY_MATRIX_M, UNITY_MATRIX_V), UNITY_MATRIX_P).xyzw;
// //mul(UNITY_MATRIX_P, float4(_WorldSpaceCameraPos.xyz, 1);// *unity_ObjectToWorld).xyzw;
//}
float4 customUnityObjectToClipPos(float3 pos)
{
return UnityObjectToClipPos(float4(pos, 1)); // == mul(UNITY_MATRIX_MVP, float4(pos, 1))
}
// #degine TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) // scale and offset
v2f vert(appdata_t v)
{
v2f o;
o.pos = customUnityObjectToClipPos(v.pos);//UnityObjectToClipPos(v.pos);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.normalDir = normalize(mul(float4(v.normal, 0.0), unity_WorldToObject).xyz);
o.worldPos = mul(unity_ObjectToWorld, v.pos);
float3 i = normalize(customObjSpaceViewDir(v.pos));
//o.fresnel = dot(i, v.normal);//_FresnelBias + _FresnelScale * pow(1 + dot(i, v.normal), _FresnelPower);
// dot(customObjSpaceViewDir, v.normal) => object to camera lookat dot product
o.fresnel = _FresnelBias + _FresnelScale * pow(1 + dot(i, v.normal), _FresnelPower);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
half3 viewDir = normalize(_WorldSpaceCameraPos - i.worldPos);
float3 reflectDir = reflect(viewDir, normalize(i.normalDir));
half4 ref = texCUBE(_ReflectionCubemap, reflectDir * float3(1,-1,-1));
fixed4 c = tex2D(_MainTex, i.uv) * _Color;
//return i.fresnel;// lerp(c, _FresnelColor, 1 - i.fresnel);
return lerp(c, _FresnelColor * ref, clamp(1 -i.fresnel,0,1));
}
ENDCG
}
}
}
댓글
댓글 쓰기