我一直在嘗試使用WebGL,最終設法找到可以打破其中一個演示的單行更改。爲什麼在着色器中覆蓋一個值會使立方體變成白色?
https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/webkit/SpiritBox.html
有一個頂點着色器:
uniform mat4 u_modelViewProjMatrix;
uniform mat4 u_normalMatrix;
uniform vec3 lightDir;
attribute vec3 vNormal;
attribute vec4 vTexCoord;
attribute vec4 vPosition;
varying float v_Dot;
varying vec2 v_texCoord;
void main()
{
gl_Position = u_modelViewProjMatrix * vPosition;
v_texCoord = vTexCoord.st;
vec4 transNormal = u_normalMatrix * vec4(vNormal, 1);
v_Dot = max(dot(transNormal.xyz, lightDir), 0.0);
}
該演示展示了在每個面的小狗圖片的旋轉框。
如果我們增加一行到着色程序函數的末尾:
v_Dot = 1.0;
那麼框現在呈現爲白色。從= 1.0切換到
v_Dot = max(v_Dot, 1.0);
使小狗重新出現。
這裏的片段着色器的副本,以防萬一鏈接被打破:
precision mediump float;
uniform sampler2D sampler2d;
varying float v_Dot;
varying vec2 v_texCoord;
void main()
{
vec2 texCoord = vec2(v_texCoord.s, 1.0 - v_texCoord.t);
vec4 color = texture2D(sampler2d, texCoord);
color += vec4(0.1, 0.1, 0.1, 1);
gl_FragColor = vec4(color.xyz * v_Dot, color.a);
}
到底是什麼怎麼回事?我正在使用Firefox版本24.7.0。
請將片段着色器添加到問題中。 – 2014-09-20 04:40:03
這可能是您正在使用的框架中的一個錯誤。當你寫'v_Dot = 1.0;'時,'vNormal'頂點屬性不再使用,所以着色器編譯器可能會從程序中刪除它,而且偶爾會看到框架代碼中的錯誤,這些錯誤不會處理缺失的屬性/優雅的制服。 – 2014-09-20 05:26:29