added font rendering

This commit is contained in:
2026-05-25 01:35:19 +03:00
parent a9766d6dd6
commit f127ac3801
27 changed files with 657 additions and 43 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
12 8 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -0,0 +1,85 @@
#include "macros.hlsl"
COMMON {
struct PS_INPUT
{
float4 m_vPosition: SV_POSITION;
float2 m_vUV: TEXCOORD0;
uint m_uFont;
}
struct TextDrawData_t
{
float2 m_vTexcoordOffset;
float2 m_vTexcoordSize;
float2 m_vPos;
float2 m_vSize;
float4 m_vFGColor;
float4 m_vBGColor;
}
StructuredBuffer<TextDrawData_t> g_textData: register( t0 );
cbuffer ScreenData_t: register( b1 )
{
float2 g_vScreenSize;
}
Texture2D<float4> g_atlas: register( t2 );
SamplerState g_atlasSampler: register(s3);
}
VS
{
struct VS_INPUT
{
float2 m_vPosition: POSITION;
}
PS_INPUT vsMain( VS_INPUT input, uint uInstance: SV_InstanceID, uint uBaseInstance: SV_StartInstanceLocation )
{
uint uInstance = uBaseInstance + uInstance;
float2 position = input.m_vPosition;
position*=g_textData[uInstance].m_vSize;
position+=g_textData[uInstance].m_vPos;
position/=g_vScreenSize;
position.y = 1-position.y;
position*=2;
position-=1;
float2 uv = input.m_vPosition;
uv.y = 1-uv.y;
uv*=g_textData[uInstance].m_vTexcoordSize;
uv+=g_textData[uInstance].m_vTexcoordOffset;
PS_INPUT output = {};
output.m_vPosition = float4(position, 0, 1);
output.m_vUV = uv;
return output;
}
}
PS
{
struct PS_OUTPUT
{
float4 m_vAlbedo: SV_Target0;
}
float ScreenPixelRange( float2 uv )
{
uint uWidth, uHeight;
g_atlas.GetDimensions(uWidth, uHeight);
float2 vUnitRange = 2.0/float2(uWidth, uHeight);
float2 vScreenTexSize = 1.0/fwidth(uv);
return max(0.5*dot(vUnitRange, vScreenTexSize), 1);
}
PS_OUTPUT psMain( PS_INPUT input )
{
PS_OUTPUT output = {};
float4 vMsd = g_atlas.Sample(g_atlasSampler, input.m_vUV.xy);
float fSd = median3(vMsd.x, vMsd.y, vMsd.z);
float fScreenPixelDistance = ScreenPixelRange(input.m_vUV)*(fSd-0.5);
float fOpacity = clamp(fScreenPixelDistance+0.5, 0.0, 1.0);
output.m_vAlbedo = fOpacity;
return output;
}
}

View File

@@ -90,8 +90,7 @@ PS
if ( data.m_material.m_uAlbedo != -1 )
{
output.m_vAlbedo = g_textures[data.m_material.m_uAlbedo]
.Sample(g_textureSampler, input.m_vTexCoord.xy)
* data.m_material.m_vAlbedoColor;
.Sample(g_textureSampler, input.m_vTexCoord.xy);
}
else
{