You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL顶点着色器如何计算顶点指向相机方向并实现向相机位移

问题原因

你计算的look是世界坐标系下的顶点指向相机的方向向量,但你直接把这个世界空间的方向量叠加到了模型局部坐标系的position上,两个坐标空间不统一,最终偏移结果自然不符合预期。你观察到的向原点偏移只是特定场景下的巧合表现。

正确实现代码

推荐直接在世界空间做偏移计算,性能更高、逻辑更直观:

// 1. 顶点局部坐标转世界坐标
vec4 localPosition = vec4(position, 1.0);
vec4 worldPosition = modelMatrix * localPosition;

// 2. 计算世界空间下顶点指向相机的单位方向
vec3 worldToCameraDir = normalize(cameraPosition - worldPosition.xyz);

// 3. 世界坐标沿相机方向偏移,offsetDistance可自定义偏移距离
float offsetDistance = 1.0;
vec4 offsetWorldPosition = worldPosition + vec4(worldToCameraDir * offsetDistance, 0.0);

// 4. 后续按正常流程转视图、裁剪空间即可
gl_Position = projectionMatrix * viewMatrix * offsetWorldPosition;

补充说明

如果你一定要在局部坐标阶段做偏移,需要先把世界空间的方向向量转成模型局部空间:

// 把世界空间方向转成局部空间方向
vec3 localToCameraDir = normalize( (inverse(modelMatrix) * vec4(worldToCameraDir, 0.0)).xyz );
// 再叠加到局部坐标上
vec3 transformed = position + localToCameraDir * offsetDistance;

这种方式多了一次矩阵求逆运算,性能比世界空间偏移的方案差,非必要场景不推荐使用。如果需要动态调整偏移幅度,可以新增一个uniform float offsetDistance参数从CPU侧传值控制。

内容的提问来源于stack exchange,提问作者user3591153

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:54:03