2017-09-23 42 views
0

我正在一個WebGL的實驗即完成後,將有希望可播放的合成器「浮動的常量lowp 3成分的矢量」:WebGL的iOS的錯誤:分配非恆定到

https://mysterypancake.github.io/Waveform

問題是,我在着色器上很垃圾。我的着色器都是純文本的位置:

https://github.com/MysteryPancake/Waveform/blob/master/scripts/Shader.js

問題在於液滴片段着色器:

void main(void) { 
    lowp vec2 circCoord = 2.0 * gl_PointCoord - 1.0; 
    if (dot(circCoord, circCoord) > 1.0) discard; 
    const lowp vec3 lightDir = normalize(vec3(0, -1, -0.5)); 
    const lowp vec3 ambient = vec3(0.5, 0.2, 0.1); 
    const lowp vec3 lightDiffuse = vec3(1, 0.5, 0.2); 
    lowp vec3 normal = vec3(circCoord, sqrt(1.0 - dot(circCoord, circCoord))); 
    lowp float color = max(dot(normal, lightDir), 0.0); 
    gl_FragColor = vec4(ambient + lightDiffuse * color, 1); 
} 

在iOS上,這個shader給了我這個錯誤:

ERROR: 0:5: '=': assigning non-constant to 'const lowp 3-component vector of float'

我無法弄清楚如何解決這個問題。我甚至不能搞清楚,如果這指的是7號線:

lowp vec3 normal = vec3(circCoord, sqrt(1.0 - dot(circCoord, circCoord))); 

或線路8:

lowp float color = max(dot(normal, lightDir), 0.0); 
+1

錯誤消息menas,您將一個非常量值賦值給用'const'聲明的變量值。也許是這一行:'const lowp vec3 lightDir = normalize(vec3(0,-1,-0.5));' - 嘗試它沒有'const'。 – Rabbid76

+1

@ Rabbid76非常感謝你,這真的有用!你可以添加這個答案,以便我可以接受它嗎? – MysteryPancake

+1

不客氣。 – Rabbid76

回答

1

ERROR: 0:5: '=': assigning non-constant to 'const lowp 3-component vector of float'.

此錯誤消息意味着,你非恆定的值賦給變量聲明爲const

在您的代碼,在該行中出現的錯誤:

const lowp vec3 lightDir = normalize(vec3(0, -1, -0.5)); 

在你的情況(這取決於瀏覽器),所述函數normalize不能transfomred到一個常量表達式。

+2

這是某些WebGL中的錯誤。應該做回購,並[應該提交](https://github.com/KhronosGroup/WebGL/issues/new)。 GLSL ES規範清楚地表明這是合法的。該規範的4.3節說,你必須使用一個常量表達式。 5.10節定義了常量表達式,它們包括內置的函數,但紋理查找函數除外 – gman

+2

從上面重複,但[官方測試在這裏](https://www.khronos.org/registry/webgl/sdk/tests/conformance/glsl /misc/const-variable-initialization.html?webglVersion=1&quiet=0),它似乎已經在iOS 9.3.5之後的某個時間修復了 – gman