GLSL 110 不允许子矩阵或超矩阵构造函数

GLSL 110 does not allow sub- or super-matrix constructors

我正在尝试将 330 着色器转换为 110,但找不到解决方法:

v_norm = normalize(mat3(modelview) * vNormal);

返回的错误是:

GLSL 110 does not allow sub- or super-matrix constructors

完整的着色器:

#version 110

attribute  vec3 vPosition;
attribute  vec3 vNormal;
varying vec3 v_norm;

uniform mat4 modelview;

void main()
{
    gl_Position = modelview * vec4(vPosition, 1.0);
    v_norm = normalize(mat3(modelview) * vNormal);
    v_norm = vNormal;
}

我假设您不理解 "sub- or super-matrix construction" 是什么,因为如果您理解了,解决方法就很明显了。

语句 mat3(modelview) 告诉 GLSL to construct a mat3。但是传给它的矩阵是一个mat4,一个4x4的矩阵。显然有 16 个数字而不是 mat3.

使用的 9 个

根据正规 GLSL 版本的规则,这将提取给定 mat4 的左上角 3x3 子矩阵。 GLSL 1.10 并不像样。

因此解决方法是手动完成。构造一个 mat3 由 9 个值组成,取自 modelview 矩阵的左上部分。或者来自三个向量:

mat3(modelview[0].xyz, modelview[1].xyz, modelview[2].xyz)