2013-03-20 15 views
6

Kendi (opengl dahili değil) ışığımı kullanıyorum. Şimdi problem i ile 2 ışık kaynağı olduğunda ben sadece ÇıktıRengi değişkeni eklemek çünkü ortam renk vec4(0.2f, 0.2f, 0.2f, 1.0f) modeline ortam rengi vec4(0.4f, 0.4f, 0.4f, 1.0f) olacağı görüşünde yani,GLSL birden fazla ışıktan renk vektörünü hesaplıyor

#version 330 

in vec4 vertexPosition; 
in vec3 surfaceNormal; 
in vec2 textureCoordinate; 
in vec3 eyeVecNormal; 

out vec4 outputColor; 

uniform sampler2D texture_diffuse; 
uniform bool specular; 
uniform float shininess; 

struct Light { 
    vec4 position; 
    vec4 ambientColor; 
    vec4 diffuseColor; 
    vec4 specularColor; 
}; 

uniform Light lights[8]; 

void main() 
{ 
    outputColor = texture2D(texture_diffuse, textureCoordinate); 
    for (int l = 0; l < 8; l++) { 
     vec3 lightDirection = normalize(lights[l].position.xyz - vertexPosition.xyz); 
     float diffuseLightIntensity = max(0, dot(surfaceNormal, lightDirection)); 

     outputColor.rgb += lights[l].ambientColor.rgb * lights[l].ambientColor.a; 
     outputColor.rgb += lights[l].diffuseColor.rgb * lights[l].diffuseColor.a * diffuseLightIntensity; 
     if (specular) { 
      vec3 reflectionDirection = normalize(reflect(lightDirection, surfaceNormal)); 
      float specular = max(0.0, dot(eyeVecNormal, reflectionDirection)); 
      if (diffuseLightIntensity != 0) { 
       vec3 specularColorOut = pow(specular, shininess) * lights[l].specularColor.rgb; 
       outputColor.rgb += specularColorOut * lights[l].specularColor.a; 
      } 
     } 
    } 
} 

: Bu benim parça gölgelendirici programıdır. Birden çok ışık için tek bir ortam ve tek bir yaygın renk değişkenini nasıl hesaplayabilirim, bu yüzden gerçekçi bir sonuç alır mıyım?

+8

Ambient, yansıyan ışık için ayakta durduğumuz bir hack ... bu yüzden istediğiniz her şeyi yapabilirsin - Neden sadece ortam ışığından ziyade sahnenin bir özelliğini yapmıyorsunuz? – JasonD

+0

Muhtemelen parçanın uzaklığı göz önüne alındığında, ışığın yoğunluğunu azaltmak isteyebilirsiniz. Sabit işlevli boru hattının kullandığı formüllere bakın. –

cevap

12

İşte eğlenceli bir gerçek: gerçek dünyadaki ışıkların ortam, dağınık veya speküler renkleri yoktur. Onlar bir renk yayarlar. Dönem (Tamam, eğer teknik olmak istiyorsanız, ışıklar çok renk yayarlar. Ancak bireysel fotonların "ortam" özellikleri yoktur. Sadece farklı dalga boyları vardır). Yaptığınız tek şey, OpenGL'nin ortam ve dağınık açık renkler hakkındaki saçmalıklarını kopyalayan birini kopyalamak.

Başkasının kodunu kopyalamayı bırakın ve doğru.

Her ışığın bir rengi vardır. O ışığın nesneye yayılmış ve speküler katkılarını hesaplamak için bu rengi kullanırsınız. Bu kadar.

Ortam ışığı, belirli bir ışıktan değil, sahnesinin bir özelliğidir. indirect, global illumination'u temsil etmeyi amaçlamaktadır: sahne içindeki diğer nesnelerden yansıyan ışık, genel bir toplu olarak alındığı gibi. Ortamınız "ışıkları" yok; sadece bir tane ortam terimi vardır ve bir kez uygulanmalıdır.

+2

: DD Yanıtlarınızı beğendim! – Qualphey