2015-02-05 126 views
1

我收到这个错误,我无法访问的PC上。非法矢量字段选择长度

错误出现在深度剥离技术的init程序的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; 
} 

我从来没有与它有问题之前,我dev的大多Nvidia和这一个来自配备了ATI的FirePro M7740

我一台机器也尝试谷歌,当然,但没有结果与引用的句子:“非法矢量字段选择长度”..

我检查了几十次,它看起来很好,我,没有任何向量长度上的错误..

任何线索?

回答

0

的问题到底是什么错误消息说:

非法矢量场选择长度

在您尝试使用length作为一个字段选择唯一的线是这个(换行符添加):

float cosine = dot(cameraSpacePosition, cameraSpaceNormal)/
       (cameraSpacePosition.length * cameraSpaceNormal.length); 

length此用法无效。有在GLSL的length两个有效用法:

  1. 作为上数组变量的方法,以找到在数组中元素的数目。如果a是一个数组变量,那么可以编写a.length()来获取元素的数量。请注意括号。
  2. 作为计算矢量长度的内置函数。如果v是一个向量,则长度计算为length(v)。请注意函数语法。

根据上下文,你要找的选项2的正确语法该线路是:

float cosine = dot(cameraSpacePosition, cameraSpaceNormal)/
       (length(cameraSpacePosition) * length(cameraSpaceNormal)); 
+0

我还没有测试它,但看在GLSL文档,你是对的。感谢您的提示,Reto – elect 2015-02-09 09:56:07

+0

Reto,在Nvidia上工作,在Amd不..这是否意味着Nvidia驱动程序正在通过重新编译来修复它? – elect 2015-04-16 09:10:16