我在 DirectX 中通过常量缓冲区将 3x3 矩阵传递给着色器时遇到了问题。这是我定义常量缓冲区的方式:
在 .cpp 文件中:
在.hlsl文件中:
在 .cpp 文件中:
struct PostProcessConvolutionCB {
float screenWidth;
float screenHeight;
float sum;
XMFLOAT3X3 kernel;
};
在.hlsl文件中:
struct PostProcessConvolutionCB {
float screenWidth;
float screenHeight;
float sum;
float3x3 kernel;
};
ConstantBuffer<PostProcessConvolutionCB> cb : register(b0);
struct PixelShaderInput {
float4 Position : SV_Position;
};
float4 main(PixelShaderInput IN) : SV_Target {
return float4(cb.kernel[1][1], 0.f, 0.f, 1.f);
}
看起来访问某些元素出了问题。为了测试这个问题,我像这样在常量缓冲区中初始化矩阵:XMFLOAT3X3(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f);
并尝试通过在着色器中硬编码矩阵索引来显示每个元素的值,就像上面的 hlsl 片段中一样(cb.kernel[1][1]
)。经过 9 次运行后,我得到了以下结果:
kernel[0][0] = 0.1
kernel[1][0] = 0.2
kernel[2][0] = 0.3
kernel[0][1] = 0.5
kernel[1][1] = 0.6
kernel[2][1] = 0.7
kernel[0][2] = 0.9
kernel[1][2] = 1.0
kernel[2][2] = 1.0
似乎每一行都对齐到4个浮点数。将矩阵更改为4x4有所帮助,但我想肯定有一种方法可以使用float3x3类型。
如何正确处理这个问题?