解耦对MessageBox的依赖,提供单独的Shader初始化函数
This commit is contained in:
@@ -12,7 +12,7 @@ using SpineViewer.Exporter;
|
|||||||
|
|
||||||
namespace SpineViewer
|
namespace SpineViewer
|
||||||
{
|
{
|
||||||
public partial class MainForm : Form
|
internal partial class MainForm : Form
|
||||||
{
|
{
|
||||||
private Logger logger = LogManager.GetCurrentClassLogger();
|
private Logger logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
@@ -29,6 +29,19 @@ namespace SpineViewer
|
|||||||
toolStripMenuItem_ExportMp4.Tag = ExportType.MP4;
|
toolStripMenuItem_ExportMp4.Tag = ExportType.MP4;
|
||||||
toolStripMenuItem_ExportMov.Tag = ExportType.MOV;
|
toolStripMenuItem_ExportMov.Tag = ExportType.MOV;
|
||||||
toolStripMenuItem_ExportWebm.Tag = ExportType.WebM;
|
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>
|
/// <summary>
|
||||||
|
|||||||
@@ -331,7 +331,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
if (vertexArray.VertexCount > 0)
|
if (vertexArray.VertexCount > 0)
|
||||||
{
|
{
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -380,7 +380,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
//clipping.ClipEnd();
|
//clipping.ClipEnd();
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
if (vertexArray.VertexCount > 0)
|
if (vertexArray.VertexCount > 0)
|
||||||
{
|
{
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
clipping.ClipEnd();
|
clipping.ClipEnd();
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
|
|||||||
@@ -262,7 +262,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
{
|
{
|
||||||
// XXX: 实测不用设置 sampler2D 的值也正确
|
// XXX: 实测不用设置 sampler2D 的值也正确
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -312,7 +312,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
clipping.ClipEnd();
|
clipping.ClipEnd();
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
{
|
{
|
||||||
// XXX: 实测不用设置 sampler2D 的值也正确
|
// XXX: 实测不用设置 sampler2D 的值也正确
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -318,7 +318,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
clipping.ClipEnd();
|
clipping.ClipEnd();
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
{
|
{
|
||||||
// XXX: 实测不用设置 sampler2D 的值也正确
|
// XXX: 实测不用设置 sampler2D 的值也正确
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -314,7 +314,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
clipping.ClipEnd();
|
clipping.ClipEnd();
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
{
|
{
|
||||||
// XXX: 实测不用设置 sampler2D 的值也正确
|
// XXX: 实测不用设置 sampler2D 的值也正确
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -314,7 +314,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
clipping.ClipEnd();
|
clipping.ClipEnd();
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
{
|
{
|
||||||
// XXX: 实测不用设置 sampler2D 的值也正确
|
// XXX: 实测不用设置 sampler2D 的值也正确
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
@@ -314,7 +314,7 @@ namespace SpineViewer.Spine.Implementations.Spine
|
|||||||
clipping.ClipEnd();
|
clipping.ClipEnd();
|
||||||
|
|
||||||
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
if (UsePremultipliedAlpha && (states.BlendMode == BlendModeSFML.Normal || states.BlendMode == BlendModeSFML.Additive))
|
||||||
states.Shader = FragmentShader;
|
states.Shader = Shader.FragmentShader;
|
||||||
else
|
else
|
||||||
states.Shader = null;
|
states.Shader = null;
|
||||||
|
|
||||||
|
|||||||
35
SpineViewer/Spine/Shader.cs
Normal file
35
SpineViewer/Spine/Shader.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -48,41 +48,6 @@ namespace SpineViewer.Spine
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const float SCALE_MIN = 0.001f;
|
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>
|
||||||
/// 尝试检测骨骼文件版本
|
/// 尝试检测骨骼文件版本
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user