Files
fmviewer3/project/fm_viewer/fav/shaders/defish2.fsh
2026-02-21 17:11:31 +09:00

138 lines
3.8 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;
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.96;//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
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);
}