ShaderMaterial.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import { Material } from './Material.js';
  2. import { UniformsUtils } from '../renderers/shaders/UniformsUtils.js';
  3. /**
  4. * @author alteredq / http://alteredqualia.com/
  5. *
  6. * parameters = {
  7. * defines: { "label" : "value" },
  8. * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
  9. *
  10. * fragmentShader: <string>,
  11. * vertexShader: <string>,
  12. *
  13. * wireframe: <boolean>,
  14. * wireframeLinewidth: <float>,
  15. *
  16. * lights: <bool>,
  17. *
  18. * skinning: <bool>,
  19. * morphTargets: <bool>,
  20. * morphNormals: <bool>
  21. * }
  22. */
  23. function ShaderMaterial( parameters ) {
  24. Material.call( this );
  25. this.type = 'ShaderMaterial';
  26. this.defines = {};
  27. this.uniforms = {};
  28. this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';
  29. this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';
  30. this.linewidth = 1;
  31. this.wireframe = false;
  32. this.wireframeLinewidth = 1;
  33. this.fog = false; // set to use scene fog
  34. this.lights = false; // set to use scene lights
  35. this.clipping = false; // set to use user-defined clipping planes
  36. this.skinning = false; // set to use skinning attribute streams
  37. this.morphTargets = false; // set to use morph targets
  38. this.morphNormals = false; // set to use morph normals
  39. this.extensions = {
  40. derivatives: false, // set to use derivatives
  41. fragDepth: false, // set to use fragment depth values
  42. drawBuffers: false, // set to use draw buffers
  43. shaderTextureLOD: false // set to use shader texture LOD
  44. };
  45. // When rendered geometry doesn't include these attributes but the material does,
  46. // use these default values in WebGL. This avoids errors when buffer data is missing.
  47. this.defaultAttributeValues = {
  48. 'color': [ 1, 1, 1 ],
  49. 'uv': [ 0, 0 ],
  50. 'uv2': [ 0, 0 ]
  51. };
  52. this.index0AttributeName = undefined;
  53. this.uniformsNeedUpdate = false;
  54. if ( parameters !== undefined ) {
  55. if ( parameters.attributes !== undefined ) {
  56. console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );
  57. }
  58. this.setValues( parameters );
  59. }
  60. }
  61. ShaderMaterial.prototype = Object.create( Material.prototype );
  62. ShaderMaterial.prototype.constructor = ShaderMaterial;
  63. ShaderMaterial.prototype.isShaderMaterial = true;
  64. ShaderMaterial.prototype.copy = function ( source ) {
  65. Material.prototype.copy.call( this, source );
  66. this.fragmentShader = source.fragmentShader;
  67. this.vertexShader = source.vertexShader;
  68. this.uniforms = UniformsUtils.clone( source.uniforms );
  69. this.defines = Object.assign( {}, source.defines );
  70. this.wireframe = source.wireframe;
  71. this.wireframeLinewidth = source.wireframeLinewidth;
  72. this.lights = source.lights;
  73. this.clipping = source.clipping;
  74. this.skinning = source.skinning;
  75. this.morphTargets = source.morphTargets;
  76. this.morphNormals = source.morphNormals;
  77. this.extensions = source.extensions;
  78. return this;
  79. };
  80. ShaderMaterial.prototype.toJSON = function ( meta ) {
  81. var data = Material.prototype.toJSON.call( this, meta );
  82. data.uniforms = {};
  83. for ( var name in this.uniforms ) {
  84. var uniform = this.uniforms[ name ];
  85. var value = uniform.value;
  86. if ( value.isTexture ) {
  87. data.uniforms[ name ] = {
  88. type: 't',
  89. value: value.toJSON( meta ).uuid
  90. };
  91. } else if ( value.isColor ) {
  92. data.uniforms[ name ] = {
  93. type: 'c',
  94. value: value.getHex()
  95. };
  96. } else if ( value.isVector2 ) {
  97. data.uniforms[ name ] = {
  98. type: 'v2',
  99. value: value.toArray()
  100. };
  101. } else if ( value.isVector3 ) {
  102. data.uniforms[ name ] = {
  103. type: 'v3',
  104. value: value.toArray()
  105. };
  106. } else if ( value.isVector4 ) {
  107. data.uniforms[ name ] = {
  108. type: 'v4',
  109. value: value.toArray()
  110. };
  111. } else if ( value.isMatrix4 ) {
  112. data.uniforms[ name ] = {
  113. type: 'm4',
  114. value: value.toArray()
  115. };
  116. } else {
  117. data.uniforms[ name ] = {
  118. value: value
  119. };
  120. // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far
  121. }
  122. }
  123. if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;
  124. data.vertexShader = this.vertexShader;
  125. data.fragmentShader = this.fragmentShader;
  126. return data;
  127. };
  128. export { ShaderMaterial };
粤ICP备19079148号