2011-09-02 68 views
2

我甚至不知道如何描述這個問題,所以我會嘗試用代碼解釋。我有一個片段着色器,可以進行視差映射和光照計算。我已經成功地跟蹤問題的紋理和/或照明計算的採樣,所以我就只發布代碼,要儘量簡短:OpenGL ES 2.0。 GLSL - 不能在片段着色器中同時使用兩種採樣顏色

// sample maps 
vec3 albedo = texture2D(u_albedo_texture_1, p_texc).rgb; 
vec3 ao = texture2D(u_ambientocclusion_texture, v_texcoord).rgb - 0.5; // ambient occlusion 
vec3 normalT = texture2D(u_normalmap_texture, p_texc).rgb * 2.0 - 1.0; // tangent space normal 

vec4 normalW = vec4(normalize(TBN * normalT).xyz, 1.0); // world space normal 

vec3 color = vec3(0.0); 
vec3 ambient = textureCube(u_cubemap_texture, -normalW.xyz).rgb; // get ambient lighting from cubemap 
color += ambient * ao; 

float d = length(light_vector); 
float atten = 1.0/dot(light_attenuation, vec3(1.0, d, d * d)); // compute attenuation of point light 

// diffuse term 
float ndotl = max(dot(normalW.xyz, light_vector), 0.0); 
color += atten * ndotl * light_diffuse.rgb * albedo; 

// specular term 
float hdotn = max(0.0, dot(half_vector, normalW.xyz)); 
color += atten * ((shininess + 8.0)/8.0 * 3.1416) * light_specular.rgb * p_ks * pow(hdotn, shininess); 

gl_FragColor = vec4(color.rgb, 1.0); 

我有這樣的代碼在其他着色器的工作,但在這裏在視差映射着色器中,它只是丟棄像素,我不明白爲什麼。因此,不是顯示對象而是簡單地丟棄像素,並且對象完全不顯示。沒有錯或混亂的顏色,沒有。

我設法將問題追溯到反照率和環境採樣顏色。他們都採樣正確。如果我打印出

gl_FragColor = vec4(ambient.rgb, 1.0); 

gl_FragColor = vec4(albedo.rgb, 1.0); 

他們都得到正確顯示,但如果我嘗試做兩種顏色的東西,像素被丟棄。以下工作的無:

gl_FragColor = vec4(ambient + albedo, 1.0); 
gl_FragColor = vec4(ambient * albedo, 1.0); 
gl_FragColor = vec4(ambient.r, albedo.g, ambient.b, 1.0); 

環境從立方體地圖和反照率從2D紋理採樣。我有其他環境遮擋和法線貼圖的採樣器,這些工作,他們也與環境或反照率一起工作。 所以ambient + ao作品和反照率+ ao作品。

所以,這是我的問題,我不知道是什麼原因造成的。就像我說過的,我在另一個着色器中使用相同的代碼,而且這個代碼可以工作。

值得一提的是,它運行在OpenGL ES 2.0的PowerVR模擬器上。而GPU是一款nVidia GT220。 也可以隨意指出我的代碼中的其他錯誤,比如低效的東西。如果有必要,我會發布完整的片段着色器代碼。很抱歉的長期職位:P

解決

哇,簡直不能相信的原因是很愚蠢的,但我完全錯過了。基本上,我忘了加載該特定模型的立方體貼圖,並且它沒有發送到着色器。儘管如此,它究竟如何取樣呢?我的意思是,它是單獨工作的,那麼紋理單元採樣了什麼?從前面的處理中保留在緩存中的立方體貼圖?

+0

我有一個預感,你正在着色器的紋理數量上實現一些限制,在使用環境*或*反照率(但不是兩者)的情況下,另一個會被優化掉所以不是問題。 – Flexo

回答

0

不過,這到底是怎麼抽樣呢?

通常當我着色器不會產生期望的結果,但在尋找煩人「正常」那是因爲着色器編譯丟棄它(我的地方犯了一個錯誤),並決定用「固定管道」,而不是着色器...

相關問題