GLSL编译器选择错误的重载函数?

时间:2017-06-01 18:45:59

标签: compiler-errors three.js glsl vertex-shader

我正在尝试计算GLSL中高度贴图的曲面法线。我基本上复制了来自SO答案here的代码,只需稍加修改即可匹配我的代码:

77:                 float s01 = textureOffset(uTexture, uv, off.xy).x;
78:                 float s21 = textureOffset(uTexture, uv, off.zy).x;
79:                 float s10 = textureOffset(uTexture, uv, off.yx).x;
80:                 float s12 = textureOffset(uTexture, uv, off.yz).x;
81:                 vec3 va = normalize(vec3(size.xy, s21-s01));
82:                 vec3 vb = normalize(vec3(size.yx, s12-s10));
83:                 vec3 vNormal = cross(va,vb);

其中

uniform sampler2D   uTexture;
attribute vec2      uv;
const vec2          size = vec2(2.0, 0.0);
const ivec3         off = ivec3(-1, 0, 1);

问题是编译器返回错误:

THREE.WebGLProgram: shader error:  0 gl.VALIDATE_STATUS false gl.getProgramInfoLog invalid shaders ERROR: 0:77: 'textureOffset' : no matching overloaded function found
ERROR: 0:77: 'x' :  field selection requires structure or vector on left hand side
ERROR: 0:78: 'textureOffset' : no matching overloaded function found
ERROR: 0:78: 'x' :  field selection requires structure or vector on left hand side
ERROR: 0:79: 'textureOffset' : no matching overloaded function found
ERROR: 0:79: 'x' :  field selection requires structure or vector on left hand side
ERROR: 0:80: 'textureOffset' : no matching overloaded function found
ERROR: 0:80: 'x' :  field selection requires structure or vector on left hand side

编译器显然选择了textureOffset的错误重载,但是查看规范here,它看起来应该可以正常工作。那么......我错过了什么?我还在研究,但是对于GLSL新手的任何提示都会受到赞赏。 TIA。

注意:这是在OSX上使用three.js r85

1 个答案:

答案 0 :(得分:2)

查看webgl 1.0着色器的规范明确限制为不包含textureOffset的着色器glsl规范Es 1.0。

WebGL 2.0可以使用包含textureOffset的ES 3.0着色器。

即。您要遵守的限制是由Webgl 1.0规范强制执行的,而不是浏览器/ three.js / platform错误。