ShaderMaterial.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import { Material } from './Material.js';
  2. import { cloneUniforms, cloneUniformsGroups } from '../renderers/shaders/UniformsUtils.js';
  3. import default_vertex from '../renderers/shaders/ShaderChunk/default_vertex.glsl.js';
  4. import default_fragment from '../renderers/shaders/ShaderChunk/default_fragment.glsl.js';
  5. class ShaderMaterial extends Material {
  6. constructor( parameters ) {
  7. super();
  8. this.isShaderMaterial = true;
  9. this.type = 'ShaderMaterial';
  10. this.defines = {};
  11. this.uniforms = {};
  12. this.uniformsGroups = [];
  13. this.vertexShader = default_vertex;
  14. this.fragmentShader = default_fragment;
  15. this.linewidth = 1;
  16. this.wireframe = false;
  17. this.wireframeLinewidth = 1;
  18. this.fog = false; // set to use scene fog
  19. this.lights = false; // set to use scene lights
  20. this.clipping = false; // set to use user-defined clipping planes
  21. this.forceSinglePass = true;
  22. this.extensions = {
  23. derivatives: false, // set to use derivatives
  24. fragDepth: false, // set to use fragment depth values
  25. drawBuffers: false, // set to use draw buffers
  26. shaderTextureLOD: false, // set to use shader texture LOD
  27. clipCullDistance: false, // set to use vertex shader clipping
  28. multiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID
  29. };
  30. // When rendered geometry doesn't include these attributes but the material does,
  31. // use these default values in WebGL. This avoids errors when buffer data is missing.
  32. this.defaultAttributeValues = {
  33. 'color': [ 1, 1, 1 ],
  34. 'uv': [ 0, 0 ],
  35. 'uv1': [ 0, 0 ]
  36. };
  37. this.index0AttributeName = undefined;
  38. this.uniformsNeedUpdate = false;
  39. this.glslVersion = null;
  40. if ( parameters !== undefined ) {
  41. this.setValues( parameters );
  42. }
  43. }
  44. copy( source ) {
  45. super.copy( source );
  46. this.fragmentShader = source.fragmentShader;
  47. this.vertexShader = source.vertexShader;
  48. this.uniforms = cloneUniforms( source.uniforms );
  49. this.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );
  50. this.defines = Object.assign( {}, source.defines );
  51. this.wireframe = source.wireframe;
  52. this.wireframeLinewidth = source.wireframeLinewidth;
  53. this.fog = source.fog;
  54. this.lights = source.lights;
  55. this.clipping = source.clipping;
  56. this.extensions = Object.assign( {}, source.extensions );
  57. this.glslVersion = source.glslVersion;
  58. return this;
  59. }
  60. toJSON( meta ) {
  61. const data = super.toJSON( meta );
  62. data.glslVersion = this.glslVersion;
  63. data.uniforms = {};
  64. for ( const name in this.uniforms ) {
  65. const uniform = this.uniforms[ name ];
  66. const value = uniform.value;
  67. if ( value && value.isTexture ) {
  68. data.uniforms[ name ] = {
  69. type: 't',
  70. value: value.toJSON( meta ).uuid
  71. };
  72. } else if ( value && value.isColor ) {
  73. data.uniforms[ name ] = {
  74. type: 'c',
  75. value: value.getHex()
  76. };
  77. } else if ( value && value.isVector2 ) {
  78. data.uniforms[ name ] = {
  79. type: 'v2',
  80. value: value.toArray()
  81. };
  82. } else if ( value && value.isVector3 ) {
  83. data.uniforms[ name ] = {
  84. type: 'v3',
  85. value: value.toArray()
  86. };
  87. } else if ( value && value.isVector4 ) {
  88. data.uniforms[ name ] = {
  89. type: 'v4',
  90. value: value.toArray()
  91. };
  92. } else if ( value && value.isMatrix3 ) {
  93. data.uniforms[ name ] = {
  94. type: 'm3',
  95. value: value.toArray()
  96. };
  97. } else if ( value && value.isMatrix4 ) {
  98. data.uniforms[ name ] = {
  99. type: 'm4',
  100. value: value.toArray()
  101. };
  102. } else {
  103. data.uniforms[ name ] = {
  104. value: value
  105. };
  106. // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far
  107. }
  108. }
  109. if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;
  110. data.vertexShader = this.vertexShader;
  111. data.fragmentShader = this.fragmentShader;
  112. data.lights = this.lights;
  113. data.clipping = this.clipping;
  114. const extensions = {};
  115. for ( const key in this.extensions ) {
  116. if ( this.extensions[ key ] === true ) extensions[ key ] = true;
  117. }
  118. if ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;
  119. return data;
  120. }
  121. }
  122. export { ShaderMaterial };
粤ICP备19079148号