非法矢量字段选择长度
illegal vector field selection length
我在无法访问的电脑上收到此错误。
错误出在深度剥离技术初始化程序的Vertex Shader上
ERROR: 0:42: error(#222) Illegal vector field selection length
ERROR: 0:42: error(#222) Illegal vector field selection length
ERROR: error(#273) 2 compilation errors. No code generated
这是VS:
#version 330
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 uv;
out vec3 cameraSpacePosition;
out vec3 cameraSpaceNormal;
out vec2 oUV;
uniform mat4 modelToWorldMatrix;
/*
* Layout {lighting, normal orientation, hasTexture, selected}
*/
uniform ivec4 settings;
layout(std140) uniform vehicleMatrices {
mat4 worldToCameraMatrix;
mat4 cameraToClipMatrix;
};
void main()
{
vec4 c = worldToCameraMatrix * (modelToWorldMatrix * vec4(position, 1.0));
gl_Position = cameraToClipMatrix * c;
cameraSpacePosition = c.xyz;
cameraSpaceNormal = mat3(worldToCameraMatrix) * (mat3(modelToWorldMatrix) * normal);
switch (settings.y) {
case 0:
cameraSpaceNormal = -cameraSpaceNormal;
break;
case 1:
float cosine = dot(cameraSpacePosition, cameraSpaceNormal) / (cameraSpacePosition.length * cameraSpaceNormal.length);
if ( cosine > 0)
cameraSpaceNormal = -cameraSpaceNormal;
break;
}
oUV = uv;
}
我以前从来没有遇到过问题,我主要在 Nvidia 上开发,这台机器来自配备 ATI FirePro M7740 的机器
我也试过google,当然,但是用引用的语句没有结果:"illegal vector field selection length"..
我检查了几十次,我觉得没问题,任何向量长度都没有错误..
有线索吗?
问题正是错误信息所说的:
Illegal vector field selection length
您尝试使用 length
作为字段选择器的唯一一行是这一行(添加了换行符):
float cosine = dot(cameraSpacePosition, cameraSpaceNormal) /
(cameraSpacePosition.length * cameraSpaceNormal.length);
length
的这种用法无效。 length
在 GLSL 中有两种有效用法:
- 作为数组变量的一种方法,用于查找数组中元素的数量。假设
a
是一个数组变量,你可以写 a.length()
来获取元素的数量。注意括号。
- 作为计算向量长度的内置函数。如果
v
是向量,则长度计算为 length(v)
。注意函数语法。
根据上下文,您正在寻找选项 2。该行的正确语法是:
float cosine = dot(cameraSpacePosition, cameraSpaceNormal) /
(length(cameraSpacePosition) * length(cameraSpaceNormal));
我在无法访问的电脑上收到此错误。
错误出在深度剥离技术初始化程序的Vertex Shader上
ERROR: 0:42: error(#222) Illegal vector field selection length
ERROR: 0:42: error(#222) Illegal vector field selection length
ERROR: error(#273) 2 compilation errors. No code generated
这是VS:
#version 330
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 uv;
out vec3 cameraSpacePosition;
out vec3 cameraSpaceNormal;
out vec2 oUV;
uniform mat4 modelToWorldMatrix;
/*
* Layout {lighting, normal orientation, hasTexture, selected}
*/
uniform ivec4 settings;
layout(std140) uniform vehicleMatrices {
mat4 worldToCameraMatrix;
mat4 cameraToClipMatrix;
};
void main()
{
vec4 c = worldToCameraMatrix * (modelToWorldMatrix * vec4(position, 1.0));
gl_Position = cameraToClipMatrix * c;
cameraSpacePosition = c.xyz;
cameraSpaceNormal = mat3(worldToCameraMatrix) * (mat3(modelToWorldMatrix) * normal);
switch (settings.y) {
case 0:
cameraSpaceNormal = -cameraSpaceNormal;
break;
case 1:
float cosine = dot(cameraSpacePosition, cameraSpaceNormal) / (cameraSpacePosition.length * cameraSpaceNormal.length);
if ( cosine > 0)
cameraSpaceNormal = -cameraSpaceNormal;
break;
}
oUV = uv;
}
我以前从来没有遇到过问题,我主要在 Nvidia 上开发,这台机器来自配备 ATI FirePro M7740 的机器
我也试过google,当然,但是用引用的语句没有结果:"illegal vector field selection length"..
我检查了几十次,我觉得没问题,任何向量长度都没有错误..
有线索吗?
问题正是错误信息所说的:
Illegal vector field selection length
您尝试使用 length
作为字段选择器的唯一一行是这一行(添加了换行符):
float cosine = dot(cameraSpacePosition, cameraSpaceNormal) /
(cameraSpacePosition.length * cameraSpaceNormal.length);
length
的这种用法无效。 length
在 GLSL 中有两种有效用法:
- 作为数组变量的一种方法,用于查找数组中元素的数量。假设
a
是一个数组变量,你可以写a.length()
来获取元素的数量。注意括号。 - 作为计算向量长度的内置函数。如果
v
是向量,则长度计算为length(v)
。注意函数语法。
根据上下文,您正在寻找选项 2。该行的正确语法是:
float cosine = dot(cameraSpacePosition, cameraSpaceNormal) /
(length(cameraSpacePosition) * length(cameraSpaceNormal));