100 lines
3.3 KiB
GLSL
100 lines
3.3 KiB
GLSL
// <copyright file="VideoUnlitShader.cs" company="Google Inc.">
|
|
// Copyright (C) 2017 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 renders from OES_external_image textures which require special
|
|
// OpenGLES extensions and a special texture sampler.
|
|
//
|
|
Shader "GoogleVR/Video Unlit Shader" {
|
|
Properties {
|
|
_Gamma ("Video gamma", Range(0.01,3.0)) = 1.0
|
|
_MainTex ("Base (RGB)", 2D) = "white" {}
|
|
[KeywordEnum(None, TopBottom, LeftRight)] _StereoMode ("Stereo mode", Float) = 0
|
|
[Toggle(FLIP_X)] _FlipX ("Flip X", Float) = 0
|
|
}
|
|
|
|
SubShader {
|
|
Pass {
|
|
Tags { "RenderType" = "Opaque" }
|
|
|
|
Lighting Off
|
|
Cull Off
|
|
|
|
GLSLPROGRAM
|
|
#pragma only_renderers gles gles3
|
|
#extension GL_OES_EGL_image_external : require
|
|
#extension GL_OES_EGL_image_external_essl3 : enable
|
|
|
|
#pragma multi_compile ___ _STEREOMODE_TOPBOTTOM _STEREOMODE_LEFTRIGHT
|
|
#pragma multi_compile ___ FLIP_X
|
|
|
|
precision mediump int;
|
|
precision mediump float;
|
|
|
|
#ifdef VERTEX
|
|
uniform mat4 video_matrix;
|
|
uniform int unity_StereoEyeIndex;
|
|
varying vec2 uv;
|
|
|
|
void main() {
|
|
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
|
vec4 untransformedUV = gl_MultiTexCoord0;
|
|
#ifdef FLIP_X
|
|
untransformedUV.x = 1.0 - untransformedUV.x;
|
|
#endif // FLIP_X
|
|
#ifdef _STEREOMODE_TOPBOTTOM
|
|
untransformedUV.y *= 0.5;
|
|
if (unity_StereoEyeIndex == 0) {
|
|
untransformedUV.y += 0.5;
|
|
}
|
|
#endif // _STEREOMODE_TOPBOTTOM
|
|
#ifdef _STEREOMODE_LEFTRIGHT
|
|
untransformedUV.x *= 0.5;
|
|
if (unity_StereoEyeIndex != 0) {
|
|
untransformedUV.x += 0.5;
|
|
}
|
|
#endif // _STEREOMODE_LEFTRIGHT
|
|
|
|
uv = (video_matrix * untransformedUV).xy;
|
|
}
|
|
#endif // VERTEX
|
|
|
|
#ifdef FRAGMENT
|
|
vec3 gammaCorrect(vec3 v, float gamma) {
|
|
return pow(v, vec3(1.0/gamma));
|
|
}
|
|
|
|
// 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.
|
|
vec4 gammaCorrect(vec4 v, float gamma) {
|
|
return vec4(gammaCorrect(v.xyz, gamma), v.w);
|
|
}
|
|
|
|
uniform float _Gamma;
|
|
uniform samplerExternalOES _MainTex;
|
|
varying vec2 uv;
|
|
|
|
void main() {
|
|
gl_FragColor = gammaCorrect(texture2D(_MainTex, uv), _Gamma);
|
|
}
|
|
#endif // FRAGMENT
|
|
ENDGLSL
|
|
}
|
|
}
|
|
Fallback "Unlit/Texture"
|
|
}
|