探究 gl_Position.w

探究 gl_Position.w

结论: w是顶点距离相机的距离。

0、环境搭建

geometry:

const size = 10
var geometry = new THREE.BoxBufferGeometry(size, size, size);
var material = new THREE.ShaderMaterial({
  uniforms: {
    camPos: { type: "f", value: this.stage.camera.position.z }
  },
  vertexShader: vertex,
  fragmentShader: fragment
});
var cube = new THREE.Mesh(geometry, material);

vertexShader:

varying float w;
varying vec3 pos;

void main() {
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
  w = gl_Position.w;
  pos = position;
}`;

fragmentShader:

varying float w;
varying vec3 pos;
uniform float camPos;

void main()	{
	float z = pos.z;
	gl_FragColor = vec4(vec3(pos.z-9., 0., 0.), 1.);
}
1、顶点坐标
gl_FragColor = vec4(vec3(pos.z-9., 0., 0.), 1.);

在这里插入图片描述

顶点在z轴的分布是:

z <-----------------
10        0          -10

z轴最前面的点pos.z = 10

2、相机位置
 gl_FragColor = vec4(vec3(camPos - 50. + 0.5, 0., 0.), 1.);

在这里插入图片描述

相机位置camPos.z = 50

3、w
gl_FragColor = vec4(vec3(w - 40. + 0.5, 0., 0.), 1.);

在这里插入图片描述

w沿着z轴分布是:

z<---------------------
40        50          60

也就是说,w是顶点距离相机的距离。

4、根据相机距离显示颜色
pos.z
z <-----------------
10        0          -10

pos.z += 10
z <-----------------
20       10          0

w
z<---------------------
40        50          60


gl_FragColor = vec4(vec3((pos.z+10.)/w+0.5, 0., 0.), 1.);

在这里插入图片描述

距离越近,颜色越深。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值