colors - 如何修复此着色器以正确隐藏 Alpha 像素?
问题描述
我正在开发一个基本上为 2D 图像创建阴影投射效果的着色器,除了我尝试更改阴影的颜色时,几乎所有东西都可以工作,默认情况下颜色是黑色并且 alpha 像素是隐藏的,但是当我调整时颜色 ( modColor
) alpha 像素被明亮的颜色填充
这是着色器代码
顶点
uniform mat4 modelViewProjection;
attribute vec4 position;
attribute vec2 texCoord;
uniform vec4 modColor;
varying lowp vec4 vColor;
varying highp vec2 vTexCoord;
void main() {
vColor = modColor;
vTexCoord = texCoord;
gl_Position = modelViewProjection * position;
}
分段
precision highp float;
uniform lowp sampler2D texture;
varying lowp vec4 vColor;
varying highp vec2 vTexCoord;
uniform float shadowAlpha;
void main() {
lowp vec4 bl = texture2D( texture, vTexCoord ) * vec4(0,0,0,1);
lowp vec4 col = vec4(bl.rgb + vColor.rgb, bl.a * vColor.a);
float useAlpha = shadowAlpha * col.a * (1.0 - vTexCoord.y);
gl_FragColor = vec4(col.rgb, useAlpha);
}
解决方案
由于纹理 ( bl.a
) 的 alpha 通道在没有阴影的区域为 0,在有阴影的区域为 1,因此您可以将片段的颜色通道乘以bl.a
:
gl_FragColor = vec4(col.rgb, useAlpha);
gl_FragColor = vec4(col.rgb * bl.a, useAlpha);
推荐阅读
- javascript - 客户端的回调不会从 signalR 后端触发
- mobile - 如何使用 Scrapy 下载网站的移动版本
- cython - 如何将 Cython 扩展类型作为参数传递给 Cython 函数/方法?
- sql-server - 为什么链接到 Access 时视图变为只读?
- mongodb - Hibernate OGM - java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1
- z3 - 如何从可满足的公式中恢复估值,关于模型的问题
- python - 在 python 中使用 winreg 打开注册表项时如何避免权限错误?
- javascript - 如何在Vue的A组件中预加载B组件的图像?
- php - Ajax post 值返回空
- verilog - 系统verilog开关不改变