【发布时间】:2017-03-17 16:23:01
【问题描述】:
我希望那里可能有一位 GLSL 专家可以帮助解决这个问题, 我正在尝试使用三个单独的纹理作为 alpha 通道(黑白图像)将三个纹理混合在一起,我希望它们堆叠在一起而不增加下面的亮度,但我使用threejs 和着色器材质类。我可以成功地在每一层上映射不透明度,但是当我尝试将它们组合起来时,它们似乎会奇怪地相乘和混合(这意味着在顶部应用每一层时,图像会变得更亮)
我在下面使用的纹理示例...
扩散:
Alpha 贴图(黑白):
我的片段着色器就是这样.....
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D tOne;
uniform sampler2D tSec;
uniform sampler2D tThi;
uniform sampler2D aOne;
uniform sampler2D aSec;
uniform sampler2D aThi;
varying vec2 vUv;
void main(void)
{
vec3 c;
vec3 d;
vec3 e;
vec3 f;
vec3 m1;
vec3 m2;
vec4 Ca = texture2D(tOne, vUv);
vec4 Cb = texture2D(tSec, vUv);
vec4 Cc = texture2D(tThi, vUv);
vec4 Aa = texture2D(aOne, vUv);
vec4 Ab = texture2D(aSec, vUv);
vec4 Ac = texture2D(aThi, vUv);
c = (Ca.rgb * Aa.rgb)*1.0;
d = (Cb.rgb * Ab.rgb)*1.0;
e = (Cc.rgb * Ac.rgb)*1.0;
f = (c.rgb + d.rgb + e.rgb * (1.0))*1.0;
gl_FragColor= vec4(f, 1.0);
}
如果我用......运行它
gl_FragColor= vec4(c, 1.0);
结果:
或
gl_FragColor= vec4(d, 1.0);
结果:
或
gl_FragColor= vec4(e, 1.0);
结果:
我可以看到具有正确不透明度和 rgb 值的每一层 但正如我所说,我无法将它们组合在一起以使它们保持在正确的 rgb 值,它们似乎正在成倍增加并变得更亮。
我在某处读过关于将混合模式指定为默认打开的信息。但我不知道你会如何在threejs之类的东西上关闭它。
当前结果:
期望的结果:
或者也许我的计算只需要修正图层的组合
对此有任何帮助将不胜感激?
感谢大家的宝贵时间!
-里斯·托马斯
工作!!
MarGenDo - 你是一个明星!!! ,你说得对,我必须开始添加 alpha 的倒置部分才能让它进入下一层。
按照您的建议,一切正常,修改后的 Alpha 版!
正确的字母:
虽然我确信我可以尝试将 alpha 与着色器合并,但你的逻辑绝对合理!
再次感谢MarGenDo
所以再次工作
首先感谢 MarGenDo 和传说中的 gman,最适合我的解决方案是 gmans,因为我无法处理减去 alpha 等问题,mix 命令工作得很好!!!此外,如果您想查看它的实际效果,请查看http://www.polygonprophecy.com/html5/Island - 最好在手机上查看,因为它允许您放大和缩小(捏合和打孔)以及绕岛旋转(两根手指旋转),它的现在非常快速地使用良好的着色器编程(再次感谢你们!!!),希望在坏手机上也能快速工作! gman 你是一个该死的明星!
请注意,这是我的最终结果着色器:-
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D tOne;
uniform sampler2D tSec;
uniform sampler2D tThi;
uniform sampler2D aOne;
uniform sampler2D aSec;
uniform sampler2D aThi;
varying vec2 vUv;
void main(void)
{
vec4 Ca = texture2D(tOne, vUv);
vec4 Cb = texture2D(tSec, vUv);
vec4 Cc = texture2D(tThi, vUv);
vec4 Aa = texture2D(aOne, vUv);
vec4 Ab = texture2D(aSec, vUv);
vec4 Ac = texture2D(aThi, vUv);
vec4 g;
g = vec4(0);
g = mix(g, Ca, Aa);
g = mix(g, Cb, Ab);
g = mix(g, Cc, Ac);
gl_FragColor= vec4(g.rgb, Aa.rgb+Ab.rgb+Ac.rgb);
}
【问题讨论】: