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

liv*_*muk 3 c# opengl macos glsl opentk

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

v_norm = normalize(mat3(modelview) * vNormal);
Run Code Online (Sandbox Code Playgroud)

返回的错误是:

GLSL 110 does not allow sub- or super-matrix constructors
Run Code Online (Sandbox Code Playgroud)

完整的着色器:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 6

我假设您不理解什么是“子矩阵或超级矩阵构造”,因为如果您这样做,解决方法将是显而易见的。

该语句mat3(modelview)告诉GLSL 构造一个mat3. 但传递给它的矩阵是 a mat4,一个 4x4 矩阵。显然有 16 个数字,而不是 所使用的 9 个数字mat3

根据合适的 GLSL 版本的规则,这将提取给定 的左上角 3x3 子矩阵mat4。GLSL 1.10 不太好。

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

mat3(modelview[0].xyz, modelview[1].xyz, modelview[2].xyz)
Run Code Online (Sandbox Code Playgroud)