shaders.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. const prefixVertex ="precision highp float;\nprecision highp int;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\n"
  2. const prefixFragment ="precision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"
  3. var shaders = {
  4. skybox: {
  5. uniforms: {
  6. opacity: {
  7. type: "f",
  8. value: 1
  9. },
  10. panoMap: {
  11. type: "t",
  12. value: null
  13. },
  14. panoMatrix: {
  15. type: "m4",
  16. value: new THREE.Matrix4
  17. },
  18. panoPosition: {
  19. type: "v3",
  20. value: new THREE.Vector3
  21. },
  22. },
  23. vertexShader: prefixVertex + `
  24. uniform mat4 panoMatrix;
  25. uniform vec3 panoPosition;
  26. varying vec3 vWorldPosition;
  27. void main() {
  28. vec4 worldPosition = modelMatrix * vec4(position, 1.0);
  29. vec3 positionLocalToPanoCenter = worldPosition.xyz - panoPosition;
  30. vWorldPosition = (vec4(positionLocalToPanoCenter, 1.0) * panoMatrix).xyz;
  31. vWorldPosition.x *= -1.0;
  32. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  33. }
  34. `,
  35. fragmentShader: prefixFragment + `
  36. uniform float opacity;
  37. varying vec3 vWorldPosition;
  38. #define PI 3.141592653
  39. #if defined(Not_Cube)
  40. uniform sampler2D panoMap;
  41. vec4 texCubemapWith2D(sampler2D t,vec3 dir)
  42. {
  43. dir=normalize(dir);
  44. float tx = atan(dir.x,dir.z)/(PI*2.0)+0.5;
  45. float ty = acos(dir.y)/PI;
  46. vec4 color = texture2D(t, vec2(tx,ty));
  47. return color;
  48. }
  49. #else
  50. uniform samplerCube panoMap;
  51. #endif
  52. void main()
  53. {
  54. vec4 colorFromPanos;
  55. #if defined(Not_Cube)
  56. colorFromPanos = texCubemapWith2D(panoMap, vWorldPosition);
  57. #else
  58. colorFromPanos = textureCube(panoMap, vWorldPosition.xyz);
  59. #endif
  60. gl_FragColor=vec4(colorFromPanos.rgb, colorFromPanos.a*opacity);
  61. }
  62. `
  63. },
  64. floorLogo: { //地面logo
  65. uniforms: {
  66. map: {
  67. type: "t",
  68. value: null
  69. },
  70. opacity:{
  71. type:"f",
  72. value: 0
  73. },
  74. opaRadius:{//百分比
  75. type:"f",
  76. value: 0.2
  77. }
  78. },
  79. vertexShader: "varying vec2 vUv;void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}",
  80. fragmentShader: "uniform sampler2D map; uniform float opacity;uniform float opaRadius;varying vec2 vUv; void main() { vec2 vUv2 = vec2(vUv.x*2.0 - 1.0, vUv.y*2.0 - 1.0); vec4 colorFromTexture = texture2D( map, vUv ); float opa = 1.0; float r = vUv2.x*vUv2.x + vUv2.y*vUv2.y; if(r > 1.0) opa = 0.0; else if(r < opaRadius)opa = 1.0; else{ float a = -1.0 / ((opaRadius - 1.0)*(opaRadius - 1.0)); float b = -2.0 * a * opaRadius; float c = 1.0 + a * opaRadius * opaRadius; opa = a * r*r + b * r + c; } gl_FragColor = vec4(colorFromTexture.rgb, opacity * min(colorFromTexture.a, opa) );}"
  81. },
  82. cube: {//最基本的pano投影映射,投影中心是盒子的中心
  83. uniforms: {
  84. map: {
  85. type: "t",
  86. value: null
  87. },
  88. opacity: {
  89. type: "f",
  90. value: 1
  91. }
  92. },
  93. vertexShader: prefixVertex + "varying vec3 vWorldPosition;\n\nvoid main() {\n vWorldPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n",
  94. fragmentShader: prefixFragment + "uniform samplerCube map;\nuniform float opacity;\n\nvarying vec3 vWorldPosition;\n\nvoid main() {\n vec4 color = textureCube( map, vec3( -vWorldPosition.x, vWorldPosition.yz ) );\n gl_FragColor = vec4(color.rgb, opacity);\n}\n"
  95. },
  96. };