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 } } }






댓글

이 블로그의 인기 게시물

About AActor!!! "UObject" has no member "BeginPlay"

UNREAL Android build information

Shader informations nice blog ~ ~