2026-03-02 00:25:14 +08:00
|
|
|
|
#version 320 es
|
2026-03-02 04:50:28 +08:00
|
|
|
|
precision highp float;
|
2026-03-02 00:25:14 +08:00
|
|
|
|
|
2026-03-02 04:50:28 +08:00
|
|
|
|
// 从顶点着色器输入
|
2026-03-02 00:25:14 +08:00
|
|
|
|
in vec2 vTexCoord;
|
|
|
|
|
|
in vec4 vColor;
|
|
|
|
|
|
|
|
|
|
|
|
// 纹理采样器
|
|
|
|
|
|
uniform sampler2D uTexture;
|
|
|
|
|
|
|
2026-03-02 04:50:28 +08:00
|
|
|
|
// 材质参数
|
|
|
|
|
|
uniform vec4 uTintColor;
|
|
|
|
|
|
uniform float uOpacity;
|
|
|
|
|
|
|
2026-03-02 00:25:14 +08:00
|
|
|
|
// 输出颜色
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
2026-03-02 04:50:28 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 片段着色器入口
|
|
|
|
|
|
*
|
|
|
|
|
|
* 采样纹理并与顶点颜色、色调和透明度混合
|
|
|
|
|
|
*/
|
2026-03-02 00:25:14 +08:00
|
|
|
|
void main() {
|
2026-03-03 02:16:29 +08:00
|
|
|
|
// 采样纹理(如果没有绑定纹理,texture 会返回 vec4(0,0,0,1) 或 vec4(1,1,1,1) 取决于实现)
|
2026-03-02 00:25:14 +08:00
|
|
|
|
vec4 texColor = texture(uTexture, vTexCoord);
|
|
|
|
|
|
|
2026-03-03 02:16:29 +08:00
|
|
|
|
// 如果纹理采样结果是黑色或透明,使用白色作为默认值
|
|
|
|
|
|
// 这样即使在没有纹理的情况下也能显示颜色
|
|
|
|
|
|
if (texColor.rgb == vec3(0.0) || texColor.a < 0.01) {
|
|
|
|
|
|
texColor = vec4(1.0, 1.0, 1.0, 1.0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-02 04:50:28 +08:00
|
|
|
|
// 混合:纹理 * 顶点颜色 * 色调
|
|
|
|
|
|
fragColor = texColor * vColor * uTintColor;
|
|
|
|
|
|
|
|
|
|
|
|
// 应用透明度
|
|
|
|
|
|
fragColor.a *= uOpacity;
|
2026-03-02 00:25:14 +08:00
|
|
|
|
|
2026-03-02 04:50:28 +08:00
|
|
|
|
// Alpha 测试:丢弃几乎透明的像素
|
2026-03-02 00:25:14 +08:00
|
|
|
|
if (fragColor.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|