GLSL 编译器选择了错误的重载函数?
GLSL Compiler choosing wrong overloaded function?
我正在尝试计算 GLSL 中高度图的表面法线。我基本上从 SO answer 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);
问题是编译器returns错误:
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
查看 webgl 1.0 着色器的规范明确限制为不包括 textureOffset 的着色器 glsl 规范 Es 1.0。
WebGL 2.0 可以使用包含 textureOffset 的 ES 3.0 着色器。
即您遇到的限制是 Webgl 1.0 规范规定的,而不是 browser/three.js/platform 故障。
我正在尝试计算 GLSL 中高度图的表面法线。我基本上从 SO answer 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);
问题是编译器returns错误:
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
查看 webgl 1.0 着色器的规范明确限制为不包括 textureOffset 的着色器 glsl 规范 Es 1.0。
WebGL 2.0 可以使用包含 textureOffset 的 ES 3.0 着色器。
即您遇到的限制是 Webgl 1.0 规范规定的,而不是 browser/three.js/platform 故障。