gpt4 book ai didi

opengl - 片段着色器并为纹理着色

转载 作者:行者123 更新时间:2023-12-03 13:25:49 25 4
gpt4 key购买 nike

我试图通过片段着色器来调整纹理颜色。我的片段着色器非常简单:

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值对其进行调制。

现在,当您使该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);

关于opengl - 片段着色器并为纹理着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com