【问题标题】:Matrix components and dot product矩阵组件和点积
【发布时间】:2011-08-23 13:35:43
【问题描述】:

我有以下 GLSL 代码:

uniform mat3x3 rgb2xyz = mat3x3(
    vec3(DEFAULT_RGB2XYZ_XR, DEFAULT_RGB2XYZ_XG, DEFAULT_RGB2XYZ_XB),
    vec3(DEFAULT_RGB2XYZ_YR, DEFAULT_RGB2XYZ_YG, DEFAULT_RGB2XYZ_YB),
    vec3(DEFAULT_RGB2XYZ_ZR, DEFAULT_RGB2XYZ_ZG, DEFAULT_RGB2XYZ_ZB)
    );

vec3 RGBtoXYZ(vec3 rgb)
{
            // Works
    float X = DEFAULT_RGB2XYZ_XR * rgb.r + DEFAULT_RGB2XYZ_XG * rgb.g + DEFAULT_RGB2XYZ_XB * rgb.b;
    float Y = DEFAULT_RGB2XYZ_YR * rgb.r + DEFAULT_RGB2XYZ_YG * rgb.g + DEFAULT_RGB2XYZ_YB * rgb.b;
    float Z = DEFAULT_RGB2XYZ_ZR * rgb.r + DEFAULT_RGB2XYZ_ZG * rgb.g + DEFAULT_RGB2XYZ_ZB * rgb.b;
    return vec3(X, Y, Z);

            // Don't work
    /*float X = rgb2xyz[0][0] * rgb.r + rgb2xyz[0][1] * rgb.g + rgb2xyz[0][2] * rgb.b;
    float Y = rgb2xyz[1][0] * rgb.r + rgb2xyz[1][1] * rgb.g + rgb2xyz[1][2] * rgb.b;
    float Z = rgb2xyz[2][0] * rgb.r + rgb2xyz[2][1] * rgb.g + rgb2xyz[2][2] * rgb.b;
    return vec3(X, Y, Z);*/

            // Don't work
    /*return vec3(
        dot(rgb2xyz[0], rgb),
        dot(rgb2xyz[1], rgb),
        dot(rgb2xyz[2], rgb)
    );*/
}

例程RGBtoXYZ 有三个代码块(最后两个注释)。第一个按预期工作,而其他评论的则不起作用。

问题是我认为它们是等价的。为什么他们不是?

【问题讨论】:

  • 你也必须给出dot()的定义。
  • 查看答案中的 cmets。但是,这里是:float dot (genType x, genType y)
  • GLSL 中的矩阵是column-major,顺便说一句。
  • @Nicol Bolas 我的代码不遵循列主要约定吗?
  • @Luca:没有。mat4[0] 是矩阵的第一列。除非您将向量与矩阵进行左乘,否则您不会将矩阵的列与向量进行点积。您使用向量对列进行 MADD。因为您正在对转置矩阵进行手动左乘,所以您的数学运算正确。此外,您不需要手动将矩阵与向量相乘; * 运算符会为你做这件事。

标签: opengl matrix glsl opengl-3 dot-product


【解决方案1】:

我不敢相信!

Paul-Jan edit 解决了我的问题!

只是 GLSL 编译器不会在矩阵初始化时发出错误! 我不敢相信!


我很好奇你们这里的 cmets,我正在考虑就这个问题提出另一个问题。

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多