Aframe component to inject custom GLSL into the THREE.js MeshStandardMaterial Shader.
Have a look at the example
Property | Description | Default Value |
---|---|---|
fragUniformsGLSL | selectorAll - selects the script tag to inject in the beggining of the fragment shader | #fragUniformsGLSL |
fragModsGLSL | selectorAll - selects the script tag to inject in main() of the fragment shader | #fragModsGLSL |
vertUniformsGLSL | selectorAll - selects the script tag to inject in the beggining of the vertex shader | #vertUniformsGLSL |
vertModsGLSL | selectorAll - selects the script tag to inject in main() of the fragment shader | #vertModsGLSL |
Note: you can also set almost every property accessible in the materials component |
Include as a <script>
tag:
<script src="https://cdn.rawgit.com/pbayer8/aframe-glsl-component/master/main.js"></script>
Add the glsl-standard
component to an entity with geometry. Note that it works better with more segments:
<a-scene fog="type:linear;near:2;far:15;">
<a-assets>
<img src="images/floral.jpg" id="floral"/>
<img src="images/couchnormal.png" id="couch"/>
<img src="images/scene.jpg" id="sky"/>
<img src="images/grass.png" id="grass"/>
</a-assets>
<a-sphere position="0 1.4 -2"
glsl-standard="
envMap:#sky;
map:#floral;
normalMap:#couch;
metalness:.5;"
segments-height="128"
segments-width="128">
</a-sphere>
</a-scene>
Then, write GLSL. This component gives you access to two vec3 type variables you can modify:
finalPosition
in the vertex shader, and finalColor
in the fragment shader.
The component creates and updates two floats variables time
(mS) and seconds
that you can use,
and a vec3 objectNormal
that you can read and use when modifying the finalPosition
variable.
I've also included a small collection of noise and shaping functions.
You can specify alternate script tags, otherwise it defaults to what is listed in the API section above:
<script id="vertUniformsGLSL" type="x-shader/x-fragment">
//add vertex shader uniforms, varyings and functions here:
varying float wave1;
varying float wave2;
</script>
<script id="vertModsGLSL" type="x-shader/x-fragment">
//modify or reassign the finalPosition vec3 here:
wave1 = sin(finalPosition.y*5.+seconds*2.);
wave2 = cos(finalPosition.x*9.+seconds*3.);
finalPosition.x += .1*wave1;
finalPosition.z += .1* wave2;
</script>
<script id="fragUniformsGLSL" type="x-shader/x-fragment">
//add fragment shader uniforms, varyings and functions here:
varying float wave1;
varying float wave2;
</script>
<script id="fragModsGLSL" type="x-shader/x-fragment">
//modify or reassign the finalColor vec3 here:
finalColor.r += min(wave1,0.);
finalColor.b += wave2;
</script>
The result will look like: