解耦对MessageBox的依赖,提供单独的Shader初始化函数

This commit is contained in:
ww-rm
2025-03-29 16:51:05 +08:00
parent 1b7b0dcb13
commit 9a97e84296
10 changed files with 63 additions and 50 deletions

View File

@@ -12,7 +12,7 @@ using SpineViewer.Exporter;
namespace SpineViewer
{
public partial class MainForm : Form
internal partial class MainForm : Form
{
private Logger logger = LogManager.GetCurrentClassLogger();
@@ -29,6 +29,19 @@ namespace SpineViewer
toolStripMenuItem_ExportMp4.Tag = ExportType.MP4;
toolStripMenuItem_ExportMov.Tag = ExportType.MOV;
toolStripMenuItem_ExportWebm.Tag = ExportType.WebM;
// 执行一些初始化工作
try
{
Spine.Shader.Init();
}
catch (Exception ex)
{
logger.Error(ex.ToString());
logger.Error("Failed to load fragment shader");
MessageBox.Warn("Fragment shader 加载失败预乘Alpha通道属性失效");
}
}
/// <summary>

View File

@@ -331,7 +331,7 @@ namespace SpineViewer.Spine.Implementations.Spine
if (vertexArray.VertexCount > 0)
{
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -380,7 +380,7 @@ namespace SpineViewer.Spine.Implementations.Spine
}
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
//clipping.ClipEnd();

View File

@@ -288,7 +288,7 @@ namespace SpineViewer.Spine.Implementations.Spine
if (vertexArray.VertexCount > 0)
{
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -338,7 +338,7 @@ namespace SpineViewer.Spine.Implementations.Spine
clipping.ClipEnd();
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;

View File

@@ -262,7 +262,7 @@ namespace SpineViewer.Spine.Implementations.Spine
{
// XXX: 实测不用设置 sampler2D 的值也正确
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -312,7 +312,7 @@ namespace SpineViewer.Spine.Implementations.Spine
clipping.ClipEnd();
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;

View File

@@ -268,7 +268,7 @@ namespace SpineViewer.Spine.Implementations.Spine
{
// XXX: 实测不用设置 sampler2D 的值也正确
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -318,7 +318,7 @@ namespace SpineViewer.Spine.Implementations.Spine
clipping.ClipEnd();
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;

View File

@@ -264,7 +264,7 @@ namespace SpineViewer.Spine.Implementations.Spine
{
// XXX: 实测不用设置 sampler2D 的值也正确
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -314,7 +314,7 @@ namespace SpineViewer.Spine.Implementations.Spine
clipping.ClipEnd();
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;

View File

@@ -264,7 +264,7 @@ namespace SpineViewer.Spine.Implementations.Spine
{
// XXX: 实测不用设置 sampler2D 的值也正确
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -314,7 +314,7 @@ namespace SpineViewer.Spine.Implementations.Spine
clipping.ClipEnd();
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;

View File

@@ -264,7 +264,7 @@ namespace SpineViewer.Spine.Implementations.Spine
{
// XXX: 实测不用设置 sampler2D 的值也正确
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;
@@ -314,7 +314,7 @@ namespace SpineViewer.Spine.Implementations.Spine
clipping.ClipEnd();
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
states.Shader = FragmentShader;
states.Shader = Shader.FragmentShader;
else
states.Shader = null;

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SpineViewer.Spine
{
public static class Shader
{
/// <summary>
/// 用于解决 PMA 和渐变动画问题的片段着色器
/// </summary>
private const string FRAGMENT_SHADER = (
"uniform sampler2D t;" +
"void main() { vec4 p = texture2D(t, gl_TexCoord[0].xy);" +
"if (p.a > 0) p.rgb /= max(max(max(p.r, p.g), p.b), p.a);" +
"gl_FragColor = gl_Color * p; }"
);
/// <summary>
/// 针对预乘 Alpha 通道的片段着色器
/// </summary>
public static SFML.Graphics.Shader? FragmentShader { get; private set; }
/// <summary>
/// 加载 Shader, 可能会存在异常导致着色器加载失败
/// </summary>
/// <exception cref="SFML.LoadingFailedException"></exception>
public static void Init()
{
FragmentShader = SFML.Graphics.Shader.FromString(null, null, FRAGMENT_SHADER);
}
}
}

View File

@@ -48,41 +48,6 @@ namespace SpineViewer.Spine
/// </summary>
public const float SCALE_MIN = 0.001f;
/// <summary>
/// 用于解决 PMA 和渐变动画问题的片段着色器
/// </summary>
private const string FRAGMENT_SHADER = (
"uniform sampler2D t;" +
"void main() { vec4 p = texture2D(t, gl_TexCoord[0].xy);" +
"if (p.a > 0) p.rgb /= max(max(max(p.r, p.g), p.b), p.a);" +
"gl_FragColor = gl_Color * p; }"
);
/// <summary>
/// 用于解决 PMA 和渐变动画问题的片段着色器
/// </summary>
protected static readonly SFML.Graphics.Shader? FragmentShader = null;
/// <summary>
/// 静态构造函数
/// </summary>
static Spine()
{
// 加载 FragmentShader
try
{
FragmentShader = SFML.Graphics.Shader.FromString(null, null, FRAGMENT_SHADER);
}
catch (Exception ex)
{
FragmentShader = null;
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Error(ex.ToString());
logger.Error("Failed to load fragment shader");
MessageBox.Warn("Fragment shader 加载失败预乘Alpha通道属性失效"); // TODO: 去除对窗体的调用
}
}
/// <summary>
/// 尝试检测骨骼文件版本
/// </summary>