2011-03-04 77 views
0
#version 150 
uniform float shade; 
in vec3 cshade; 
in vec3 v_o; 
in vec3 locallight_o; 
in vec3 n; 
in float shadescale_o; 
out vec4 pixelcolour; 
void main() 
{ 
    float shadescale; 
    shadescale=shadescale_o; 
    vec3 vn,l,ln,nn,h,hh; 
    vec3 ambient = vec3(0.4,0.4,0.4);  // ambient light  

    vn=normalize(v_o); 
    ln=normalize(locallight_o); 
    if (dot(ln,n)<0) 
    { 
     h=vn-ln;//light direction shines from source to object 
     hh=h; 
     h=normalize(h); 
     nn=normalize(n); 
     shadescale= dot(h,nn);//inward normal 
     if (shadescale<0) 
      shadescale=0; 
     shadescale*=shadescale; 
     shadescale*=shadescale; 
    } 
    else 
    shadescale=0; 

    // Get pixel colour from input shade 
    if (shade>=0.5) 
    {  
     pixelcolour = vec4((cshade * shadescale) + (ambient * cshade), 1.0); // ambient lighting  

     //pixelcolour = vec4((cshade*ambient)+ambient, 1.0); 
     //pixelcolour += vec4(ambient, 1.0); 
    } 
    else 
    { 
     pixelcolour = vec4((cshade * shadescale_o) + (ambient * cshade), 1.0); 

     //pixelcolour = vec4((cshade*ambient)+ambient, 1.0);  
     //pixelcolour += vec4(ambient, 1.0); 

    }    

} 

上述代碼是一種直觀的像素着色器,用於顯示多維數據集的openGL框架。目前環境照明已經實現,但是我怎麼去添加漫反射和鏡面反射(當然不是同時!)到這個代碼?我知道我需要一些額外的制服,即vec3的漫反射和鏡面反射,但我應該執行什麼樣的確切操作?此像素着色器中的漫反射和鏡面反射

回答

1

我不打算將代碼粘貼到這裏,但所有問題的答案是http://www.lighthouse3d.com/opengl/glsl/index.php?lights

簡而言之,diffuse = -dot(normal,lightDir)。 爲什麼?那麼點積計算兩個向量的「相同性」,如果它們相同,則爲1;如果它們是直角,則爲0;如果它們相反,則爲-1。如果臉部的法線直接指向光線(法線和光線相反),它應該取最大值。如果光線照射在一個角度上,則點積返回值接近0,從而形成最終的發光值。

應該注意的是,lightDir和normal必須標準化。

+0

偉大的鏈接感謝的是,與方程幫助。我沒有嚴格使用OpenGL,只是簡單地編輯給定的代碼,而不使用可能使生活更輕鬆的GL命令。 –

0

雖然我可以從你的代碼中看到的,我相信下面的事情:

  • v_o IST片段位置
  • locallight_o是本地光源的poasition
  • n是正常的在片段位置處的載體

另外,我假定這些點和矢量具有相同的參考系並在眼睛空間。

有了這些信息,您可以實現帶恆定環境光的簡單Blinn Phong燈光模型。

Calcualte環境光:

vec3 ambient = vec3(0.2, 0.2, 0.2); 
pixelcolour = ambient; 

Calcualte朝向所述光與Labertian擴散術語並把它添加到結果:

vec3 diffuse = vec3(0.6, 0.6, 0.6); 
vec3 normalV = normalize(n); 
vec3 lightV = normalize(locallight_o - v_o); 
float NdotL = max(0.0, dot(normalV, lightV)); 
pixelcolour += NdotL * diffuse; 

Calcualete中途矢量和Blinn- Phong鏡面反射高亮並將其添加到結果中:

vec3 specular = diffuse; 
float shininess = 20.0; 
vec3 eyeV = normalize(-v_o); 
vec3 halfV = normalize(eyeV + lightV); 
float NdotH = max(0.0, dot(normalV, halfV)); 
pixelcolour += (shininess + 2.0) * pow(NdotH, shininess)/(2.0 * 3.14159265); 

又見回答這個質疑

How does this faking the light work on aerotwist?

GLSL fixed function fragment program replacement

相關問題