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