我正在尝试将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;
}

最佳答案

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

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

在适当的GLSL版本的规则下,这将提取给定mat4的左上3x3子矩阵。 GLSL 1.10不太合适。

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

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

08-28 07:42