140 lines
3.9 KiB
GLSL
140 lines
3.9 KiB
GLSL
uniform sampler2D u_Texture0;
|
|
uniform sampler2D u_Texture1;
|
|
uniform sampler2D u_Texture2;
|
|
// TOP DOWN 360 MODEL
|
|
// https://github.com/tokoik/fisheye ...
|
|
// https://stackoverflow.com/questions/39352533/android-opengl-es-textured-half-sphere ???
|
|
varying vec2 v_TexCoords0;
|
|
varying vec2 v_TexCoords1;
|
|
varying vec2 v_TexCoords2;
|
|
|
|
#define v_TexCoords1 v_TexCoords0
|
|
#define v_TexCoords2 v_TexCoords0
|
|
#define v_TexCoords3 v_TexCoords0
|
|
|
|
uniform float u_opacity;
|
|
uniform mat4 u_colorMatrix;
|
|
|
|
uniform int u_mode;
|
|
uniform float u_angle;
|
|
uniform int u_flip;
|
|
uniform float u_effectiveWidth;
|
|
uniform float u_clipBound;
|
|
uniform float u_whratio;
|
|
void main(void)
|
|
{
|
|
vec2 fc = v_TexCoords0.st;
|
|
float PI = 3.141592;
|
|
|
|
// FLIP 반전
|
|
// if(u_mode != 2 && u_flip == 1) {
|
|
// fc.y = 1.0 - fc.y;
|
|
// }
|
|
|
|
// VR + PANORAMA
|
|
// #if (REMOVE_360_WIDE_SINGLE)
|
|
//if(u_mode == 3 || u_mode == 1)
|
|
if(u_mode == 2 || u_mode == 3)
|
|
{
|
|
float R = u_effectiveWidth / 2.0 * 0.99;//0.5;
|
|
float Cfx = u_effectiveWidth / 2.0;
|
|
float Cfy = 0.5;
|
|
|
|
float He = 1.0;
|
|
float We = u_effectiveWidth;
|
|
|
|
float Xe = 1.0-fc.x; // flip h
|
|
float Ye = 1.0-fc.y; // upside down
|
|
|
|
// if(u_mode == 3){
|
|
// if(Ye > 0.62) {
|
|
// gl_FragColor = vec4(0.0,0.0,0.0,1.0);
|
|
// return;
|
|
// }
|
|
// Ye = (Ye / 0.62);
|
|
// }
|
|
|
|
float r = Ye/He*R;
|
|
float theta = Xe/We*2.0*PI - (u_angle * 3.0); // TOP_DOWN_2D_360
|
|
|
|
theta = theta * 0.2 * u_whratio;
|
|
|
|
float Xf = Cfx+r*sin(theta);
|
|
float Yf = Cfy+r*cos(theta);
|
|
|
|
fc = vec2(Xf,Yf);
|
|
}
|
|
else if(u_mode == 1) // PANORAMA 2CH
|
|
{
|
|
fc.y = 1.0 - fc.y;
|
|
|
|
float Hf = 1.0;
|
|
float R = u_effectiveWidth / 2.0 * 0.99;
|
|
float Cfx = u_effectiveWidth / 2.0;
|
|
float Cfy = 0.5;
|
|
|
|
float He = 1.0;
|
|
float We = u_effectiveWidth;
|
|
|
|
float Xe = 1.0-fc.x; // flip h
|
|
float Ye = 1.0-fc.y; // upside down
|
|
|
|
if(fc.y < 0.5) // top (0~180 -> bottom
|
|
{
|
|
Ye = 1.0-Ye;
|
|
|
|
float scale = (Ye + 0.5) * 2.0; // 0.0~0.5 = 1.0~2.0
|
|
float r = ((Ye/He*R)+0.25) / scale;
|
|
float theta = Xe/We*PI+(PI/2.0); // 1/2
|
|
theta += PI;
|
|
float Xf = Cfx+r*sin(theta) * scale * 1.0;
|
|
float Yf = Cfy+r*cos(theta) * scale;
|
|
|
|
fc = vec2(Xf,Yf);
|
|
}
|
|
else // bottom 180 ~ 360
|
|
{
|
|
Ye = 1.0-Ye-0.5;
|
|
float scale = (Ye + 0.5) * 2.0; // 0.0~0.5 = 1.0~2.0
|
|
float r = ((Ye/He*R)+0.25) / scale;
|
|
float theta = Xe/We*PI+(PI/2.0); // 1/2
|
|
float Xf = Cfx+r*sin(theta) * scale;
|
|
float Yf = Cfy+r*cos(theta) * scale;
|
|
|
|
fc = vec2(Xf,Yf);
|
|
}
|
|
|
|
if(u_clipBound > 0.0) {
|
|
//if(v_TexCoords0.st.x < u_clipBound || v_TexCoords0.st.x > (1.0 - u_clipBound))
|
|
if(v_TexCoords0.st.x < 0.0 || v_TexCoords0.st.x > 1.0)
|
|
{
|
|
gl_FragColor = clamp(u_colorMatrix
|
|
* vec4(texture2D(u_Texture0, fc).r,
|
|
texture2D(u_Texture1, fc).r,
|
|
texture2D(u_Texture2, fc).r,
|
|
1.0) * 0.9, 0.0, 1.0);
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
else // CLIP ZOOM
|
|
{
|
|
// ZOOM CLIP
|
|
if (fc.x < 0.0 || fc.x > 1.0) {
|
|
gl_FragColor = vec4(0.0,0.0,0.0,1.0);
|
|
return;
|
|
}
|
|
fc.x *= u_effectiveWidth;
|
|
}
|
|
|
|
|
|
|
|
gl_FragColor = clamp(u_colorMatrix
|
|
* vec4(texture2D(u_Texture0, fc).r,
|
|
texture2D(u_Texture1, fc).r,
|
|
texture2D(u_Texture2, fc).r,
|
|
1.0), 0.0, 1.0);
|
|
|
|
}
|