threejs中的着色器入门三

着色器模拟光照

更新顶点着色器来向片元着色器传递顶点的法向量。
创建一个varying修饰的变量vNormal,顶点着色器和片元着色器都应该包含该变量,用于它们之间的传递。

<script id="vertexShader" type="x-shader/x-vertex">
			//normal three.js内置法线, position three.js内置位置

	varying vec3 vNormal;
	void main() {
	  // 将vNormal设置为normal,normal是Three.js创建并传递给着色器的attribute变量
	  vNormal = normal;
	  gl_Position = projectionMatrix *modelViewMatrix 
	  						*vec4(position, 1.0);
	}
</script>

在片元着色器中,创建一个同名变量,然后将法线向量与定义的光线向量点乘,并将结果作用于颜色,将会呈现类似平行光效果。

<script id="fragmentShader" type="x-shader/x-vertex">
	varying vec3 vNormal;
	void main() {
	  // 定义光线向量
	  vec3 light = vec3(0.5,0.2,1.0);
	  // 归一化向量
	  light = normalize(light);
	  // 计算光线向量和法线向量的点积,如果点积小于0(即光线无法照到),就设为0
	  float dProd = max(0.0, dot(vNormal, light));
	  // 填充片元颜色
	  gl_FragColor = vec4(dProd, // R
	                      dProd, // G
	                      dProd, // B
	                      1.0);  // A
	} 
</script>

使用点积的原因:两个向量的点积表名它们之间的“相似度”。如果两个归一化的向量,并且方向相同,点积为1;如果两个向量方向相反,点积为-1。
所以当物体的面在模拟光线的背面,将呈现黑色,正对光线的面赋予白色。

threejs的着色器内置变量

变量说明类型
position顶点位置vec3
normal法线向量vec3
uv纹理坐标vec2
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值