Skip to content

Instantly share code, notes, and snippets.

@alimoeeny
Created December 15, 2016 19:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alimoeeny/ba00826bbda50c0a1f65964b4ca24230 to your computer and use it in GitHub Desktop.
Save alimoeeny/ba00826bbda50c0a1f65964b4ca24230 to your computer and use it in GitHub Desktop.
// <copyright file="InsideShader.cs" company="Google Inc.">
// Copyright (C) 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
//
// This shader switches the culling to the front side and inverts the normal so
// textures are drawn on the inside or back of the object.
//
Shader "GoogleVR/Demos/VideoDemo InsideShader" {
Properties {
_Gamma ("Video gamma", Range(0.01,3.0)) = 1.0
_MainTex ("Base (RGB)", 2D) = "white" {}
_StereoVideo ("Render Stereo Video", Int) = 1
}
SubShader {
Pass {
Tags { "RenderType" = "Opaque" }
// cull the outside, since we want to draw on the inside of the mesh.
Cull Front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "../../../Shaders/GvrUnityCompatibility.cginc"
float4 _MainTex_ST;
sampler2D _MainTex;
int _StereoVideo;
float _Gamma;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float3 gammaCorrect(float3 v)
{
return pow(v, 1.0/_Gamma);
}
float3 gammaCorrectApprox(float3 v)
{
return rsqrt(v);
}
// Apply the gamma correction. One possible optimization that could
// be applied is if _Gamma == 2.0, then use gammaCorrectApprox since sqrt will be faster.
// Also, if _Gamma == 1.0, then there is no effect, so this call could be skipped all together.
float4 gammaCorrect(float4 v)
{
return float4( gammaCorrect(v.xyz), v.w );
}
v2f vert (appdata_base v) {
v2f o;
// invert the normal of the vertex
v.normal.xyz = v.normal * -1;
o.pos = GvrUnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
if (_StereoVideo > 0) {
o.uv.y *= 0.5f;
if(unity_StereoEyeIndex == 0) {
o.uv.y += 0.5f;
}
}
o.uv.x = 1 - o.uv.x;
return o;
}
fixed4 frag (v2f i) : SV_Target {
return gammaCorrect(tex2D(_MainTex, i.uv));
}
ENDCG
}
}
Fallback "Mobile/VertextLit"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment