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)
我正在尝试将 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
.
根据正规 GLSL 版本的规则,这将提取给定 mat4
的左上角 3x3 子矩阵。 GLSL 1.10 并不像样。
因此解决方法是手动完成。构造一个 mat3
由 9 个值组成,取自 modelview
矩阵的左上部分。或者来自三个向量:
mat3(modelview[0].xyz, modelview[1].xyz, modelview[2].xyz)