2014-01-15 15 views
5

我實現一個簡單的着色器具有以下屬性: - 材料(環境,漫反射和鏡面) - 基本顏色定義了對象 的顏色 - 光色何時必須將兩種顏色相乘,何時需要添加?

片段着色器:(vColor是物體的基本顏色)

vec3 lightDir = normalize(vec3($uLightPos.xyz - vPosInEye.xyz)); 
    vec3 viewerPos = normalize(vec3(-vPosInEye.xyz)); 
    vec3 specularReflection = normalize(-reflect(lightDir, vNormal)); 

    float diffFactor = max(dot(vNormal, lightDir), 0.0); 
    vec4 Id = $uIdColor * diffFactor * vColor ; 
    vec4 Ia = $uIaColor * vColor; 
    vec4 Is = clamp($uIsColor * pow(max(dot(specularReflection, viewerPos), 0.0), $uIsShininess), 0.0, 1.0); 

    gl_FragColor = (Id + Ia + Is) + $uLightColor; 

正如你所看到的,我將物質的環境顏色乘以物體的基色。這似乎是對的,因爲我想把這些顏色混合在一起。

在「Open GL ES 2.0編程指南」一書中,實現方式與此相同。在最後一行中,我添加了燈光的顏色。
我試着先乘以顏色,但後來我得到了奇怪的結果:黃色*藍色導致黑色(這是明確的,因爲黃色是(1.0,1.0,0)和藍色(0.0,0.0,1.0),所以我換成了* 。與+這似乎產生正確的顏色(白色)

所以我的問題是:是否有一個經驗法則,當我要乘兩個顏色放在一起,何時添加它們

+0

你必須根據你想要得到的效果/結果來做! – Vallentin

+0

@GünterZöchbauer爲什麼你將着色器代碼標記爲Dart? – Fox32

+0

抱歉是一個錯誤,沒有足夠接近。你爲什麼要添加飛鏢標籤? –

回答

6

你需要?例如,如果您有一種藍色材質,您希望將其上的光線乘以材料的顏色,因爲它應該只反射藍光;如果您有黃光一個藍色的材料,你會期望得到黑色,因爲藍色材料不會反射黃光。 (在現實生活中,你永遠不會有這種完美的材料,他們可能是(0.5 0.5,0.75)...

如果你有兩個光源,例如,那麼你可能會添加他們,因爲你想總計從各貢獻。你看光是簡單相加兩個燈的,所以添加。

+0

所以這意味着+是錯誤的,因爲你不要指望它是白色的。我想應該再看看「色彩」( - : – morpheus05

0

jcoder的答案是正確的。

不過,我覺得你可以把更加簡單。

乘以發生當光線遇到物體時 當有多個光源發出光線時會發生添加

我們之所以乘以計算物體光交互作用,是因爲jcoder說,在這種照明模式下 1)每個光源顏色都是獨立的 2)物體吸收光的固定顏色百分比擊中他們。

好奇的提示: 你可以嘗試用一個物體吸收固定光量的物體來代替這個模型(減去,不是乘 - 顯然你需要將其剪成零,所以你不會得到-ve光) 結果是當它變暗時,你會在顏色之間獲得更多的對比。 不現實,但有一種「更真實」的效果。有點像「麻醉劑」效應。