2015-06-18 30 views
-1

我的phong片段着色器沒有遮擋任何東西,只是將所有東西都變成黑色。 這是我的片段着色器這個GLSL程序是否正確?我的立方體是黑色的

precision mediump float; 
varying vec3 vposition; 
varying vec3 vnormal; 
varying vec4 vcolor; 
varying vec3 veyePos; 

void main() { 
    vec3 lightPos = vec3(0,0,0); 
    vec4 s = normalize(vec4(lightPos,1) - vec4(veyePos,1)); 
    vec4 r = reflect(-s,vec4(vnormal, 1)); 
    vec4 v = normalize(-vec4(veyePos, 1)); 
    float spec = max(dot(v,r),0.0); 
    float diff = max(dot(vec4(vnormal,1),s),0.0); 
    vec3 diffColor = diff * vec3(1,0,0); 
    vec3 specColor = pow(spec,3.0) * vec3(1,1,1); 
    vec3 ambientColor = vec3(0.1,0.1,0.1); 
    gl_FragColor = vec4(diffColor + 0.5 * specColor + ambientColor, 1); 
} 

這是我的頂點着色器

uniform mat4  uMVPMatrix; 
uniform mat4  uMVMatrix; 
uniform vec3  eyePos; 
attribute vec4  aPosition; 
attribute vec4  aColor; 
attribute vec4  aNormal; 
varying vec4  vcolor; 
varying vec3  vposition; 
varying vec3  vnormal; 
varying vec3  veyePos; 

void main() { 
    mat4 normalMat = transpose(inverse(uMVMatrix)); 
    vec4 vertPos4 = uMVMatrix * vec4(vec3(aPosition), 1.0); 
    vposition = vec3(vertPos4)/vertPos4.w; 
    vcolor = aColor; 
    veyePos = eyePos; 
    vnormal = vec3(uMVMatrix * vec4(vec3(aNormal),0.0)); 
    gl_Position = uMVPMatrix * aPosition; 
} 

MVMatrix是模型視圖矩陣 MVPMatrix是模型 - 視圖 - 投影矩陣

+0

不知道爲什麼它是黑色的,但所有的點產品應該是3D,而不是同質4D – jozxyqk

+0

什麼了着色器編譯和鏈接日誌說?在ES2中將整數('1')轉換爲浮點類型('vec4')是可疑的。 – genpfault

+0

它成功編譯了兩個着色器,將那些vec4(_,1)更改爲vec4(_,0)有什麼區別? – samsun96

回答

3

第一所有照明方程是不正確的: 用於計算漫反射顏色的矢量應該是始於您的頂點(vposition)的單位矢量。所以這將是 S =正常化(lightPos - vposition)

也lightPos應在相機的空間,而不是在世界空間(所以你應該用自己的MV矩陣相乘)給予

矢量r是反思的正常,所以我不明白你爲什麼採取 - 也正常應該在非本土座標,所以它應該是: r = reflect(s,vnormal)

最後v是視線(乘以-1),所以它應該是起源於vposition並朝向眼位的矢量。 v =標準化(veyepos - vposition)

也在你的頂點着色器veyepos(假設它是你的相機的位置)不應該是變化的(應該是平變量),因爲你不想插入它。

在您的頂點着色器中,您計算​​normalMat,但在計算相機空間中的法線時忘了使用它。 也normalMat應該MAT3因爲它是有效的,你應該計算在CPU的normalMat,並通過它你的MV矩陣起源於(0,0)

**,以便在 3by3塊的逆轉作爲一個統一到您的頂點着色器

希望這有助於