[page:Material] →

[name]

Material rendered with custom shaders. A shader is a small program written in [link:https://www.opengl.org/documentation/glsl/ GLSL] to run on the GPU. You may want to use a custom shader if you need to: Note that a ShaderMaterial will only be rendered properly by [page:WebGLRenderer], since the GLSL code in the vertexShader and fragmentShader properties must be compiled and run on the GPU using WebGL.

Example

var material = new THREE.ShaderMaterial( { uniforms: { time: { type: "f", value: 1.0 }, resolution: { type: "v2", value: new THREE.Vector2() } }, attributes: { vertexOpacity: { type: 'f', value: [] } }, vertexShader: document.getElementById( 'vertexShader' ).textContent, fragmentShader: document.getElementById( 'fragmentShader' ).textContent } );

Vertex shaders and fragment shaders

You can specify two different types of shaders for each material:

There are three types of variables in shaders: uniforms, attributes, and varyings:

Note that within the shader itself, uniforms and attributes act like constants; you can only modify their values by passing different values to the buffers from your JavaScript code.

Built-in attributes and uniforms

[page:WebGLRenderer] provides many attributes and uniforms to shaders by default; definitions of these variables are prepended to your *fragmentShader* and *vertexShader* code by [page:WebGLProgram] when the shader is compiled; you don't need to declare them yourself. These variables are described in [page:WebGLProgram].

Some of these uniforms or attributes (e.g. those pertaining lighting, fog, etc.) require properties to be set on the material in order for [page:WebGLRenderer] to copy the appropriate values to the GPU---make sure to set these flags if you want to use these features in your own shader.

If you don't want [page:WebGLProgram] to add anything to your shader code, you can use [page:RawShaderMaterial] instead of this class.

Custom attributes and uniforms

Custom attributes and uniforms must be declared both in your GLSL shader code (within *vertexShader* and/or *fragmentShader*), and in the *attributes* and *uniforms* properties of your ShaderMaterial. The declaration in the material is necessary to ensure [page:WebGLRenderer] passes your attribute/uniform data in a buffer to the GPU when the shader is run. Note that *varying*s only need to be declared within the shader code (not within the material).

To declare a custom attribute, use the *attributes* property of the material: attributes: { vertexOpacity: { type: 'f', value: [] } } Each attribute must have a *type* property and a *value* property.

Attribute types
Attribute *type* string GLSL type JavaScript type
'f' float [page:Number]
'v2' vec2 [page:Vector2 THREE.Vector2]
'v3' vec3 [page:Vector3 THREE.Vector3]
'c' vec3 [page:Color THREE.Color]
'v4' vec4 [page:Vector4 THREE.Vector4]
The way attribute data is stored depends on whether you're using [page:BufferGeometry] or [page:Geometry]:

To declare a custom uniform, use the *uniforms* property: uniforms: { time: { type: "f", value: 1.0 }, resolution: { type: "v2", value: new THREE.Vector2() } } Each uniform must have a *type* and a *value*:

Uniform types
Uniform *type* string GLSL type JavaScript type
'i', '1i' int [page:Number]
'f', '1f' float [page:Number]
'v2' vec2 [page:Vector2 THREE.Vector2]
'v3' vec3 [page:Vector3 THREE.Vector3]
'c' vec3 [page:Color THREE.Color]
'v4' vec4 [page:Vector4 THREE.Vector4]
'm3' mat3 [page:Matrix3 THREE.Matrix3]
'm4' mat4 [page:Matrix4 THREE.Matrix4]
't' sampler2D [page:Texture THREE.Texture]
't' samplerCube [page:Texture THREE.CubeTexture]

Constructor

[name]([page:Object parameters])

parameters -- An object containing various parameters setting up shaders and their uniforms.
shading — Define shading type. Default is THREE.SmoothShading.
fog — Define whether the material color is affected by global fog settings. Default is true.
wireframe — render geometry as wireframe. Default is false.
wireframeLinewidth — Line thickness. Default is 1.
vertexColors — Define how the vertices gets colored. Default is THREE.NoColors.
skinning — Define whether the material uses skinning. Default is false.
morphTargets — Define whether the material uses morphTargets. Default is false.

Properties

[property:Object uniforms]

Object specifying the uniforms to be passed to the shader code; keys are uniform names, values are definitions of the form { type: 'f', value: 1.0 } where *type* is a uniform type string, and *value* is the value of the uniform. Names must match the name of the uniform, as defined in the GLSL code. Note that uniforms are refreshed on every frame, so updating the value of the uniform will immediately update the value available to the GLSL code.

[property:Object attributes]

Object specifying the custom attributes to be passed to the shader code; keys are attribute names, values are definitions of the form { type: 'f', value: [1.0, 0.5, 2.0, ...] } where *type* is an attribute type string, and *value* is an array containing an attribute value for each vertex in the geometry (or *undefined* if using [page:BufferGeometry]). Names must match the name of the attribute, as defined in the GLSL code.

Note that attribute buffers are not refreshed automatically when their values change; if using [page:Geometry], set needsUpdate = true on the attribute definition. If using [page:BufferGeometry], set needsUpdate = true on the [page:BufferAttribute].

[property:Object defines]

Defines custom constants using *#define* directives within the GLSL code for both the vertex shader and the fragment shader; each key/value pair yields another directive: defines: { FOO: 15, BAR: true } yields the lines #define FOO 15 #define BAR true in the GLSL code.

[property:String vertexShader]

Vertex shader GLSL code. This is the actual code for the shader. In the example above, the *vertexShader* and *fragmentShader* code is extracted from the DOM; it could be passed as a string directly or loaded via AJAX instead.

[property:String fragmentShader]

Fragment shader GLSL code. This is the actual code for the shader. In the example above, the *vertexShader* and *fragmentShader* code is extracted from the DOM; it could be passed as a string directly or loaded via AJAX instead.

[property:Number shading]

Define shading type, which determines whether normals are smoothed between vertices; possible values are [page:Materials THREE.SmoothShading] or [page:Materials THREE.FlatShading]. Default is THREE.SmoothShading.

[property:Number linewidth]

Controls line thickness; only effective if the material is attached to a [page:Line]. Default is 1.
Due to limitations in the ANGLE layer, on Windows platforms linewidth will always be 1 regardless of the set value.

[property:Boolean wireframe]

Render geometry as wireframe (using GL_LINES instead of GL_TRIANGLES). Default is false (i.e. render as flat polygons).

[property:Number wireframeLinewidth]

Controls wireframe thickness; only effective if the material is attached to a [page:Mesh] and *wireframe* is true. Default is 1.
Due to limitations in the ANGLE layer, on Windows platforms linewidth will always be 1 regardless of the set value.

[property:Boolean fog]

Define whether the material color is affected by global fog settings; true to pass fog uniforms to the shader. Default is false.

[property:Boolean lights]

Defines whether this material uses lighting; true to pass uniform data related to lighting to this shader

[property:Number vertexColors]

Define how the vertices are colored, by defining how the *colors* attribute gets populated. Possible values are [page:Materials THREE.NoColors], [page:Materials THREE.FaceColors] and [page:Materials THREE.VertexColors]. Default is THREE.NoColors.

[property:Boolean skinning]

Define whether the material uses skinning; true to pass skinning attributes to the shader. Default is false.

[property:Boolean morphTargets]

Defines whether the material uses morphTargets; true morphTarget attributes to this shader

[property:boolean morphNormals]

Defines whether the material uses morphNormals. Set as true to pass morphNormal attributes from the [page:Geometry] to the shader. Default is *false*.

[property:WebGLProgram program]

The compiled shader program associated with this material, generated by [page:WebGLRenderer]. You should not need to access this property.

Methods

[method:ShaderMaterial clone]()

Generates a shallow copy of this material. Note that the vertexShader and fragmentShader are copied by reference, as are the definitions of the *attributes*; this means that clones of the material will share the same compiled [page:WebGLProgram]. However, the *uniforms* are copied by value, which allows you to have different sets of uniforms for different copies of the material.

Source

[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]