precision highp float; varying vec3 ModelPos; uniform float isYUV; // false: 0, true: 1.0 uniform sampler2D texture_video; uniform vec3 focal_width_height; vec2 SampleTex(vec3 pt3d) { return focal_width_height.x / focal_width_height.yz * pt3d.xy / pt3d.z + 0.5; } void main() { vec3 color = vec3(0,0,0); float shadow = 1.0; vec2 uv = SampleTex( normalize(ModelPos) ); if( isYUV < 0.5 ) { color = texture2D(texture_video, uv).rgb; }else{ const mat4 YUV2RGB = mat4 ( 1.1643828125, 0, 1.59602734375, -.87078515625, 1.1643828125, -.39176171875, -.81296875, .52959375, 1.1643828125, 2.017234375, 0, -1.081390625, 0, 0, 0, 1 ); vec4 result = vec4( texture2D( texture_video, vec2( uv.x, uv.y * 0.666666 + 0.333333 ) ).x, texture2D( texture_video, vec2( uv.x * 0.5, uv.y * 0.333333 ) ).x, texture2D( texture_video, vec2( 0.5 + uv.x * 0.5, uv.y * 0.333333 ) ).x, 1 ) * YUV2RGB; color = clamp(result.rgb, 0.0, 1.0); } if( uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0 ) { color = vec3(0,0,0); } gl_FragColor = vec4(shadow * color * 1.0, 1.0); }