2012-12-22 55 views
1

我一直在使用WebGL,但似乎我無法管理顯示紋理了。片段着色器的輸出始終爲黑色(輪廓可見)。什麼會導致片段着色器中的紋理變黑?

我知道這個問題可能會發生與紋理不是兩個冪。不幸的是我的(256x256)。此外,我確實在某些時候讓他們工作了(但我改變了太多以回溯問題)。

編輯: 我已經大大簡化了我的程序,並由gman使用WebGL Inspector(偉大的提示btw)建議。 紋理從WebGL Inspector中看起來很好。 我正要張貼整個代碼時,我注意到,雖然

var textureUniformLocation = gl.getUniformLocation(shaderProgram, "uSampler"); 
console.log(textureUniformLocation); 
gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, neheTexture); 
gl.uniform1i(textureUniformLocation, 0); 

不起作用,console.log(...)後加入alert(textureUniformLocation);使得紋理看起來... 我現在想知道的是:我的顯卡在做藥物?

編輯2:它會工作,如果我把一個簡單的字符串在警報以及。

我能想到的唯一原因是會出現內存管理不良或多個執行線程。這兩種情況都不是這裏的情況。什麼樣的事情甚至可以在JavaScript中導致這樣的問題?

任何幫助將不勝感激。

+0

嘗試將其更改爲'gl_FragColor = vec4(texture2D(...)。rgb,1.0);'只是爲了確保它不是您的alpha值爲零? – gman

+0

也是同樣的問題,如果在之前的紋理工作之後就可以工作的話,會感到驚訝。 – DrBearhands

+0

我開始添加一些'console.log()'語句。打印統一的位置(確保它們都不爲空)。也許試試'WebGL Inspector'。將'gl_FragColor'設置爲像'vec4(0,1,0,1)'這樣的常量會使綠色變成正確的?你有不止一個着色器程序?有沒有在正確的程序上調用'gl.useProgram'?從一個可用的示例開始,開始將代碼粘貼到它中,直到它停止工作。 – gman

回答

0

如果檢查員看到紋理,那麼...他們是可能是 loading。 Chrome和Firefox的行爲是否一致?報告的有關alert()的行爲使我認爲渲染可能發生在紋理加載之前,並且alert()會導致刷新(紋理加載之後)。

還要確保這不是頂點屬性(如頂點顏色或退化UV座標)的問題。

+0

它們根本不在Chrome中加載,Firefox中的行爲如上所述。 WebGL Inspector在兩者中顯示紋理。 也許圖像還不加載,即異步發生AFAIK。任何方式使主'線'在繪圖之前等待? – DrBearhands

+0

是的,就是這樣。在調用draw函數之前,圖像尚未完成加載。我曾經有移動物體,所以我會多次渲染,所以以前沒有顯示這個問題。我想我會在我跟隨的教程中發佈警告。 – DrBearhands

相關問題