add some defaults to make text render setup easier
parent
52e7384e45
commit
6cb1498e26
|
@ -33,5 +33,11 @@
|
||||||
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\video_yuv2rgba.frag.refresh">
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\video_yuv2rgba.frag.refresh">
|
||||||
<LogicalName>MoonWorks.Graphics.StockShaders.VideoYUV2RGBA.frag.refresh</LogicalName>
|
<LogicalName>MoonWorks.Graphics.StockShaders.VideoYUV2RGBA.frag.refresh</LogicalName>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\text_transform.vert.refresh">
|
||||||
|
<LogicalName>MoonWorks.Graphics.StockShaders.TextTransform.vert.refresh</LogicalName>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\text_msdf.frag.refresh">
|
||||||
|
<LogicalName>MoonWorks.Graphics.StockShaders.TextMSDF.frag.refresh</LogicalName>
|
||||||
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -4,10 +4,17 @@ using MoonWorks.Math.Float;
|
||||||
namespace MoonWorks.Graphics.Font
|
namespace MoonWorks.Graphics.Font
|
||||||
{
|
{
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct Vertex
|
public struct Vertex : IVertexType
|
||||||
{
|
{
|
||||||
public Vector3 Position;
|
public Vector3 Position;
|
||||||
public Vector2 TexCoord;
|
public Vector2 TexCoord;
|
||||||
public Color Color;
|
public Color Color;
|
||||||
|
|
||||||
|
public static VertexElementFormat[] Formats { get; } = new VertexElementFormat[]
|
||||||
|
{
|
||||||
|
VertexElementFormat.Vector3,
|
||||||
|
VertexElementFormat.Vector2,
|
||||||
|
VertexElementFormat.Color
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,24 @@ namespace MoonWorks.Graphics.Font
|
||||||
PrimitiveCount = vertexCount / 2; // FIXME: is this jank?
|
PrimitiveCount = vertexCount / 2; // FIXME: is this jank?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call this AFTER binding your text pipeline!
|
||||||
|
public void Render(CommandBuffer commandBuffer, Math.Float.Matrix4x4 transformMatrix)
|
||||||
|
{
|
||||||
|
commandBuffer.BindFragmentSamplers(new TextureSamplerBinding(
|
||||||
|
CurrentFont.Texture,
|
||||||
|
GraphicsDevice.LinearSampler
|
||||||
|
));
|
||||||
|
commandBuffer.BindVertexBuffers(VertexBuffer);
|
||||||
|
commandBuffer.BindIndexBuffer(IndexBuffer, IndexElementSize.ThirtyTwo);
|
||||||
|
commandBuffer.DrawIndexedPrimitives(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
PrimitiveCount,
|
||||||
|
commandBuffer.PushVertexShaderUniforms(transformMatrix),
|
||||||
|
commandBuffer.PushFragmentShaderUniforms(CurrentFont.DistanceRange)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool disposing)
|
protected override void Dispose(bool disposing)
|
||||||
{
|
{
|
||||||
if (!IsDisposed)
|
if (!IsDisposed)
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using MoonWorks.Video;
|
using MoonWorks.Video;
|
||||||
using RefreshCS;
|
using RefreshCS;
|
||||||
|
using WellspringCS;
|
||||||
|
|
||||||
namespace MoonWorks.Graphics
|
namespace MoonWorks.Graphics
|
||||||
{
|
{
|
||||||
|
@ -21,6 +22,15 @@ namespace MoonWorks.Graphics
|
||||||
// Built-in video pipeline
|
// Built-in video pipeline
|
||||||
internal GraphicsPipeline VideoPipeline { get; }
|
internal GraphicsPipeline VideoPipeline { get; }
|
||||||
|
|
||||||
|
// Built-in text shader info
|
||||||
|
public GraphicsShaderInfo TextVertexShaderInfo { get; }
|
||||||
|
public GraphicsShaderInfo TextFragmentShaderInfo { get; }
|
||||||
|
public VertexInputState TextVertexInputState { get; }
|
||||||
|
|
||||||
|
// Built-in samplers
|
||||||
|
public Sampler PointSampler { get; }
|
||||||
|
public Sampler LinearSampler { get; }
|
||||||
|
|
||||||
public bool IsDisposed { get; private set; }
|
public bool IsDisposed { get; private set; }
|
||||||
|
|
||||||
private readonly HashSet<GCHandle> resources = new HashSet<GCHandle>();
|
private readonly HashSet<GCHandle> resources = new HashSet<GCHandle>();
|
||||||
|
@ -41,14 +51,23 @@ namespace MoonWorks.Graphics
|
||||||
Conversions.BoolToByte(debugMode)
|
Conversions.BoolToByte(debugMode)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Check for optional video shaders
|
// TODO: check for CreateDevice fail
|
||||||
|
|
||||||
|
// Check for replacement stock shaders
|
||||||
string basePath = System.AppContext.BaseDirectory;
|
string basePath = System.AppContext.BaseDirectory;
|
||||||
|
|
||||||
string videoVertPath = Path.Combine(basePath, "video_fullscreen.vert.refresh");
|
string videoVertPath = Path.Combine(basePath, "video_fullscreen.vert.refresh");
|
||||||
string videoFragPath = Path.Combine(basePath, "video_yuv2rgba.frag.refresh");
|
string videoFragPath = Path.Combine(basePath, "video_yuv2rgba.frag.refresh");
|
||||||
|
|
||||||
|
string textVertPath = Path.Combine(basePath, "text_transform.vert.refresh");
|
||||||
|
string textFragPath = Path.Combine(basePath, "text_msdf.frag.refresh");
|
||||||
|
|
||||||
ShaderModule videoVertShader;
|
ShaderModule videoVertShader;
|
||||||
ShaderModule videoFragShader;
|
ShaderModule videoFragShader;
|
||||||
|
|
||||||
|
ShaderModule textVertShader;
|
||||||
|
ShaderModule textFragShader;
|
||||||
|
|
||||||
if (File.Exists(videoVertPath) && File.Exists(videoFragPath))
|
if (File.Exists(videoVertPath) && File.Exists(videoFragPath))
|
||||||
{
|
{
|
||||||
videoVertShader = new ShaderModule(this, videoVertPath);
|
videoVertShader = new ShaderModule(this, videoVertPath);
|
||||||
|
@ -66,6 +85,23 @@ namespace MoonWorks.Graphics
|
||||||
videoFragShader = new ShaderModule(this, fragStream);
|
videoFragShader = new ShaderModule(this, fragStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (File.Exists(textVertPath) && File.Exists(textFragPath))
|
||||||
|
{
|
||||||
|
textVertShader = new ShaderModule(this, textVertPath);
|
||||||
|
textFragShader = new ShaderModule(this, textFragPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// use defaults
|
||||||
|
var assembly = typeof(GraphicsDevice).Assembly;
|
||||||
|
|
||||||
|
using var vertStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.TextTransform.vert.refresh");
|
||||||
|
using var fragStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.TextMSDF.frag.refresh");
|
||||||
|
|
||||||
|
textVertShader = new ShaderModule(this, vertStream);
|
||||||
|
textFragShader = new ShaderModule(this, fragStream);
|
||||||
|
}
|
||||||
|
|
||||||
VideoPipeline = new GraphicsPipeline(
|
VideoPipeline = new GraphicsPipeline(
|
||||||
this,
|
this,
|
||||||
new GraphicsPipelineCreateInfo
|
new GraphicsPipelineCreateInfo
|
||||||
|
@ -94,6 +130,13 @@ namespace MoonWorks.Graphics
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TextVertexShaderInfo = GraphicsShaderInfo.Create<Math.Float.Matrix4x4>(textVertShader, "main", 0);
|
||||||
|
TextFragmentShaderInfo = GraphicsShaderInfo.Create<float>(textFragShader, "main", 1);
|
||||||
|
TextVertexInputState = VertexInputState.CreateSingleBinding<Font.Vertex>();
|
||||||
|
|
||||||
|
PointSampler = new Sampler(this, SamplerCreateInfo.PointClamp);
|
||||||
|
LinearSampler = new Sampler(this, SamplerCreateInfo.LinearClamp);
|
||||||
|
|
||||||
FencePool = new FencePool(this);
|
FencePool = new FencePool(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,34 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(set = 1, binding = 0) uniform sampler2D msdf;
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 inTexCoord;
|
||||||
|
layout(location = 1) in vec4 inColor;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
layout(binding = 0, set = 3) uniform UBO
|
||||||
|
{
|
||||||
|
float pxRange;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
float median(float r, float g, float b)
|
||||||
|
{
|
||||||
|
return max(min(r, g), min(max(r, g), b));
|
||||||
|
}
|
||||||
|
|
||||||
|
float screenPxRange()
|
||||||
|
{
|
||||||
|
vec2 unitRange = vec2(ubo.pxRange)/vec2(textureSize(msdf, 0));
|
||||||
|
vec2 screenTexSize = vec2(1.0)/fwidth(inTexCoord);
|
||||||
|
return max(0.5*dot(unitRange, screenTexSize), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec3 msd = texture(msdf, inTexCoord).rgb;
|
||||||
|
float sd = median(msd.r, msd.g, msd.b);
|
||||||
|
float screenPxDistance = screenPxRange() * (sd - 0.5);
|
||||||
|
float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0);
|
||||||
|
outColor = mix(vec4(0.0, 0.0, 0.0, 0.0), inColor, opacity);
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 inPos;
|
||||||
|
layout(location = 1) in vec2 inTexCoord;
|
||||||
|
layout(location = 2) in vec4 inColor;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 outTexCoord;
|
||||||
|
layout(location = 1) out vec4 outColor;
|
||||||
|
|
||||||
|
layout(binding = 0, set = 2) uniform UBO
|
||||||
|
{
|
||||||
|
mat4 ViewProjection;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = ubo.ViewProjection * vec4(inPos, 1.0);
|
||||||
|
outTexCoord = inTexCoord;
|
||||||
|
outColor = inColor;
|
||||||
|
}
|
|
@ -37,10 +37,6 @@ namespace MoonWorks.Video
|
||||||
public VideoPlayer(GraphicsDevice device) : base(device)
|
public VideoPlayer(GraphicsDevice device) : base(device)
|
||||||
{
|
{
|
||||||
GraphicsDevice = device;
|
GraphicsDevice = device;
|
||||||
if (GraphicsDevice.VideoPipeline == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Missing video shaders!");
|
|
||||||
}
|
|
||||||
|
|
||||||
LinearSampler = new Sampler(device, SamplerCreateInfo.LinearClamp);
|
LinearSampler = new Sampler(device, SamplerCreateInfo.LinearClamp);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue