儘管解決問題一樣容易,但解決問題一樣困難。
由於我能獲取問題RGL的最新版本駐留的HTML輸出的片段着色器內:
varying vec4 vCol; // carries alpha
varying vec4 vPosition;
varying vec3 vNormal;
vec3 eye = normalize(-vPosition.xyz);
const vec3 emission = vec3(0., 0., 0.);
const vec3 ambient1 = vec3(0., 0., 0.);
const vec3 specular1 = vec3(1., 1., 1.);// light*material
const float shininess1 = 50.;
vec4 colDiff1 = vec4(vCol.rgb * vec3(1., 1., 1.), vCol.a);
const vec3 lightDir1 = vec3(0., 0., 1.);
vec3 halfVec1 = normalize(lightDir1 + eye);
void main(void) {
vec4 lighteffect = vec4(emission, 0.);
vec3 n = normalize(vNormal);
n = -faceforward(n, n, eye);
vec3 col1 = ambient1;
float nDotL1 = dot(n, lightDir1);
col1 = col1 + max(nDotL1, 0.) * colDiff1.rgb;
col1 = col1 + pow(max(dot(halfVec1, n), 0.), shininess1) * specular1;
lighteffect = lighteffect + vec4(col1, colDiff1.a);
gl_FragColor = lighteffect;
}
它外面限定在其上跳過值分配的主要功能的變量,因此失敗,編譯除零故障。解決方案是在變量值之後直接移動定義塊上方的主函數的開始:
varying vec4 vCol; // carries alpha
varying vec4 vPosition;
varying vec3 vNormal;
void main(void) {
vec3 eye = normalize(-vPosition.xyz);
const vec3 emission = vec3(0., 0., 0.);
const vec3 ambient1 = vec3(0., 0., 0.);
const vec3 specular1 = vec3(1., 1., 1.);// light*material
const float shininess1 = 50.;
vec4 colDiff1 = vec4(vCol.rgb * vec3(1., 1., 1.), vCol.a);
const vec3 lightDir1 = vec3(0., 0., 1.);
vec3 halfVec1 = normalize(lightDir1 + eye);
vec4 lighteffect = vec4(emission, 0.);
vec3 n = normalize(vNormal);
n = -faceforward(n, n, eye);
vec3 col1 = ambient1;
float nDotL1 = dot(n, lightDir1);
col1 = col1 + max(nDotL1, 0.) * colDiff1.rgb;
col1 = col1 + pow(max(dot(halfVec1, n), 0.), shininess1) * specular1;
lighteffect = lighteffect + vec4(col1, colDiff1.a);
gl_FragColor = lighteffect;
}
這將根據需要顯示對象。
如果你說你不熟悉html和webgl,你可能想再次聯繫Duncan Murdoch並給他發一個鏈接到這篇文章。
由於輸出中唯一的區別是着色器,我建議嘗試將shadercode從舊版本複製到新版本。除此之外,用這麼深的嵌入HTML頁面的代碼幾乎不可能調試這個問題。 – havarc
你好@havarc。你的意思是第12行到第78行代碼的第一部分,第12行代碼到第80行代碼的第二部分? –
那麼這就是問題所在,我並沒有看到太多的東西。我唯一能做的就是通過Firebug html檢查器運行你的示例頁面,因爲所有內容都是通過JavaScript插入到更多的javascript中。要真正調試,我需要在純HTML和JS頁面。 – havarc