ScreenTexture.frag 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. precision highp float;
  2. varying vec3 ModelPos;
  3. uniform float isYUV; // false: 0, true: 1.0
  4. uniform sampler2D texture_video;
  5. uniform vec3 focal_width_height;
  6. vec2 SampleTex(vec3 pt3d)
  7. {
  8. return focal_width_height.x / focal_width_height.yz * pt3d.xy / pt3d.z + 0.5;
  9. }
  10. void main()
  11. {
  12. vec3 color = vec3(0,0,0);
  13. float shadow = 1.0;
  14. vec2 uv = SampleTex( normalize(ModelPos) );
  15. if( isYUV < 0.5 )
  16. {
  17. color = texture2D(texture_video, uv).rgb;
  18. }else{
  19. const mat4 YUV2RGB = mat4
  20. (
  21. 1.1643828125, 0, 1.59602734375, -.87078515625,
  22. 1.1643828125, -.39176171875, -.81296875, .52959375,
  23. 1.1643828125, 2.017234375, 0, -1.081390625,
  24. 0, 0, 0, 1
  25. );
  26. vec4 result = vec4(
  27. texture2D( texture_video, vec2( uv.x, uv.y * 0.666666 + 0.333333 ) ).x,
  28. texture2D( texture_video, vec2( uv.x * 0.5, uv.y * 0.333333 ) ).x,
  29. texture2D( texture_video, vec2( 0.5 + uv.x * 0.5, uv.y * 0.333333 ) ).x,
  30. 1
  31. ) * YUV2RGB;
  32. color = clamp(result.rgb, 0.0, 1.0);
  33. }
  34. if( uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0 )
  35. {
  36. color = vec3(0,0,0);
  37. }
  38. gl_FragColor = vec4(shadow * color * 1.0, 1.0);
  39. }