详解shader,three.js
three.js中常见的着色器代码是写在html中的
<script id='vs' type='x-shader/x-vertex'>
//顶点着色器代码
varying vec2 vUv;
void main()
{
// passing texture to fragment shader
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
//投影矩阵、模型矩阵、position顶点在物体坐标系中的位置
}
</script>
<script id='fs' type='x-shader/x-fragment'>
//片元着色器代码
varying vec2 vUv;
void main() {
gl_FragColor = vec4(vUv.x, vUv.y, 1.0, 1.0);
}
</script>
<!-- 引用着色器代码 -->
<script>
//···
material = new THREE.ShaderMaterial( {
vertexShader:document.getElementById('vs').textContent,
fragmentShader:document.getElementById('fs').textContent
} );
</script>
webgl定义了四种限定符,限定数据类型
const:
常量
attribute:
从js传递到顶点着色器中,每个顶点对应不同的值
uniform:
每个顶点/片元对应相同的值
varying:
从顶点着色器传递到片元着色器中。ps:片元着色器本身不能访问uv信息,如果需要得到这一值的话,需要从顶点着色器中传递过去。
uv:
three.js预设属性,代表了该顶点在UV映射时的横纵坐标