<li>The *fragment shader* runs second; it sets the color of each individual "fragment" (pixel) rendered to the screen.</li>
</ul>
</p>
<p>
There are three types of variables in shaders: uniforms, attributes, and varyings:
<ul>
<li>*Uniforms* are variables that have the same value for all vertices---lighting, fog, and shadow maps are examples of data that would be stored in uniforms. Uniforms can be accessed by both the vertex shader and the fragment shader.</li>
<li>*Attributes* are variables associated with each vertex---for instance, the vertex position, face normal, and vertex color are all examples of data that would be stored in attributes. Attributes can <emph>only</emph> be accessed within the vertex shader.</li>
<li>*Varyings* are variables that are passed from the vertex shader to the fragment shader. For each fragment, the value of each varying will be smoothly interpolated from the values of adjacent vertices.</li>
</ul>
Note that <emph>within</emph> 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.
</p>
<h3>Built-in attributes and uniforms</h3>
<p>
[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].
...
...
@@ -54,13 +66,7 @@
</p>
<h3>Custom attributes and uniforms</h3>
<p>
There are two ways to pass data to the shaders: uniforms and attributes.
<ul>
<li>*Uniforms* are variables that have the same value for all vertices---lighting, fog, and shadow maps are examples of data that would be stored in uniforms.</li>
<li>*Attributes* are variables associated with each vertex---for instance, the vertex position, face normal, and vertex color are all examples of data that would be stored in attributes.</li>
</ul>
Custom attributes and uniforms must be declared both in your GLSL shader code (within *vertexShader* and *fragmentShader*), <emph>and</emph> in the *attributes* and *uniforms* properties of your ShaderMaterial. The declaration in the material is necessary to ensure [page:WebGLRenderer] knows to pass your attribute/uniform data in a buffer to the GPU when the shader is run.
Custom attributes and uniforms must be declared both in your GLSL shader code (within *vertexShader* and/or *fragmentShader*), <emph>and</emph> 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).
</p>
<p>
To declare a custom attribute, use the *attributes* property of the material:
...
...
@@ -107,8 +113,19 @@
</tr>
</tbody>
</table>
[page:BufferGeometry] and [page:Geometry] differ in their handling of attribute data. When using [page:Geometry], attribute data is specified directly on the <emph>material</emph>, using the attribute's *value* array; each element of *value* should correspond to one vertex. When using [page:BufferGeometry], attribute data is stored within a [page:BufferAttribute] on the geometry itself, and the *value* within the material is ignored. See [page:BufferGeometry] for details.
The way attribute data is stored depends on whether you're using [page:BufferGeometry] or [page:Geometry]:
<ul>
<li>When using [page:Geometry], attribute data is stored directly on the <emph>material</emph>, using the attribute's *value* array; each element of *value* should correspond to one vertex. To update an attribute, set the *needsUpdate* flag to true on the material attribute:
<li>When using [page:BufferGeometry], attribute data is stored within a [page:BufferAttribute] on the geometry itself, and the *value* within the material is ignored. To update an attribute, set the *needsUpdate* flag to true on the [page:BufferAttribute] of the geometry:
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:
<code>
defines: {
FOO: 15,
BAR: true
}
</code>
yields the lines
<code>
#define FOO 15
#define BAR true
</code>
in the GLSL code.
</div>
<h3>.[page:String fragmentShader]</h3>
<div>
Fragment shader GLSL code. This is the actual code for the shader. In the example above the code is retrieved from DOM elements emnbedded directly in the page although other methods can be used including specifying a string directly.
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.
</div>
<h3>.[page:String vertexShader]</h3>
<div>
Vertex shader GLSL code. This is the actual code for the shader. In the example above the code is retrieved from DOM elements embedded directly in the page although other methods can be used including specifying a string directly.
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.
</div>
<h3>.[page:Boolean morphTargets]</h3>
<h3>.[page:Boolean lights]</h3>
<div>
todo
Defines whether this material uses lighting; true to pass uniform data related to lighting to this shader
</div>
<h3>.[page:Boolean lights]</h3>
<h3>.[page:Boolean morphTargets]</h3>
<div>
todo
Defines whether the material uses morphTargets; true morphTarget attributes to this shader
</div>
<h3>.[page:Boolean morphNormals]</h3>
<div>
todo
Defines whether the material uses morphNormals; true to pass morphNormal attributes to this shader
</div>
<h3>.[page:Boolean wireframe]</h3>
<div>
todo
Render geometry as wireframe (using GL_LINES instead of GL_TRIANGLES). Default is false (i.e. render as flat polygons).
</div>
<h3>.[page:Number vertexColors]</h3>
<div>
todo
</div>
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.
</div>
<h3>.[page:Boolean skinning]</h3>
<div>
todo
Define whether the material uses skinning; true to pass skinning attributes to the shader. Default is false.
</div>
<h3>.[page:Boolean fog]</h3>
<div>
todo
</div>
<div>Define whether the material color is affected by global fog settings; true to pass fog uniforms to the shader. Default is false.</div>
<h3>.[page:Object attributes]</h3>
<div>
todo
</div>
<h3>.[page:Number shading]</h3>
<div>
todo
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.
</div>
<h3>.[page:Number linewidth]</h3>
<div>
todo
</div>
<div>Controls line thickness; only effective if the material is attached to a [page:Line]. Default is 1.</div>
<div>Due to limitations in the <ahref="https://code.google.com/p/angleproject/"target="_blank">ANGLE layer</a>, on Windows platforms linewidth will always be 1 regardless of the set value.</div>
<h3>.[page:Number wireframeLinewidth]</h3>
<div>
todo
</div>
<div>Controls wireframe thickness; only effective if the material is attached to a [page:Mesh] and *wireframe* is true. Default is 1.</div>
<div>Due to limitations in the <ahref="https://code.google.com/p/angleproject/"target="_blank">ANGLE layer</a>, on Windows platforms linewidth will always be 1 regardless of the set value.</div>
<h3>.[page:Object defines]</h3>
<h3>.[page:WebGLProgram program]</h3>
<div>
todo
</div>
The compiled shader program associated with this material, generated by [page:WebGLRenderer]. You should not need to access this property.
</div>
<h2>Methods</h2>
<h3>.clone()</h3>
<div>
Generates a shallow copy of this material. Note that the vertexShader and fragmentShader are copied <emph>by reference</emph>, 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 <emph>by value</emph>, which allows you to have different sets of uniforms for different copies of the material.