簡體   English   中英

片段着色器和着色紋理

[英]Fragment shader and coloring a texture

我試圖通過片段着色器調整紋理顏色。 我的片段着色器非常簡單:

uniform sampler2D sampler;

void main() {
  vec4 tex = texture2D ( sampler, uvVarying );
  gl_FragColor = vec4(tex.r, tex.g, tex.b, tex.a);
}

這按照預期繪制了我的狗紋理: 正常的狗

如果我然后將着色器更改為

  gl_FragColor = vec4(tex.r, tex.g, tex.b, 1.0);

結果是我的預期,透明度信息丟失:

沒有透明度

但如果我把它設置為:

  gl_FragColor = vec4(tex.r, tex.g, tex.b, 0.0);

我期待它完全消失,但我得到:

綠狗

到底是怎么回事??

對於我原來的問題:我想在我的紋理中添加一點紅色:

  gl_FragColor = vec4(tex.r + 0.5, tex.g, tex.b, tex.a);

現在,我希望它具有與原始紋理相同的透明度信息,但我得到了這個:

紅色的狗

我在這里想念的是什么 紋理使用引擎的默認混合,即src = GL_ONE, dst = GL_ONE_MINUS_SRC_ALPHA

您的混合模式假定為預乘的alpha,這通常是一個很好的選擇。 但它需要將RGB值與alpha值相乘。 alpha值僅控制在該模式下將多少背景添加到傳入片段。 因此,為了使RGB“淡出”,它們也必須由α值調制。

現在,當您將該alpha值弄為常量時,您的RGB值不再與該預乘匹配。 試試這個紅色着色:

gl_FragColor = tex + vec4(0.5, 0, 0, 1)*tex.a;

這會在紋理中添加alpha調制紅色。

如果你希望圖像完全消失,你需要一個不同的混合模式,即GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,但是你需要一個非預乘的alpha圖像,或者你在着色器中補償這個預乘:

gl_FragColor = vec4(tex.rgb/tex.a, tex.a);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM