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
相关产品推荐
相关产品推荐

