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

Vulkan漫反射着色效果不随物体变换更新问题咨询

根因排查与解决方案

1. 优先排查Push Constant内存布局不匹配问题

GLSL的结构体默认使用std140内存布局,每个mat4成员按16字节对齐,单mat4占64字节。你必须保证C++侧SimplePushConstantData的定义和GLSL侧Push结构体的成员顺序、类型完全一致,不能插入额外成员:

// C++ 侧结构体必须严格匹配以下定义
struct SimplePushConstantData {
    glm::mat4 transform;
    glm::mat4 modelMatrix;
};

如果布局不匹配,传入着色器的modelMatrix会是错误值,法线变换结果不会随模型旋转更新,就会出现暗部像烘焙到模型上的异常表现。

2. 修正法线变换逻辑

如果你的模型存在非均匀缩放,直接用mat3(push.modelMatrix)变换法线会导致法线方向畸变,正确的法线变换需要使用模型矩阵左上3x3部分的逆转置矩阵,修改顶点着色器对应代码:

// 替换原有法线计算逻辑
mat3 normalMatrix = transpose(inverse(mat3(push.modelMatrix)));
vec3 normalWorldSpace = normalize(normalMatrix * normal);

3. 验证模型变换计算逻辑

检查obj.transform.mat4()的实现,确认每帧更新的rotation.y值确实被正确计算到返回的modelMatrix中,可临时打印每帧modelMatrix的旋转分量,验证旋转过程中矩阵是否正常更新。


快速调试方法

修改顶点着色器输出,直接将法线世界坐标映射为颜色输出:

// 替换原有fragCol赋值逻辑
fragCol = normalWorldSpace * 0.5 + 0.5;

旋转模型时如果画面颜色没有变化,可直接确认是modelMatrix未正确传入着色器,优先排查Push Constant布局和C++侧矩阵计算逻辑。
另外可确认方向光方向定义是否正确:你当前的DIRECTION_TO_LIGHT是表面指向光源的方向,如果实际是光源射出的入射方向,需要取反后再参与点积计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:06:05