2011-07-13 237 views
4

我想完成GLSL着色器,它可以紋理和着色我的頂點對象。事實上,它爲我工作在2 3情況:用於紋理,顏色和紋理/顏色的片段着色器GLSL

1)如果我只分配一個紋理(但沒有具體的顏色 - 這樣的顏色爲「白色」),我只是得到一個紋理對象 - 工程

2)如果我有一個質地和分配一個顏色,我得到那個顏色調製的紋理對象 - 工程

3)如果我只分配了顏色,但沒有質感,我得到一個黑色的物體 - 沒有按不工作

我的着色器看起來像這樣:

varying lowp vec4 colorVarying; 
varying mediump vec2 texcoordVarying; 
uniform sampler2D texture; 

void main(){ 
    gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying; 
} 

我想,如果沒有分配紋理,texture2D(...,...)將返回零 - 這似乎是問題所在。如果沒有紋理分配(在這種情況下,我只想簡單地使用gl_FragColor = colorVarying;),我可以檢查GLSL中的一種方法:

「如果」在GLSL Shader中不是真正的選項, - 任何想法來完成這個?或者是否真的有必要爲這兩種情況製作兩種不同的着色器?

回答

5

喜歡你,我會拿起那個「如果」是要避免在目前的移動硬件中的建議,但在計算器上先前優化的討論似乎表明,這不是一個顯著的障礙。所以不要把它寫下來。在任何情況下,GLSL的編譯器是相當聰明,可以選擇開關,它的代碼依賴於制服設置的值實際運行,但在這種情況下,如果你只希望提供替代着色所有你得到的是一樣的。

這就是說,如果你完全確定要使用相同的着色器的所有目的,並希望避免if語句的話,你可能想是這樣的:

uniform lowp float textureFlag; 

[...] 

gl_FragColor = textureFlag * texture2D(texture, texcoordVarying) * colorVarying + 
       (1.0 - textureFlag) * colorVarying; 

甚至:

gl_FragColor = mix(
        colorVarying, 
        texture2D(texture, texcoordVarying) * colorVarying, 
        textureFlag 
       ) 

有了你這取決於你是否想在被分解的紋理值設置textureFlag到1.0或0.0。

我不知道的任何方式來確定(我)是否sampler2D指向一個實際的紋理單元;和(ii)一個特定的紋理單元是否有一個爲其上載數據的緩衝區。

+1

我想你的意思'textureFlag'和'textureMask'有相同的變量名 –

+0

你完全正確。無論如何我還是在編輯中使用'mix'的替代方法。我很確定我有這些爭論的正確方法。 – Tommy