2014-09-20 58 views
0

我一直在嘗試使用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。

+0

請將片段着色器添加到問題中。 – 2014-09-20 04:40:03

+0

這可能是您正在使用的框架中的一個錯誤。當你寫'v_Dot = 1.0;'時,'vNormal'頂點屬性不再使用,所以着色器編譯器可能會從程序中刪除它,而且偶爾會看到框架代碼中的錯誤,這些錯誤不會處理缺失的屬性/優雅的制服。 – 2014-09-20 05:26:29

回答

0

這裏的點積代表表面法線與光線之間的角度。通過強制vDot在任何地方都能達到1.0,你基本上認爲「表面法線和光線之間沒有角度」。因此,對於表面上的每個點,它都像光直接在其上面並且表面完全被照亮一樣。

+0

這正是我想要完成的。紋理應該提供變化。不幸的是,當我設置v_Dot = 1.0時,即使v_Dot根本不是片段着色器的一部分,紋理似乎也會被忽略。 – 2014-09-20 16:57:31

1

是的!我遇到了,確切地說是這個bug,試圖將這個完全相同的行添加到這個完全相同的演示!

這當然是一個錯誤。此外,它只在某些平臺上顯示。 例如當我在我的MacBook Pro上查看該頁面時,它看起來很好 (按照預期,使用明亮的非定向照明旋轉紋理立方體) 但是當我在我的Ubuntu機器上運行時,它失敗(沒有紋理,如您所述)。 這是在兩臺機器上使用chrome「版本46.0.2490.33 beta(64位)」。

這是我的解釋(基本上證實@DietrichEpp的評論)。

有3個屬性:0:vNormal,1:vTexCoord,2:vPosition, 和主腳本使硬編碼的假設,該指數正是這些 (請注意,當前顯示「vColor」,而不是「 )

但是,當您添加「v_Dot = 1。」時,優化器(在問題平臺上)通知vNormal不再使用,因此它將其刪除,並且屬性現在爲0:vTexCoord,1:vPosition, ,因此主腳本的索引變得不正確。 排序(即刪除所有現在未使用的東西,並相應地調整主腳本的索引), 並且程序再次運行。

這顯然是真的很脆弱,我不支持WebGL或OpenGL ES說 再熟悉不過了,這是否顯示了着色器編譯器/優化 或一些錯誤,或主腳本或實用程序庫,上述子集或其他內容。

我剛纔在做一個網絡搜索,試圖找出報告這個錯誤的地方,這就是我發現你的問題。

相關問題